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 に指示するトレースヘッダーを追加します。
X-Ray トレースは、現在、Amazon Managed Streaming for Apache Kafka (Amazon MSK)、セルフマネージド Apache Kafka、または ActiveMQ と RabbitMQ イベントソースマッピングを備えた Amazon MQ の Lambda 関数ではサポートされていません。
コンソールを使用して Lambda 関数のアクティブトレースを切り替えるには、以下のステップに従います。
トレースをアクティブにするには
Lambda コンソールの [Functions]
(関数) ページを開きます。 -
関数を選択します。
[Configuration] (設定) を選択してから、[Monitoring and operations tools] (モニタリングおよび運用ツール) を選択します。
Edit (編集) を選択します。
-
[X-Ray] で、[Active tracing] (アクティブトレース) をオンに切り替えます。
-
[Save] を選択します。
X-Ray トレースは、毎月、AWS 無料利用枠で設定された一定限度まで無料で利用できます。X-Ray の利用がこの上限を超えた場合は、トレースによる保存と取得に対する料金が発生します。詳細については、AWS X-Ray 料金表
関数には、トレースデータを X-Ray にアップロードするためのアクセス許可が必要です。Lambda コンソールでトレースを有効にすると、Lambda は必要な権限を関数の [execution role] (実行ロール) に追加します。それ以外の場合は、AWSXRayDaemonWriteAccess
X-Ray は、アプリケーションへのすべてのリクエストをトレースするとは限りません。X-Ray は、サンプリングアルゴリズムを適用することで効率的なトレースを行い、同時に、すべてのリクエストについての代表的なサンプルを示します。サンプルレートは 1 秒あたり 1 回のリクエストで、追加リクエストの 5% です。
関数の X-Ray サンプルレートは設定することはできません。
X-Ray では、トレースは 1 つ以上のサービスによって処理されるリクエストに関する情報を記録します。サービスは、サブセグメントのレイヤーを含むセグメントを記録します。Lambda は、Lambda サービスのセグメントと、関数によって行われた作業用のセグメントを記録します。関数セグメントには Initialization
、Invocation
および 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 CloudFormation テンプレート内で AWS::Lambda::Function
リソースに対するアクティブトレースを有効化するには、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
...