AWS X-Ray を使用した Lambda 関数呼び出しの視覚化 - AWS Lambda

AWS X-Ray を使用した Lambda 関数呼び出しの視覚化

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

関数を呼び出すサービスで X-Ray のトレースを有効にすると、トレースは Lambda から自動的に X-Ray に送信されます。Amazon API Gateway などのアップストリームサービスや、X-Ray SDK でインストルメントされた Amazon EC2 でホストされているアプリケーションは、着信リクエストをサンプリングし、トレースを送信するかどうかを Lambda に指示するトレースヘッダーを追加します。Amazon SQS などの上流のメッセージプロデューサーからのトレースは、下流の Lambda 関数からのトレースに自動的にリンクされるため、アプリケーション全体のエンドツーエンドのビューが作成されます。詳細については、「AWS X-Ray デベロッパーガイド」の「イベント駆動型アプリケーションのトレース」を参照してください。

注記

X-Ray トレースは、現在、Amazon Managed Streaming for Apache Kafka (Amazon MSK)、セルフマネージド Apache Kafka、ActiveMQ と RabbitMQ 向けの Amazon MQ、または Amazon DocumentDB イベントソースマッピングを備えた Lambda 関数ではサポートされていません。

コンソールを使用して、Lambda 関数のアクティブトレースをオンにするには、次のステップに従います。

アクティブトレースをオンにするには
  1. Lambda コンソールの [関数ページ] を開きます。

  2. 関数を選択します。

  3. [設定] を選択してから、[モニタリングおよび運用ツール] を選択します。

  4. [編集] を選択します。

  5. [X-Ray] で、[アクティブトレース] をオンに切り替えます。

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

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

X-Ray は、アプリケーションへのすべてのリクエストをトレースするとは限りません。X-Ray は、サンプリングアルゴリズムを適用することで効率的なトレースを行うと同時に、すべてのリクエストについての代表的なサンプルを示します。サンプルレートは 1 秒あたり 1 回のリクエストで、追加リクエストの 5% です。関数の X-Ray サンプルレートを設定することはできません。

X-Ray トレースを理解する

X-Ray では、トレースは 1 つ以上のサービスによって処理されるリクエストに関する情報を記録します。Lambda はトレースごとに 2 つのセグメントを記録します。これにより、サービスグラフに 2 つのノードが作成されます。次の図は、これら 2 つのノードを強調表示しています。

単一の関数を持つ X-Ray サービスマップ。

左に示された 1 つめのノードは、呼び出しリクエストを受信する Lambda サービスを表しています。2 つめのノードは、特定の Lambda 関数を表しています。

Lambda サービス用に記録されたセグメント AWS::Lambda は、Lambda 実行環境を準備するために必要なすべての手順をカバーしています。これには、MicroVM のスケジューリング、設定したリソースを使用した実行環境の作成またはフリーズ解除、関数コードとすべてのレイヤーのダウンロードが含まれます。

AWS::Lambda::Function セグメントは、関数によって実行される作業のためのものです。

注記

AWS は現在、Lambda サービスに変更を実装しています。これらの変更により、AWS アカウント のさまざまな Lambda 関数によって出力されるシステムログメッセージとトレースセグメントの構造と内容にわずかな違いが生じる場合があります。

この変更は、関数セグメントのサブセグメントに影響します。次の段落では、これらのサブセグメントの古い形式と新しい形式の両方について説明します。

これらの変更は今後数週間に実装され、中国および GovCloud リージョンを除くすべての AWS リージョンのすべての関数は、新しい形式のログメッセージとトレースセグメントを使用するように移行されます。

古いスタイルの AWS X-Ray Lambda セグメント構造

AWS::Lambda セグメントの古いスタイルの X-Ray 構造は次のようになります。

呼び出しセグメントを含む古いスタイルの X-Ray トレースの構造を示す図

この形式では、関数セグメントには InitializationInvocation、および Overhead のサブセグメントがあります。Lambda SnapStart のみ、Restore サブセグメントも存在します (この図には示されていません)。

Initialization サブセグメントは、Lambda 実行環境ライフサイクルの初期フェーズを表します。このフェーズでは、Lambda は拡張機能を初期化し、ランタイムを初期化して、関数の初期化コードを実行します。

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

(Lambda SnapStart のみ) Restore サブセグメントは、Lambda がスナップショットを復元し、ランタイム (JVM) をロードし、afterRestore ランタイムフックを実行するのにかかる時間を表しています。スナップショットを復元するプロセスには、MicroVM 外部でのアクティビティに費やす時間が含まれる場合があります。この時間は、Restore サブセグメントで報告されます。MicroVM 外部でスナップショットの復元に費やした時間については課金されません。

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

重要

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

Lambda 実行環境の詳細については、「Lambda 実行環境のライフサイクルを理解する」を参照してください。

次の図に、古いスタイルの X-Ray 構造を使用したトレースの例を示します。

呼び出しセグメントを含む古いスタイルの X-Ray トレースの例を示す図

この例の 2 つのセグメントに注意してください。いずれも my-function と名付けられていますが、1 つは AWS::Lambda の起点があり、もう 1 つは AWS::Lambda::Function の起点があります。AWS::Lambda セグメントにエラーが表示される場合は、Lambda サービスに問題があります。AWS::Lambda::Function セグメントにエラーが表示される場合、関数に問題があります。

注記

時折、X-Ray トレースの関数初期化フェーズと呼び出しフェーズの間に大きなギャップがあることに気付くことがあります。プロビジョニングされた同時実行を使用する関数の場合、これが発生するのは Lambda が呼び出しに先立って関数インスタンスを初期化するからです。予約されていない (オンデマンド) 同時実行を使用する関数の場合、Lambda は、呼び出しがない場合でも先を見越して関数インスタンスを初期化することがあります。視覚的には、これらのケースの両方が、初期化フェーズと呼び出しフェーズ間における時間のギャップとして表示されます。

新しいスタイルの AWS X-Ray Lambda セグメント構造

AWS::Lambda セグメントの新しいスタイルの X-Ray 構造は次のようになります。

呼び出しセグメントのない新しいスタイルの X-Ray トレースの構造を示す図

この新しい形式では、Init サブセグメントは、以前と同様に Lambda 実行環境ライフサイクルの初期化フェーズを表します。

新しい形式には呼び出しセグメントはありません。代わりに、顧客サブセグメントが AWS::Lambda::Function セグメントに直接アタッチされます。このセグメントには、注釈として次のメトリクスが含まれています。

  • aws.responseLatency – 関数の実行にかかる時間

  • aws.responseDuration – 顧客へのレスポンスの転送にかかる時間

  • aws.runtimeOverhead – ランタイムの終了に必要な追加時間

  • aws.extensionOverhead – 拡張機能の終了に必要な追加時間

新しいスタイルの X-Ray 構造を使用したトレースの例を次の図に示します。

呼び出しセグメントのない新しいスタイルの X-Ray トレースの例を示す図

この例の 2 つのセグメントに注意してください。いずれも my-function と名付けられていますが、1 つは AWS::Lambda の起点があり、もう 1 つは AWS::Lambda::Function の起点があります。AWS::Lambda セグメントにエラーが表示される場合は、Lambda サービスに問題があります。AWS::Lambda::Function セグメントにエラーが表示される場合、関数に問題があります。

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 ...