

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

# で SDK クライアントをウォームアップする AWS SDK for Java 2.x
<a name="sdk-warmup"></a>

の `SdkWarmUp`ユーティリティ AWS SDK for Java 2.x を使用して、アプリケーションの初期化中に SDK クライアントをウォームアップします。これにより、起動または復元後にアプリケーションが処理する最初のリクエストのレイテンシーが短縮されます。

ウォームアップでは、アプリケーションが実際のトラフィックを処理する前に、SDK リクエストパス (クライアントの構築と オペレーションの呼び出し) を実行します。[Lambda SnapStart](https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html) checkpoint-and-restore機能で使用します。これらの機能は、初期化されたアプリケーションのスナップショットを取得し、そのスナップショットから復元してコールドスタートレイテンシーを減らします。

を使用しない場合`SdkWarmUp`、各チェックポイントの前に独自のウォームアップコードを記述する必要があります。これは面倒です。では`SdkWarmUp`、1 回の呼び出しですべてのクライアントをウォームアップします。クラスパス上のすべての SDK クライアント、またはアプリケーションが使用する特定のクライアントのみをウォームできます。

このトピックでは、 `SdkWarmUp` CRaC と AWS Lambda SnapStart を設定して使用する方法について説明します。Lambda の起動時間を短縮する他の手法の詳細については、「」を参照してください[の SDK 起動時間を短縮する AWS Lambda](lambda-optimize-starttime.md)。

## SdkWarmUp API
<a name="sdk-warmup-api"></a>

`SdkWarmUp` は `sdk-core`モジュールの一部であるため、追加の依存関係なしですべてのサービスクライアントで使用できます。バージョン 2.54.0 以降の を使用するようにプロジェクトを設定します AWS SDK for Java 2.x。次に、以下のセクションで説明する 2 つの静的メソッドのいずれかを呼び出します。いずれかのメソッドを呼び出すと、 `SdkWarmUp`は HTTP クライアントをウォームするために 1 つのネットワーク呼び出しを行います。サービスクライアントをウォームするには、ローカルの既定レスポンスを使用します。認証情報や IAM アクセス許可は必要なく AWS 、 AWS 料金は発生しません。

### クラスパス上のすべての SDK クライアントをウォームアップする
<a name="sdk-warmup-api-noarg"></a>

`warmUp()` メソッドは、クラスパス上のすべての SDK サービスクライアントを検出し、使用する HTTP クライアントとともにそれぞれをウォームします。少数のサービスモジュールに依存し、提供するほとんどのクライアントを呼び出す場合は、この方法を使用します。次のJavaコード例では`warmUp()`、引数なしで を呼び出します。

```
import software.amazon.awssdk.core.warmup.SdkWarmUp;

SdkWarmUp.warmUp();
```

このメソッドは、JVM ごとに最大 1 回実行されます。呼び出しが成功すると、後続の呼び出しはすぐに返されます。

### 特定の SDK クライアントをウォームアップする
<a name="sdk-warmup-api-targeted"></a>

`warmUp(Class<? extends SdkClient>... clients)` メソッドは、名前を付けたクライアントのみをウォームします。同期パスをウォームするには同期クライアントクラスを、非同期パスをウォームするには非同期クライアントクラスを渡します。

クラスパスにアプリケーションが呼び出すよりも多くのサービスクライアントが含まれている場合は、この方法を使用します。例えば、これは、依存関係が使用していないサービスモジュールを持ち込む場合に発生します。必要なクライアントにのみ名前を付けると、ウォームアップ時間はフルクラスパスではなく、アプリケーションの実際の使用状況に比例します。次のJavaコード例では、 `S3Client`および `DynamoDbClient` クラスのみをウォームします。

```
import software.amazon.awssdk.core.warmup.SdkWarmUp;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;

SdkWarmUp.warmUp(S3Client.class, DynamoDbClient.class);
```

## Lambda SnapStart で SdkWarmUp を使用する SnapStart
<a name="sdk-warmup-lambda-snapstart"></a>

[AWS Lambda SnapStart](https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html) は、 Java関数の起動パフォーマンスを向上させます。関数の新しいバージョンを発行すると、Lambda SnapStart は関数を初期化し、メモリとディスク状態のスナップショットを作成します。次に、スナップショットをキャッシュして再利用します。サポートされているランタイムと、関数の SnapStart をアクティブ化する方法については、「 *AWS Lambda デベロッパーガイド*」を参照してください。

