今回は、最近発表されたAWS X-Ray の次の新機能を試してみます。
従来までどうだったか、この新機能により何ができるようになったか、というのを簡単に図にまとめてみました。
Amazon SQS にメッセージが送信され、その後 AWS Lambda 関数により取り出される処理についてもトレースを取得できるようになったわけですね。
この機能は自動的に適用されるので、使用している Amazon SQS の Queue や AWS Lambda 関数について追加の設定は不要です。
あくまで例ですが、次のような AWS SAM テンプレートから作成すれば、この機能を試すことができます。
上記の SAM テンプレートでは、Amazon SQS の Queue にメッセージを送信する AWS Lambda 関数と、受信する AWS Lambda 関数がリソースとして定義されています。
Globalsセクションで、それぞれの AWS Lambda 関数のプロパティに対して、Tracing: Active
を設定し、AWS X-Ray のトレースを取得するようにしています。
Globals: Function: Timeout: 15 Environment: Variables: SQS_QUEUE: !Ref SQSQUEUE DDB_TABLE: !Ref DDBTABLE Tracing: Active
同じく Globals セクションで、Amazon API Gateway にも AWS X-Rayのトレースを取得するようにしています。
Api: TracingEnabled: True
またこのテンプレートでは、Amazon SQS の Queue にメッセージを送信する AWS Lambda 関数 は Python で作成しています。
この AWS Lambda 関数の中で下記のコードを適用して AWS Lambda 関数から他の AWS サービスにアクセスする処理のトレースも取得しています。
from aws_xray_sdk.core import patch patch(['boto3'])
これらをみると、特に何も新しい設定やコードの追加などは行っていませんね。
では、この SAM テンプレートからスタックを作成します。テンプレートの中の Parameters セクションで、S3 バケット名は任意の値に変更して下さい。
SAMのリソース全体は、次から参照できます。samconfig.toml の内容も環境に応じて変更して下さい。
この SAM テンプレートで作成するアプリは、作成した S3 バケットにあらかじめ何かテキストファイルを入れてから実行する前提になっているので、適当なテキストファイルを S3 バケットに入れておきましょう。
その後、Amazon API Gateway に対して API リクエストを送ってみます。
curl -X POST \ https://(API Gateway のURL)/Prod/xray \ -d '{"bucket": "(バケット名)", "key": "(テキストファイル名)"}'
その後、AWS マネジメントコンソールで Amazon CloudWatch のコンソールを開き、左側のナビゲーションメニューから X-Ray トレース の下の サービスマップ を選択します。
次のようなマップが表示されます。赤枠の部分が新機能により表示されるようになったものです。
Amazon SQS の Queue の後にも、そのメッセージを受信している AWS Lambda 関数の情報が表示されていますね。
次に左側のナビゲーションメニューから X-Ray トレース の下の トレース を選択し、ページ下側にある トレース セクションの中の ID のリンクを選択します。
次のようなトレースマップが表示されます。赤枠の部分が新機能により表示されるようになったものです。
ページ下側に表示されるセグメントのタイムラインでは、次のような情報が参照できます。赤枠の部分が新機能により表示されるようになったものです。
このように、Amazon SQS の Queue が介在する場合でも、一気通貫的なトレースを参照できるようになったので、Queue からメッセージを受信している AWS Lambda 関数をすぐに把握できてトレース分析ができるようになりました。個人的には、これはとてもありがたいことだと感動しています!