AWS Lambda
開発者ガイド

AWS X-Ray を使用する

典型的な Lambda ベースのアプリケーションは、Amazon S3 へのオブジェクトのアップロード、Amazon SNS 通知、および API アクションなどのイベントによってトリガーされる 1 つ以上の関数で構成されます。これらの関数がトリガーされると、通常の場合、DynamoDB テーブルや Amazon S3 バケットなどのダウンストリームリソースを呼び出すか、または API コールを実行します。AWS Lambda は Amazon CloudWatch を利用して、関数のすべての呼び出しで自動的にメトリクスとログを出力します。ただし、Lambda 関数を呼び出したイベントソースをトレースしたり、関数が実行したダウンストリーム呼び出しをトレースするには、このメカニズムがない方が便利な場合もあります。トレースがどのように機能するかについての完全な概要については、「AWS X-Ray」を参照してください。

環境変数を使用した AWS X-Ray との通信

AWS Lambda は、X-Ray デーモンとの通信を容易にするために環境変数を使用して、X-Ray SDK を設定します。

  • _X_AMZN_TRACE_ID: サンプリングデシジョン、トレース ID および親セグメント ID が含まれるトレースヘッダーが含まれます。(これらのプロパティの詳細については、トレースヘッダーを参照してください。) 関数が呼び出されたときに Lambda がトレースヘッダーを受信すると、ヘッダーは _X_AMZN_TRACE_ID 環境変数の入力に使用されます。トレースヘッダーが受信されない場合、Lambda がそれを生成します。

  • AWS_XRAY_CONTEXT_MISSING: X-Ray SDK はこの変数を使用して、関数が X-Ray データを記録しようとしたがトレーシングヘッダーを使用できない場合の動作を決定します。Lambda はデフォルトでこの値を LOG_ERROR に設定します。

  • AWS_XRAY_DAEMON_ADDRESS: この環境変数は、X-Ray デーモンのアドレスを IP_ADDRESS:PORT 形式で表示します。X-Ray デーモンのアドレスを使用して、X-Ray SDK を使用せず X-Ray デーモンにトレースデータを直接送信できます。

AWS X-Ray コンソールでの Lambda トレース: 例

以下に、2 つの異なる Lambda 関数の Lambda トレースを示します。各トレースで、異なる呼び出しタイプ (同期と非同期) のトレース構造を説明します。

  • 非同期 – 以下は、正常呼び出し 1 回および DynamoDB へのダウンストリーム呼び出し 1 回を行う非同期 Lambda リクエストの例です。

    Lambda サービスセグメントは応答時間をカプセル化します。応答時間とは、クライアントにレスポンス (例: 202) を返すまでにかかった時間です。これには、Lambda サービスキューで経過した時間 (ドウェル時間) および各呼び出し試行のサブセグメントが含まれます。(前述の例では呼び出し試行は 1 つのみ表示されています。) サービスセグメント内の各試行サブセグメントには、対応するユーザー関数セグメントがあります。この例では、ユーザー関数セグメントには 2 つのサブセグメントがあります。ハンドラ前に実行される関数の初期化コードを表す初期化サブセグメントと、DynamoDB への ListTables 呼び出しを表すダウンストリーム呼び出しサブセグメントです。

    各呼び出しセグメントおよび各ダウンストリーム呼び出しごとにステータスコードおよびエラーメッセージが表示されます。

  • 同期 – 以下に Amazon S3 へのダウンストリーム呼び出し 1 回を行う同期リクエストの例を示します。

    Lambda サービスセグメントはリクエストが Lambda サービスで経過した時間全体をキャプチャします。サービスセグメントには、対応するユーザー関数セグメントがあります。この例では、ユーザー関数セグメントに関数の初期化コード (ハンドラ前に実行されるコード) を表すサブセグメントおよび Amazon S3 への PutObject 呼び出しを表すサブセグメントが含まれます。

注記

HTTP 呼び出しをトレースする場合は、HTTP クライアントを使用する必要があります。詳細については、「X-Ray SDK for Java を使用してダウンストリーム HTTP ウェブサービスの呼び出しをトレースする」または「X-Ray SDK for Node.js を使用してダウンストリーム HTTP ウェブサービスの呼び出しをトレースする」を参照してください。