AWS Lambda ベースのサーバーレスオブザーバビリティと OpenTelemetry
このガイドでは、AWS X-Ray や Amazon CloudWatch などのネイティブな AWS モニタリングサービスと共に、マネージドオープンソースツールおよびテクノロジーを使用して、Lambda ベースのサーバーレスアプリケーションのオブザーバビリティを構成するためのベストプラクティスを説明します。AWS Distro for OpenTelemetry (ADOT)、AWS X-Ray、Amazon Managed Service for Prometheus (AMP) などのツールを取り上げ、これらのツールを使用してサーバーレスアプリケーションに関する実用的な洞察を得る方法、問題のトラブルシューティング方法、アプリケーションパフォーマンスの最適化方法について説明します。
主要なトピック
オブザーバビリティのベストプラクティスガイドのこのセクションでは、以下のトピックについて詳しく説明します:
- AWS Distro for OpenTelemetry (ADOT) と ADOT Lambda レイヤーの紹介
- ADOT Lambda レイヤーを使用した Lambda 関数の自動計装
- ADOT Collector のカスタム設定サポート
- Amazon Managed Service for Prometheus (AMP) との統合
- ADOT Lambda レイヤー使用の長所と短所
- ADOT 使用時のコールドスタートレイテンシーの管理
AWS Distro for OpenTelemetry (ADOT) の紹介
AWS Distro for OpenTelemetry (ADOT) は、Cloud Native Computing Foundation (CNCF) の OpenTelemetry (OTel) プロジェクトの、安全で本番環境に対応した AWS がサポートするディストリビューションです。ADOT を使用すると、アプリケーションを一度だけ計装し、相関のあるメトリクスとトレースを複数の監視ソリューションに送信できます。
AWS のマネージド OpenTelemetry Lambda Layer は、OpenTelemetry Lambda Layer を利用して、AWS Lambda からテレメトリデータを非同期でエクスポートします。AWS Lambda 関数をラップし、OpenTelemetry ランタイム固有の SDK、縮小版の ADOT コレクター、AWS Lambda 関数の自動計装用の設定をパッケージングすることで、プラグアンドプレイのユーザーエクスペリエンスを提供します。ADOT Lambda Layer コレクターのコンポーネント(Receivers、Exporters、Extensions など)は、Amazon CloudWatch、Amazon OpenSearch Service、Amazon Managed Service for Prometheus、AWS X-Ray などとの統合をサポートしています。完全なリストはこちらでご覧いただけます。ADOT はパートナーソリューションとの統合もサポートしています。
ADOT Lambda Layer は、自動計装(Python、NodeJS、Java 向け)と、特定のライブラリや SDK 向けのカスタム計装の両方をサポートしています。自動計装では、デフォルトで Lambda Layer は AWS X-Ray にトレースをエクスポートするように設定されています。カスタム計装の場合は、対応する OpenTelemetry ランタイム計装リポジトリ からライブラリ計装を含め、関数内でそれを初期化するようにコードを変更する必要があります。
AWS Lambda での ADOT Lambda レイヤーを使用した自動計装
ADOT Lambda レイヤーを使用することで、コードを変更せずに Lambda 関数の自動計装を簡単に有効にできます。既存の Java ベースの Lambda 関数に ADOT Lambda レイヤーを追加し、CloudWatch で実行ログとトレースを表示する例を見てみましょう。
-
ドキュメント に従って、
ランタイム
、リージョン
、アーキテクチャタイプ
に基づいて Lambda レイヤーの ARN を選択します。Lambda 関数と同じリージョンの Lambda レイヤーを使用してください。例えば、Java の自動計装用の Lambda レイヤーはarn:aws:lambda:us-east-1:901920570463:layer:aws-otel-java-agent-x86_64-ver-1-28-1:1
となります。 -
コンソールまたは任意の IaC を使用して、Lambda 関数にレイヤーを追加します。
- AWS コンソールの場合、手順 に従って Lambda 関数にレイヤーを追加します。「ARN を指定」で、上記で選択したレイヤー ARN を貼り付けます。
- IaC オプションの場合、Lambda 関数の SAM テンプレートは次のようになります:
Layers:
- !Sub arn:aws:lambda:${AWS::Region}:901920570463:layer:aws-otel-java-agent-arm64-ver-1-28-1:1 -
Lambda 関数に環境変数を追加します。Node.js または Java の場合は
AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-handler
、Python の場合はAWS_LAMBDA_EXEC_WRAPPER=/opt/otel-instrument
を追加します。 -
Lambda 関数のアクティブトレースを有効にします。
注意
デフォルトでは、レイヤーは AWS X-Ray にトレースをエクスポートするように設定されています。Lambda 関数の実行ロールに必要な AWS X-Ray 権限があることを確認してください。AWS Lambda の AWS X-Ray 権限について詳しくは、AWS Lambda ドキュメント を参照してください。Tracing: Active
-
Lambda レイヤー設定、環境変数、X-Ray トレースを含む SAM テンプレートの例は次のようになります:
Resources:
ListBucketsFunction:
Type: AWS::Serverless::Function
Properties:
Handler: com.example.App::handleRequest
...
ProvisionedConcurrencyConfig:
ProvisionedConcurrentExecutions: 1
Policies:
- AWSXrayWriteOnlyAccess
- AmazonS3ReadOnlyAccess
Environment:
Variables:
AWS_LAMBDA_EXEC_WRAPPER: /opt/otel-handler
Tracing: Active
Layers:
- !Sub arn:aws:lambda:${AWS::Region}:901920570463:layer:aws-otel-java-agent-amd64-ver-1-28-1:1
Events:
HelloWorld:
Type: Api
Properties:
Path: /listBuckets
Method: get