あるチームがX-Rayを使ってマルチサービスアーキテクチャをトレースしている。あるリクエストのX-Rayトレースを確認すると、API Gateway → Lambda → SNS → Lambda2 というフローのはずが、Lambda2のトレースがSNSトリガーのトレースと別のトレースIDになっており、サービスマップ上でつながっていない。原因として最も可能性が高いのはどれか。
- A. Lambda2のIAMロールにX-Rayへの書き込み権限がない
- B. SNS → Lambda2のサブスクリプションがHTTPSではなくLambdaプロトコルを使っているためコンテキストが失われる
- C. Lambda2のX-Ray有効化設定が無効になっている
- D. SNSはX-Rayトレースコンテキストの伝播をサポートしていないため、Lambda2は新しいトレースを開始する
解答と解説を見る
正解: D
X-Rayのトレースコンテキスト伝播はサービスによってサポート状況が異なる。AmazonSNSはX-RayのトレースヘッダーをLambdaのリクエストに伝播する機能を持っているが、SNSを経由した非同期呼び出しでは「X-Amzn-Trace-Id」ヘッダーが伝播される。ただし実際の環境では、SNSトピックのサブスクリプションがLambdaの場合にトレースが断絶するケースがある(選択肢D)。SNSが非同期でLambdaを呼び出す際、呼び出し元のトレースコンテキストが必ずしも引き継がれない設計上の制約がある。この問題を解決するにはLambda2のコード内でX-Ray SDKを使い、SNSメッセージのメタデータに埋め込まれたトレースIDを明示的に読み取って継続するか、SNSメッセージの属性にトレースIDを含めてLambda2側で参照する。選択肢CのActive Tracing無効であればLambda2自体のトレースが全く取れないはずで別トレースIDで存在はしない。選択肢AのIAM権限不足はトレースの書き込みエラーであり、別トレースIDでの記録は起きない。選択肢Bはプロトコルの違いとトレース伝播は無関係。
📚 関連サービスの解説: Amazon SNS ・ AWS X-Ray