のSDK起動時間を短縮する AWS Lambda - AWS SDK for Java 2.x

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

のSDK起動時間を短縮する AWS Lambda

の目標の 1 AWS SDK for Java 2.x つは、関数の起動レイテンシーを減らすことです AWS Lambda 。SDK には、このトピックの最後に説明されている起動時間を短縮する変更が含まれています。

まず、このトピックでは、コールド起動時間を短縮するためにできる変更に焦点を当てます。これには、コード構造やサービスクライアントの設定の変更が含まれます。

AWS CRTベースのHTTPクライアントを使用する

を操作するには AWS Lambda、同期シナリオAwsCrtHttpClientの場合は を、非同期シナリオAwsCrtAsyncHttpClientの場合は を使用することをお勧めします。

このガイドのAWS CRTベースのHTTPクライアントを設定するトピックでは、HTTPクライアントを使用する利点、依存関係を追加する方法、サービスクライアントによるそれらの使用を設定する方法について説明します。

未使用のHTTPクライアントの依存関係を削除する

AWS CRTベースのクライアントの明示的な使用に加えて、 がデフォルトで引きSDK出す他のHTTPクライアントを削除できます。Lambda の起動時間は、ロードするライブラリの数が少なくなると短縮されるため、 がロードJVMする必要がある未使用のアーティファクトを削除する必要があります。

Maven pom.xmlファイルの次のスニペットは、Apache ベースのHTTPクライアントと Netty ベースのHTTPクライアントの除外を示しています。(これらのクライアントは、 AWS CRTベースのクライアントを使用する場合は必要ありません。) この例では、S3 HTTPクライアント依存関係からクライアントアーティファクトを除外し、 AWS CRTベースのHTTPクライアントへのアクセスを許可するaws-crt-clientアーティファクトを追加します。

<project> <properties> <aws.java.sdk.version>2.27.21</aws.java.sdk.version> <properties> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>${aws.java.sdk.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>aws-crt-client</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <exclusions> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>netty-nio-client</artifactId> </exclusion> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>apache-client</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project>
注記

pom.xml ファイル内のすべてのサービスクライアント依存関係に <exclusions> 要素を追加します。

検索をショートカットするようにサービスクライアントを設定します。

リージョンを指定する

サービスクライアントを作成したら、サービスクライアントビルダーの region メソッドを呼び出します。これにより、 SDKのデフォルトのリージョン検索プロセスがショートカットされ、複数の場所で AWS リージョン 情報がチェックされます。

Lambda コードをリージョンから独立させるには、region メソッド内で以下のコードを使用します。このコードは、Lambda コンテナによって設定された AWS_REGION 環境変数にアクセスします。

Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable()))
EnvironmentVariableCredentialProvider を使用する

リージョン情報のデフォルトのルックアップ動作と同様に、 SDKは複数の場所で認証情報を検索します。サービスクライアントを構築するEnvironmentVariableCredentialProviderときに を指定することで、 SDKの認証情報のルックアッププロセスにかかる時間を節約できます。

注記

この認証情報プロバイダーを使用すると、コードは Lambda 関数で使用できますが、 Amazon EC2 やその他のシステムでは機能しない場合があります。

ある時点で Lambda SnapStart for Java を使用する場合は、デフォルトの認証情報プロバイダーチェーンを使用して認証情報を検索する必要があります。を指定するとEnvironmentVariableCredentialsProvider、初期認証情報ルックアップは機能しますが、 SnapStart がアクティブ化されると、Java ランタイムはコンテナ認証情報環境変数 を設定します。アクティベーション時に、 EnvironmentVariableCredentialsProvider- アクセスキー環境変数 - で使用される環境変数は、Java では使用できませんSDK。

以下のコードスニペットは、Lambda 環境で使用するために適切に設定された S3 サービスクライアントを示しています。

S3Client s3Client = S3Client.builder() .region(Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable()))) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .httpClient(AwsCrtHttpClient.builder().build()) .build();

Lambda 関数ハンドラーの外部でSDKクライアントを初期化する

Lambda ハンドラーメソッドの外部でSDKクライアントを初期化することをお勧めします。これにより、実行コンテキストが再利用される場合、サービスクライアントの初期化をスキップできます。クライアントインスタンスとその接続を再利用することで、それ以降のハンドラーメソッドの呼び出しがより迅速に行われます。

以下の例では、S3Client インスタンスは静的ファクトリーメソッドを使用してコンストラクターで初期化されます。Lambda 環境で管理されているコンテナが再利用されると、初期化された S3Client インスタンスが再利用されます。

public class App implements RequestHandler<Object, Object> { private final S3Client s3Client; public App() { s3Client = DependencyFactory.s3Client(); } @Override public Object handle Request(final Object input, final Context context) { ListBucketResponse response = s3Client.listBuckets(); // Process the response. } }

依存関係インジェクションを最小限に抑える

依存関係インジェクション (DI) フレームワークを使用すると、設定プロセスの完了までにさらに時間がかかる場合があります。また、追加の依存関係が必要になる可能性もあり、読み取りに時間がかかります。

DI フレームワークが必要な場合は、Dagger などの軽量な DI フレームワークの使用をお勧めします。

Maven Archetype ターゲットの使用 AWS Lambda

AWS Java SDKチームは、最小限の起動時間で Lambda プロジェクトをブートストラップするための Maven Archetype テンプレートを開発しました。アーキタイプから Maven プロジェクトを構築し、依存関係が Lambda 環境に合わせて適切に設定されていることを確認できます。

アーキタイプおよびデプロイ例について知るには、このブログ記事を参照してください。

Lambda SnapStart for Java を検討する

ランタイム要件に互換性がある場合は、Lambda SnapStart for Java AWS を提供します。Lambda SnapStart は、Java 関数の起動パフォーマンスを向上させるインフラストラクチャベースのソリューションです。関数の新しいバージョンを発行すると、Lambda は関数を SnapStart 初期化し、メモリとディスク状態のイミュータブルで暗号化されたスナップショットを取得します。 SnapStart その後、 は再利用のためにスナップショットをキャッシュします。

起動時間に影響するバージョン 2.x の変更点

コードに加えた変更に加えて、 SDK for Java のバージョン 2.x には、起動時間を短縮する 3 つの主要な変更が含まれています。

  • 初期化時間を短縮するシリアル化ライブラリである、Jackson-jr を使用します

  • の一部である日付と時刻オブジェクトの java.time ライブラリの使用 JDK

  • ログ記録ファサードの Slf4j を使用します

追加リソース

AWS Lambda デベロッパーガイドには、Java 固有ではない Lambda 関数を開発するためのベストプラクティスに関するセクションが含まれています。

を使用する Java でクラウドネイティブアプリケーションを構築する例については AWS Lambda、このワークショップコンテンツ を参照してください。ワークショップでは、パフォーマンスの最適化やその他のベストプラクティスについて説明します。

起動時のレイテンシーを短縮するために、事前にコンパイルされた静的イメージの使用を検討できます。例えば、 SDK for Java 2.x と Maven を使用して GraalVM ネイティブイメージ を構築できます。