AWS Lambda でパフォーマンスチューニングの為に AWS X-Ray を手軽に使ってみよう

はじめに

システムを構築していると、パフォーマンスチューニングの必要な状況に直面することはかなり多いと思います。ただ、パフォーマンスチューニングを行うにはどの処理で何秒かかっているのかを測定して、ボトルネックとなっている箇所を特定しなければなりません。 そんな際に X-Ray をお手軽に使ってみませんか? というご提案です。

お手軽設定

AWS X-Ray には、いろいろと機能がありますが、AWSのベストプラクティスにもあるように まずはスモールスタートで開始することにします。 Lambda 好きの私としては Lamba関数 のパフォーマンスチューニングのネタとして計測に使いたいのでLambda関数内の処理の時間計測で使用したいと思います。

ライブラリのインポート

Python の環境へのインストールは  pip install aws-xray-sdk で行います。 AWS Serverless Application Model (AWS SAM) などを利用して構築している場合には、 requirements.txt の中に aws-xray-sdk を追加します。 AWS X-Ray requirement.txt に追記 ソースコード側では、こんな感じで xray_recoreder や patch_all を aws_xray_sdk.core から import します。 X-Ray定義 参考:  AWS X-Ray – 開発者ガイド – AWS X-Ray SDK for Python
AWS X-Ray SDK for Python - AWS X-Ray
X-Ray SDK for Python を使用して Python アプリケーションを計測します。
aws-xray-sdk-python /README.md
aws-xray-sdk-python/README.md at master · aws/aws-xray-sdk-python
AWS X-Ray SDK for the Python programming language. Contribute to aws/aws-xray-sdk-python development by creating an acco...

サブセグメントの作成

Lambda関数の場合は、セグメントの定義を抜かして、いきなり subsegment から書けます。どうやら親となる segment は Lambda の Trace を ON にしたときからAWS側で作ってくれているようです。 下のように、ソースコードの計測したい箇所の前後を xray_recorder.begin_subsegmentxray_recorder.end_subsegment サブセグメントとして定義することで、そのサブセグメント内にかかる時間を測定します。 Lambda で X-Ray subsegment
ちなみに Lambda 関数内でセグメントの開始を定義( xray_recorder.begin_segment())すると WARNING メッセージが出ますが、WARNINGなので処理は継続します。 Stack overflow – AWS Xray: Cannot create segments inside Lambda function and segment not found
AWS Xray: Cannot create segments inside Lambda function and segment not found
A really strange behaviour I was experiencing, I am following online documentation and while creating a segment to work ...

測定結果確認

Management Console で CloudWatch > 左のメニューの X-Ray トレース > トランザクション検索  から、結果を検索します。 Filter spans by: の下の空欄を選択すると候補がズラッと表示されるので、 attributes.aws.lambda.name を選んで = を選択、右側の空白に自分のLambda関数名を入力してクエリ実行ボタンを押します。スパンの下に traceId の一覧が出るのでそこをクリックします。 (正直ここにたどり着くまで迷いました) AWS X-Ray Trace の検索 2024/12/18 時点でこのBlogを作成している最中に Management Console のレイアウトが変わっていました… X-Ray トレースの下から、 Application Signals の下に移ったようです。 (レイアウトが変更されてまた迷いました…) AWS X-Ray Lambda関数のTraceの探し方 ここから、サービスマップのイケてる図や AWS X-Ray Trace Service Map 本命のトレース詳細が出ます。こんなわかりやすくてかっこいい図を出してくれるんですよ! AWS X-Ray Trace 詳細 これを見てみると、先程ソースコードで囲ったサブセグメントに 284ms かかったことがわかります。 AWS X-Ray Trace 詳細サブセグメント これで、これらの分析を利用してパフォーマンスのボトルネックになっている箇所を特定できるようになりました。 X-Ray なしでボトルネックを分析しようとすると、ひたすら CloudWatch などのログから解析という大変な状況から比べると、とても楽に分析できるようなったと感じます。

おわりに

いかがでしたでしょうか。X-Ray をよくわからないからとか、面倒そうだとかの理由で触らないのはもったいなく感じてきたのではないでしょうか。あなたも是非、今日から X-Ray でパフォーマンス分析を!
タイトルとURLをコピーしました