Lambda はハンドラのコンストラクタの実行後にスナップショットを取得するため、コンストラクタ`SdkWarmUp.warmUp()`で を呼び出します。その後、スナップショットにはウォームされたクライアントが含まれ、スナップショットから復元する各呼び出しはウォームアップからメリットを得ます。次のJavaコード例では、Lambda ハンドラーコンストラクタ`SdkWarmUp.warmUp()`で を呼び出します。

```
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import software.amazon.awssdk.core.warmup.SdkWarmUp;

public class MyHandler implements RequestHandler<String, String> {

    public MyHandler() {
        SdkWarmUp.warmUp();
        // Your other initialization here.
    }

    @Override
    public String handleRequest(String input, Context context) {
        // Your handler logic here.
    }
}
```

Lambda がスナップショットを取得する前、または復元後に関数がカスタムコードを実行する必要がある場合は、SnapStart ランタイムフックを実装します。詳細については、「 *AWS Lambda デベロッパーガイド*」の[SnapStart runtime hooks for Java](https://docs.aws.amazon.com/lambda/latest/dg/snapstart-runtime-hooks-java.html)」を参照してください。

## スタンドアロン CRaC で SdkWarmUp を使用する
<a name="sdk-warmup-standalone-crac"></a>

独自のチェックポイントを管理するアプリケーションで、 `SdkWarmUp`CRaCを直接 で使用することもできます。このセクションでは、 用に既に設定されているアプリケーションでウォームアップ呼び出しが属する場所を示しますCRaC。のアプリケーションを設定するにはCRaC、「 での[Step-by-step CRaC サポート](https://github.com/CRaC/docs/blob/master/STEP-BY-STEP.md)」を参照してくださいGitHub。このチュートリアルでは、サポートされている JDK ディストリビューション、プラットフォームの前提条件、ライフサイクルインターフェイスに必要な`org.crac:crac`依存関係について説明します。

### チェックポイントの前にウォームアップする
<a name="sdk-warmup-crac-step1"></a>

チェックポイントを取る前に、初期化`SdkWarmUp.warmUp()`中に を呼び出します。アプリケーションはすでに自身を CRaC として登録`Resource`し、チェックポイントの周囲の接続を閉じて再度開きます。次のJavaコード例に示すように、ウォームアップ呼び出しを同じコンストラクタに追加します。

```
import org.crac.Context;
import org.crac.Core;
import org.crac.Resource;
import software.amazon.awssdk.core.warmup.SdkWarmUp;

public class MyApp implements Resource {

    public MyApp() {
        SdkWarmUp.warmUp();
        // Your other initialization here.
        Core.getGlobalContext().register(this);
    }

    @Override
    public void beforeCheckpoint(Context<? extends Resource> context) throws Exception {
        // Close your service clients here.
    }

    @Override
    public void afterRestore(Context<? extends Resource> context) throws Exception {
        // Create your service clients again here.
    }
}
```

**注記**  
CRaC は、ファイル記述子が開いている間はチェックポイントを取得しません。 AWS CRT ベースの HTTP クライアントを使用する場合、クライアントは共有イベントループを開いたままにしておくため、サービスクライアントを単独で閉じるだけでは不十分です。次の Java コード例`beforeCheckpoint`に示すように、 でリリースします。  

```
import org.crac.Context;
import org.crac.Resource;
import software.amazon.awssdk.crt.CrtResource;
import software.amazon.awssdk.crt.io.EventLoopGroup;

@Override
public void beforeCheckpoint(Context<? extends Resource> context) {
    EventLoopGroup.closeStaticDefault();
    CrtResource.waitForNoResources();
}
```
Nettyベースの および Apacheベースの HTTP クライアントは、サービスクライアントを閉じるときにリソースを解放するため、追加のティアダウンは必要ありません。

チェックポイントを通常どおりに取得します。

## その他のリソース
<a name="sdk-warmup-additional-resources"></a>

以下のリソースは、このセクションで説明するトピックに関する詳細情報を提供します。
+ に関する [CRaC ドキュメント](https://github.com/CRaC/docs) GitHub