AWS X-Ray で AWS Lambda を使用する - AWS Lambda

AWS X-Ray で AWS Lambda を使用する

AWS X-Ray を使用して、アプリケーションのコンポーネントの視覚化、パフォーマンスのボトルネックの特定、およびエラーの原因となったリクエストのトラブルシューティングを行うことができます。Lambda 関数はトレースデータを X-Ray に送信し、X-Ray はデータを処理してサービスマップと検索可能なトレースサマリーを生成します。

関数を呼び出すサービスで X-Ray のトレースを有効にすると、トレースは Lambda から自動的に X-Ray に送信されます。Amazon API Gateway などのアップストリームサービスや、X-Ray SDK でインストルメントされた Amazon EC2 でホストされているアプリケーションは、着信リクエストをサンプリングし、トレースを送信するかどうかを Lambda に指示するトレースヘッダーを追加します。

トレースヘッダーがないリクエストをトレースするには、関数の設定でアクティブトレースを有効にします。

アクティブトレースを有効にするには

  1. Lambda コンソールで [Functions (関数)] ページを開きます。

  2. 関数を選択します。

  3. [Configuration] (設定)、[Monitoring tools] (モニタリングツール) の順に選択します。

  4. [Edit] を選択します。

  5. [X-Ray] で、[Active tracing] (アクティブトレース) を有効にします。

  6. [Save] を選択します。

Pricing

X-Ray では、無期限の無料利用枠をご利用いただけます。無料利用枠の限度を超えると、X-Ray ではトレースのストレージと取得に対する料金が発生します。詳細については、「AWS X-Ray 料金表」を参照してください。

関数には、トレースデータを X-Ray にアップロードするためのアクセス許可が必要です。Lambda コンソールでアクティブトレースを有効にすると、Lambda によって関数の実行ロールに必要なアクセス許可が追加されます。それ以外の場合は、AWSXRayDaemonWriteAccess ポリシーを実行ロールに追加します。

X-Ray はサンプリングアルゴリズムを適用することで、トレースを効率的にしつつ、アプリケーションが処理するリクエストの代表的なサンプルを提供できるようにします。デフォルトのサンプリングルールは 1 秒あたり 1 回のリクエストおよび追加リクエストの 5 パーセントです。このサンプリングレートは、Lambda 関数で設定することはできません。

X-Ray では、トレースは 1 つ以上のサービスによって処理されるリクエストに関する情報を記録します。サービスは、サブセグメントのレイヤーを含むセグメントを記録します。Lambda は、Lambda サービスのセグメントと、関数によって行われた作業用のセグメントを記録します。関数セグメントには InitializationInvocation および Overhead のサブセグメントが含まれます。詳細については、 Lambda 実行環境のライフサイクルを参照してください。

Initialization サブセグメントは、Lambda 実行環境ライフサイクルの初期フェーズを表します。このフェーズ中、Lambda は、設定したリソースを使用して実行環境を作成またはフリーズ解除し、関数コードとすべてのレイヤーをダウンロードして、拡張機能とランタイムの初期化、関数の初期化コードを実行します。

Invocation サブセグメントは呼び出しフェーズを現し、Lambda は関数ハンドラーを呼び出します。これはランタイムと拡張機能の登録から始まり、ランタイムが応答を送信する準備ができたら完了します。

Overhead サブセグメントは、ランタイムが応答を送信してから、次の呼び出しのシグナルを送信するまでの間に発生するフェーズを表します。この間、ランタイムは呼び出しに関連するすべてのタスクを終了し、サンドボックスをフリーズする準備をします。

注記

Lambda 関数がプロビジョニングされた同時実行である場合、X-Ray トレースは、非常に長い期間、関数の初期化を表示することがあります。

プロビジョニングされた同時実行は、関数インスタンスを事前に初期化して、呼び出し時の遅延を減らします。時間が経つにつれて、プロビジョニングされた同時実行は、新しいインスタンスを作成して古いインスタンスから置き換えることで、これらのインスタンスを更新します。トラフィックが安定しているワークロードの場合、新しいインスタンスは最初の呼び出しの前に、十分に初期化されます。時間のずれは、初期化の継続時間として X-Ray トレースに記録されます。

重要

Lambda では、X-Ray SDK を使用して、ダウンストリーム呼び出し、注釈、およびメタデータ用の追加のサブセグメントで、Invocation サブセグメントを拡張できます。関数セグメントに直接アクセスしたり、ハンドラーの呼び出しスコープの外で行われた作業を記録したりすることはできません。

Lambda のトレースに関する各言語での概要については、次のトピックを参照してください。

アクティブなインストルメンテーションをサポートするサービスの詳細なリストについては、AWS X-Ray デベロッパーガイドの Supported AWS services を参照してください。

実行ロールのアクセス許可

Lambda には、トレースデータを X-Ray に送信するために次のアクセス許可が必要です。これを関数の実行ロールに追加します。

これらのアクセス許可は、AWSXRayDaemonWriteAccess 管理ポリシーに含まれています。

AWS X-Ray デーモン

トレースデータを X-Ray API に直接送信する代わりに、X-Ray SDK はデーモンプロセスを使用します。AWS X-Ray デーモンは、Lambda 環境で実行され、セグメントとサブセグメントを含む UDP トラフィックをリッスンするアプリケーションです。受信データをバッファリングし、バッチで X-Ray に書き込みます。これにより、呼び出しのトレースに必要な処理とメモリのオーバーヘッドが削減されます。

Lambda ランタイムでは、デーモンは関数の設定されているメモリの 3% または 16 MB のいずれか大きい方まで使用することができます。呼び出し中に関数のメモリが不足すると、ランタイムはデーモンプロセスを最初に終了してメモリを解放します。

デーモンプロセスは、Lambda によるフルマネージドプロセスであり、ユーザーが設定することはできません。関数呼び出しによって生成されたすべてのセグメントは、Lambda 関数と同じアカウントに記録されます。デーモンは、他のアカウントにリダイレクトするように設定できません。

詳細については、X-Ray デベロッパーガイド の The X-Ray daemon を参照してください。

Lambda API でのアクティブトレースの有効化

AWS CLI または AWS SDK を使用してトレース設定を管理するには、以下の API オペレーションを使用します。

以下の例の AWS CLI コマンドは、my-function という名前の関数でアクティブトレースを有効にします。

aws lambda update-function-configuration --function-name my-function \ --tracing-config Mode=Active

トレースモードは、関数のバージョンの公開時にロックされるバージョン固有の設定に含まれます。公開後のバージョンのトレースモードを変更することはできません。

AWS CloudFormation でのアクティブトレースの有効化

AWS::Lambda::Function テンプレートで AWS CloudFormation リソースに対してアクティブトレースを有効にするには、TracingConfig プロパティを使用します。

function-inline.yml - トレース設定

Resources: function: Type: AWS::Lambda::Function Properties: TracingConfig: Mode: Active ...

AWS Serverless Application Model (AWS SAM) AWS::Serverless::Function リソースに、Tracing プロパティを使用します。

template.yml - トレース設定

Resources: function: Type: AWS::Serverless::Function Properties: Tracing: Active ...