AWS Lambda での Java コードの作成 - AWS Lambda

AWS Lambda での Java コードの作成

Lambda が AWS X-Ray と統合され、Lambda アプリケーションのトレース、デバッグ、および最適化が可能になります。X-Ray を使用すると、フロントエンド API からバックエンドのストレージとデータベースまで、アプリケーション内のリソースを横断する際にリクエストをトレースできます。X-Ray SDK ライブラリをビルド設定に追加するだけで、関数が AWS のサービスに対して行う呼び出しのエラーとレイテンシーを記録できます。

X-Ray サービスマップには、アプリケーションからのリクエストのフローが表示されます。エラープロセッサ のサンプルアプリケーションの次の例は、2 つの関数を持つアプリケーションを示しています。プライマリ関数はイベントを処理し、エラーを返す場合があります。2 番目の関数は、最初のロググループに表示されるエラーを処理し、AWS SDK を使用して X-Ray、Amazon S3 と Amazon CloudWatch Logs を呼び出します。


          Service map showing nodes for Lambda functions, X-Ray, Amazon S3 and CloudWatch Logs

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

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

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

  2. 関数を選択します。

  3. [AWS X-Ray] で、[アクティブトレース] を選択します。

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

料金

X-Ray には期限なしの無料利用枠があります。無料利用枠のしきい値を超えると、X-Ray ではトレースのストレージと取得に課金されます。詳細については、「AWS X-Ray 料金表」を参照してください。

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

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

アクティブなトレースが有効な場合、Lambda は呼び出しのサブセットのトレースを記録します。Lambda は 2 つのセグメントを記録し、サービスマップ上に 2 つのノードを作成します。最初のノードは、呼び出しリクエストを受信する Lambda サービスを表します。2 番目のノードは、関数のランタイムによって記録されます。


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

関数が他のリソースやサービスに対して行う呼び出しの詳細を記録するには、X-Ray SDK for Java をビルド設定に追加します。以下の例では、AWS SDK for Java 2.x クライアントの自動インストルメントを有効にするライブラリを含む Gradle ビルド設定を示しています。

build.gradle – 依存関係のトレース

dependencies { implementation platform('software.amazon.awssdk:bom:2.10.73') implementation platform('com.amazonaws:aws-xray-recorder-sdk-bom:2.4.0') implementation 'software.amazon.awssdk:lambda' implementation 'com.amazonaws:aws-xray-recorder-sdk-core' implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-core' implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-v2' implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-v2-instrumentor' ... }

次の例は、2 つのセグメントのあるトレースを示しています。どちらも my-function という名前ですが、1 つは AWS::Lambda 型で、もう 1 つは AWS::Lambda::Function 型です。関数セグメントを拡張して、そのサブセグメントを表示します。

最初のセグメントは、Lambda サービスによって処理される呼び出しリクエストを表します。2 番目のセグメントは、関数によって行われた処理を記録します。この関数セグメントには、3 つのサブセグメントがあります。

  • 初期化 – 関数のロードと初期化コードの実行にかかった時間を表します。このサブセグメントは、関数の各インスタンスによって処理される最初のイベントに対してのみ表示されます。

  • 呼び出し – ハンドラコードによって行われた処理を表します。コードをインストルメント化することにより、このサブセグメントを追加のサブセグメントで拡張できます。

  • オーバーヘッド – 次のイベントを処理する準備をするために Lambda ランタイムによって行われた処理を表します。

HTTP クライアントをインストルメントし、SQL クエリを記録し、注釈とメタデータからカスタムサブセグメントを作成することもできます。詳細については、AWS X-Ray 開発者ガイド の「AWS X-Ray SDK for Java」を参照してください。

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 サーバーレスアプリケーションモデル (AWS SAM) AWS::Serverless::Function リソースに、Tracing プロパティを使用します。

template.yml – トレース設定

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

ランタイム依存関係をレイヤーに保存する

X-Ray SDK を使用して AWS SDK クライアントをインストルメントする (関数コードを埋め込む) 場合は、デプロイパッケージが巨大になる可能性があります。関数コードを更新するたびにランタイムの依存関係をアップロードしないようにするには、それらを Lambda レイヤーにパッケージ化します。

以下の例では、SDK for Java および X-Ray SDK for Java を保存する AWS::Serverless::LayerVersion リソースを示しています。

template.yml – 依存関係レイヤー

Resources: function: Type: AWS::Serverless::Function Properties: CodeUri: build/distributions/blank-java.zip Tracing: Active Layers: - !Ref libs ... libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-java-lib Description: Dependencies for the blank-java sample app. ContentUri: build/blank-java-lib.zip CompatibleRuntimes: - java8

この設定では、ランタイム依存関係を変更した場合にのみ、ライブラリレイヤーを更新します。関数デプロイパッケージには、コードのみが含まれています。関数コードを更新すると、デプロイパッケージに依存関係を含める場合よりもアップロード時間が大幅に短縮されます。

依存関係のレイヤーを作成するには、デプロイ前にレイヤーアーカイブを生成するようにビルド設定を変更する必要があります。実際の例については、java-basic サンプルアプリケーションを参照してください。

サンプルアプリケーションでのトレース

このガイドの GitHub リポジトリには、トレースの使用方法を示すサンプルアプリケーションが含まれています。各サンプルアプリケーションには、簡易のデプロイとクリーンアップ用のスクリプト、AWS SAM テンプレート、サポートリソースが含まれています。

Java のサンプル Lambda アプリケーション

  • blank-java – Lambda の Java ライブラリ、ロギング、環境変数、レイヤー、AWS X-Ray トレース、単体テスト、および AWS SDK の使用を示す Java 関数。

  • java-basic – 単体テストと変数ログ記録設定を使用する、最小限の Java 関数。

  • java-events – Amazon API Gateway など、依存関係として AWS SDK を必要としないイベントタイプで、aws-lambda-java-events ライブラリを使用する最小限の Java 関数。

  • java-events-v1sdk – Amazon Simple Storage Service や Amazon DynamoDB、Amazon Kinesis など、依存関係として AWS SDK を必要とするイベントタイプで、aws-lambda-java-events ライブラリを使用する Java 関数。

  • s3-java – Amazon S3 からの通知イベントを処理し、Java Class Library (JCL) によりアップロード済みイメージファイルからサムネイルを作成する、Java 関数。

すべてのサンプルアプリケーションでは、Lambda 関数に対してアクティブトレースが有効になっています。blank-java アプリケーションは、AWS SDK for Java 2.x クライアントの自動インストルメント、テストのセグメント管理、カスタムのサブセグメント、Lambda レイヤーによるラインタイムの依存関係の保存を示しています。


        Lambda API を呼び出す関数を含む X-Ray サービスマップ。

この blank-java サンプルアプリケーションの例は、Lambda サービス、関数、Lambda API のノードを示しています。この関数は Lambda API を呼び出して、Lambda でのストレージの使用をモニタリングします。