

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

# CRT AWS ベースの HTTP クライアントを設定する
<a name="http-configuration-crt"></a>

 AWS CRT ベースの HTTP クライアントには、同期 [AwsCrtHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/crt/AwsCrtHttpClient.html) と非同期 [AwsCrtAsyncHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClient.html) が含まれます。 AWS CRT ベースの HTTP クライアントには、次の HTTP クライアントの利点があります。
+ SDK 起動時間の短縮
+ より小さなメモリフットプリント
+ レイテンシータイムの短縮
+ 接続のヘルス管理
+ DNS ロードバランサー

**AWS SDK の CRT ベースのコンポーネント**

このトピックで説明されている AWS CRT ベースの* HTTP* クライアントと AWS CRT ベースの *S3* クライアントは SDK の異なるコンポーネントです。

同期および非同期の**AWS CRT ベースの HTTP クライアント**は、SDK HTTP インターフェイスを実装したもので、一般的な HTTP 通信に使用されます。これらは SDK の他の同期 または 非同期の HTTP クライアントに代わるものですが、その他の利点もあります。

**[AWS CRT ベースの S3 クライアント](crt-based-s3-client.md)**は [S3AsyncClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3AsyncClient.html) インターフェイスの実装であり、Amazon S3 サービスを利用するために使用されます。これは `S3AsyncClient` インターフェースの Java ベース実装に代わるもので、いくつかの利点があります。

どちらのコンポーネントも [AWS Common Runtime](https://docs.aws.amazon.com/sdkref/latest/guide/common-runtime.html) のライブラリを使用していますが、CRT ベースの HTTP AWS クライアントは [aws-c-s3 ライブラリ](https://github.com/awslabs/aws-c-s3)を使用しておらず、[S3 マルチパートアップロード API ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html)機能もサポートしていません。対照的に、 AWS CRT ベースの S3 クライアントは、S3 マルチパートアップロード API 機能をサポートするように専用に構築されました。

## CRT AWS ベースの HTTP クライアントにアクセスする
<a name="http-config-crt-access"></a>

CRT AWS ベースの HTTP クライアントを使用する前に、最小バージョン 2.22.0 の`aws-crt-client`アーティファクトをプロジェクトの依存関係に追加します。

Maven `pom.xml` ファイルをセットアップするには、次のいずれかのオプションを使用します。

**注記**  
 アプリケーションが AWS Lambda 関数で実行されている場合など、ランタイム依存関係のサイズを小さくする必要がある場合は、*プラットフォーム固有の jar オプション*を使用できます。

------
#### [ Uber-jar option ]

デフォルトでは、 は Linux、Windows、macOS AWS など、複数のプラットフォームのバイナリを含む CRT アーティファクトの uber-jar `aws-crt-client`を使用します。

```
<project>
   <properties>
     <aws.sdk.java.version>2.29.10*</aws.sdk.java.version>
  </properties>
  <dependencyManagement>
   <dependencies>
      <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>bom</artifactId>
        <version>${aws.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>
  </dependencies>
</project>
```

\$1赤で示されているバージョンを、使用する Java SDK のバージョンに置き換えてください。[Maven Central ](https://central.sonatype.com/artifact/software.amazon.awssdk/bom) で最新最新バージョンを見つけます。

------
#### [ Platform-specific jar option ]

Java ランタイムをプラットフォーム固有のバージョンの CRT AWS ライブラリに制限するには、*Uber-jar オプション*に次の変更を加えます。
+ SDK の`aws-crt-client` アーティファクトに `exclusions` 要素を追加します。この除外により、SDK が CRT AWS uber-jar を推移的に使用できなくなります。
+ 必要な特定の CRT AWS プラットフォームバージョンの依存関係要素を追加します。正しい**バージョンを判断する方法については、以下のステップを参照して CRT AWS アーティファクト**のバージョンを確認してください。

```
<project>
   <properties>
     <aws.sdk.java.version>2.29.101</aws.sdk.java.version>
  </properties>
   <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>software.amazon.awssdk</groupId>
                <artifactId>bom</artifactId>
                <version>${aws.sdk.java.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>aws-crt-client</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>software.amazon.awssdk.crt</groupId>
                    <artifactId>aws-crt</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk.crt</groupId>
            <artifactId>aws-crt</artifactId>
            <version>0.31.32</version>
            <classifier>linux-x86_643</classifier>
        </dependency>
    </dependencies>
```

1赤で示されているバージョンを、使用する Java SDK のバージョンに置き換えてください。[Maven Central ](https://central.sonatype.com/artifact/software.amazon.awssdk/bom) で最新最新バージョンを見つけます。

2*Uber-jar オプション*によって提供される `software.amazon.awssdk.crt:aws-crt` のバージョンを置き換えてください。**CRT AWS アーティファクトのバージョンを確認するには、次のステップ**を参照してください。

3`classifier` の値をお使いのプラットフォームの値に置き換えてください。[使用可能な値のリスト](https://github.com/awslabs/aws-crt-java?tab=readme-ov-file#platform-specific-jars)については、Java GitHub の AWS CRT ページを参照してください。

**CRT AWS アーティファクトのバージョンを決定する手順**

次の手順を使用して、使用している SDK for Java AWS のバージョンと互換性のある CRT アーティファクトのバージョンを確認します。

1. *Uber-jar オプション*に示すように、 `pom.xml` ファイルを設定します。この設定により、デフォルトでどのバージョンの `software.amazon.awssdk.crt:aws-crt` が SDK に導入されているかを確認できます。

1. プロジェクトのルート ( `pom.xml` ファイルと同じディレクトリ) で、次の Maven コマンドを実行します。

   ```
   mvn dependency:tree -Dincludes=software.amazon.awssdk.crt:aws-crt
   ```

   Maven は他のアクションを実行する場合がありますが、最後に SDK が推移的に使用する `software.amazon.awssdk.crt:aws-crt` 依存関係のコンソール出力が表示されます。次のスニペットは、SDK のバージョン `2.29.10` に基づくサンプル出力を示しています。

   ```
   [INFO] org.example:yourProject:jar:1.0-SNAPSHOT
   [INFO] \- software.amazon.awssdk:aws-crt-client:jar:2.29.10:compile
   [INFO]    \- software.amazon.awssdk.crt:aws-crt:jar:0.31.3:compile
   ```

1. コンソールが `software.amazon.awssdk.crt:aws-crt` アーティファクトに対して表示するバージョンを使用します。この場合、`0.31.3` を `pom.xml` ファイルに追加します。

------

## CRT AWS ベースの HTTP クライアントの使用と設定
<a name="http-crt-config"></a>

サービスクライアントの構築とともに CRT AWS ベースの HTTP クライアントを設定することも、複数のサービスクライアント間で共有するように 1 つのインスタンスを設定することもできます。

どちらの方法でも、ビルダーを使用して CRT AWS ベースの HTTP クライアントインスタンスの[プロパティを設定します](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/crt/AwsCrtHttpClient.Builder.html)。

### ベストプラクティス: インスタンスをサービスクライアント専有にする
<a name="http-config-crt-one-client"></a>

 AWS CRT ベースの HTTP クライアントのインスタンスを設定する必要がある場合は、サービスクライアント と一緒にインスタンスを構築して専有することをお勧めします。これを行うには、サービスクライアントのビルダーの `httpClientBuilder` メソッドを使用します。これにより、HTTP クライアントのライフサイクルは SDK AWS によって管理されるため、不要になった CRT ベースの HTTP クライアントインスタンスが閉じられない場合にメモリリークが発生する可能性を回避できます。

次の例では、S3 サービスクライアントを作成し、 `connectionTimeout` と `maxConcurrency`の値を使用して AWS CRT ベースの HTTP クライアントを設定します。

------
#### [ Synchronous client ]

**インポート**

```
import software.amazon.awssdk.http.crt.AwsCrtHttpClient;
import software.amazon.awssdk.services.s3.S3Client;
import java.time.Duration;
```

**コード**

```
// Singleton: Use s3Client for all requests.
S3Client s3Client = S3Client.builder()
    .httpClientBuilder(AwsCrtHttpClient
        .builder()
        .connectionTimeout(Duration.ofSeconds(3))
        .maxConcurrency(100))
    .build();

// Perform work with the s3Client.

// Requests completed: Close the s3Client.
s3Client.close();
```

------
#### [ Asynchronous client ]

**インポート**

```
import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient;
import software.amazon.awssdk.services.s3.S3AsyncClient;
import java.time.Duration;
```

**コード**

```
// Singleton: Use s3AsyncClient for all requests.
S3AsyncClient s3AsyncClient = S3AsyncClient.builder()
    .httpClientBuilder(AwsCrtAsyncHttpClient
        .builder()
        .connectionTimeout(Duration.ofSeconds(3))
        .maxConcurrency(100))
    .build();

// Perform work with the s3AsyncClient.

// Requests completed: Close the s3AsyncClient.
s3AsyncClient.close();
```

------

### 別の方法: インスタンスを共有する
<a name="http-config-crt-multi-clients"></a>

アプリケーションのリソースとメモリの使用量を減らすために、CRT AWS ベースの HTTP クライアントを設定し、複数のサービスクライアント間で共有できます。HTTP 接続プールは共有されるため、リソースの使用量が少なくなります。

**注記**  
 AWS CRT ベースの HTTP クライアントインスタンスを共有する場合は、破棄する準備ができたらインスタンスを閉じる必要があります。サービスクライアントが閉じられても、SDK はインスタンスを閉じません。

次の例では、 `connectionTimeout` と `maxConcurrency`の値を使用して AWS CRT ベースの HTTP クライアントインスタンスを設定します。設定された `httpClient` インスタンスは、各サービスクライアントのビルダーのメソッドに渡されます。サービスクライアントと HTTP クライアントが不要になると、それらは明示的に閉じられます。HTTP クライアントは最後に閉じられます。

------
#### [ Synchronous client ]

**インポート**

```
import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider;
import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.crt.AwsCrtHttpClient;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.s3.S3Client;
import java.time.Duration;
```

**コード**

```
// Create an AwsCrtHttpClient shared instance.
SdkHttpClient crtHttpClient = AwsCrtHttpClient.builder()
    .connectionTimeout(Duration.ofSeconds(3))
    .maxConcurrency(100)
    .build();

// Singletons: Use the s3Client and dynamoDbClient for all requests.
S3Client s3Client = S3Client.builder()
    .httpClient(crtHttpClient)
    .credentialsProvider(EnvironmentVariableCredentialsProvider.crea
    .defaultsMode(DefaultsMode.IN_REGION)
    .region(Region.US_EAST_1)
    .build();

DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
    .httpClient(crtHttpClient)
    .credentialsProvider(EnvironmentVariableCredentialsProvider.crea
    .defaultsMode(DefaultsMode.IN_REGION)
    .region(Region.US_EAST_1)
    .build();

// Requests completed: Close all service clients.
s3Client.close();
dynamoDbClient.close();
crtHttpClient.close();  // Explicitly close crtHttpClient.
```

------
#### [ Asynchronous client ]

**インポート**

```
import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider;
import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode;
import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;
import software.amazon.awssdk.services.s3.S3AsyncClient;
import java.time.Duration;
```

**コード**

```
// Create an AwsCrtAsyncHttpClient shared instance.
SdkAsyncHttpClient crtAsyncHttpClient = AwsCrtAsyncHttpClient.builder()
    .connectionTimeout(Duration.ofSeconds(3))
    .maxConcurrency(100)
    .build();

// Singletons: Use the s3AsyncClient and dynamoDbAsyncClient for all requests.
S3AsyncClient s3AsyncClient = S3AsyncClient.builder()
    .httpClient(crtAsyncHttpClient)
    .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
    .defaultsMode(DefaultsMode.IN_REGION)
    .region(Region.US_EAST_1)
    .build();

DynamoDbAsyncClient dynamoDbAsyncClient = DynamoDbAsyncClient.builder()
    .httpClient(crtAsyncHttpClient)
    .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
    .defaultsMode(DefaultsMode.IN_REGION)
    .region(Region.US_EAST_1)
    .build();

// Requests completed: Close all service clients.
s3AsyncClient.close();
dynamoDbAsyncClient.close();
crtAsyncHttpClient.close();  // Explicitly close crtAsyncHttpClient.
```

------

## CRT AWS ベースの HTTP クライアントをデフォルトとして設定する
<a name="setting-the-crt-based-http-client-as-the-default"></a>

Maven ビルドファイルは、サービスクライアントのデフォルトの HTTP クライアントとして SDK が AWS CRT ベースの HTTP クライアントを使用するように設定できます。

そのためには、デフォルトの HTTP クライアント依存関係を持つ `exclusions` 要素を各サービスクライアントアーティファクトに追加します。

次の`pom.xml`例では、SDK は S3 サービスに AWS CRT ベースの HTTP クライアントを使用します。コード内のサービスクライアントが `S3AsyncClient` の場合、SDK は `AwsCrtAsyncHttpClient` を使用します。サービスクライアントが S3Client の場合、SDK は `AwsCrtHttpClient` を使用します。この設定では、デフォルトの Netty ベースの非同期 HTTP クライアントと、デフォルトの Apache ベースの同期 HTTP は使用できません。

```
<project>
   <properties>
     <aws.sdk.version>VERSION</aws.sdk.version>
  </properties>
  <dependencies>
   <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>s3</artifactId>
      <version>${aws.sdk.version}</version>
      <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>
   <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>aws-crt-client</artifactId>
   </dependency>
  </dependencies>
</project>
```

Maven central リポジトリにアクセスして、最新の[https://central.sonatype.com/artifact/software.amazon.awssdk/bom](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)値を確認します。

**注記**  
1 つの `pom.xml` ファイル内で複数のサービスクライアントが宣言されている場合は、すべて `exclusions` XML 要素を必要とします。

### Java システムプロパティを使用する
<a name="setting-via-java-system-property"></a>

アプリケーションのデフォルトの HTTP として AWS CRT ベースの HTTP クライアントを使用するには、Java システムプロパティ`software.amazon.awssdk.http.async.service.impl`を の値に設定できます`software.amazon.awssdk.http.crt.AwsCrtSdkHttpService`。

アプリケーションの起動時に設定するには、次のようなコマンドを実行します。

```
java app.jar -Dsoftware.amazon.awssdk.http.async.service.impl=\
software.amazon.awssdk.http.crt.AwsCrtSdkHttpService
```

次のコードスニペットを使用して、アプリケーションコードでシステムプロパティを設定します。

```
System.setProperty("software.amazon.awssdk.http.async.service.impl",
"software.amazon.awssdk.http.crt.AwsCrtSdkHttpService");
```

**注記**  
システムプロパティを使用して AWS CRT ベースの HTTP クライアントの使用を設定する場合は、 `poml.xml` ファイル内の`aws-crt-client`アーティファクトへの依存関係を追加する必要があります。

## CRT AWS ベースの HTTP クライアントの高度な設定
<a name="configuring-the-crt-based-http-client"></a>

接続ヘルス設定や最大アイドル時間など、CRT AWS ベースの HTTP クライアントのさまざまな設定を使用できます。`AwsCrtAsyncHttpClient` で[利用可能な設定オプション](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClient.Builder.html)を確認できます。`AwsCrtHttpClient` にも同じオプションを設定できます。

### 接続のヘルス設定
<a name="connection-health-checks"></a>

CRT ベースの HTTP AWS クライアントの接続ヘルス設定は、HTTP クライアントビルダーの `connectionHealthConfiguration`メソッドを使用して設定できます。

次の例では、接続ヘルス設定と接続の最大アイドル時間で設定された AWS CRT ベースの HTTP クライアントインスタンスを使用する S3 サービスクライアントを作成します。

------
#### [ Synchronous client ]

**インポート**

```
import software.amazon.awssdk.http.crt.AwsCrtHttpClient;
import software.amazon.awssdk.services.s3.S3Client;
import java.time.Duration;
```

**コード**

```
// Singleton: Use the s3Client for all requests.
S3Client s3Client = S3Client.builder()
    .httpClientBuilder(AwsCrtHttpClient
        .builder()
        .connectionHealthConfiguration(builder -> builder
            .minimumThroughputInBps(32000L)
            .minimumThroughputTimeout(Duration.ofSeconds(3)))
        .connectionMaxIdleTime(Duration.ofSeconds(5)))
    .build();

// Perform work with s3Client.

// Requests complete: Close the service client.
s3Client.close();
```

------
#### [ Asynchronous client ]

**インポート**

```
import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient;
import software.amazon.awssdk.services.s3.S3AsyncClient;
import java.time.Duration;
```

**コード**

```
// Singleton: Use the s3AsyncClient for all requests.
S3AsyncClient s3AsyncClient = S3AsyncClient.builder()
    .httpClientBuilder(AwsCrtAsyncHttpClient
        .builder()
        .connectionHealthConfiguration(builder -> builder
            .minimumThroughputInBps(32000L)
            .minimumThroughputTimeout(Duration.ofSeconds(3)))
        .connectionMaxIdleTime(Duration.ofSeconds(5)))
    .build();

// Perform work with s3AsyncClient.

// Requests complete: Close the service client.
s3AsyncClient.close();
```

------

## HTTP/2 サポート
<a name="limitation-the-crt-based-http-client"></a>

HTTP/2 プロトコルは CRT AWS ベースの HTTP クライアントではまだサポートされていませんが、今後のリリースが予定されています。

それまでの間、[KinesisAsyncClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/kinesis/KinesisAsyncClient.html) や [TranscribeStreamingAsyncClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/transcribestreaming/TranscribeStreamingAsyncClient.html) などの HTTP/2 サポートを必要とするサービスクライアントを使用している場合は、代わりに [NettynioAsyncHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/nio/netty/NettyNioAsyncHttpClient.html) の使用を検討してください。

## プロキシ設定例
<a name="http-config-crt-proxy-ex"></a>

次のコードスニペットは、コード内でプロキシの設定を行うために使用する [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/crt/ProxyConfiguration.Builder.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/crt/ProxyConfiguration.Builder.html) の使用方法を示しています。

------
#### [ Synchronous client ]

**インポート**

```
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.crt.AwsCrtHttpClient;
import software.amazon.awssdk.http.crt.ProxyConfiguration;
```

**コード**

```
SdkHttpClient crtHttpClient = AwsCrtHttpClient.builder()
    .proxyConfiguration(ProxyConfiguration.builder()
        .scheme("https")
        .host("myproxy")
        .port(1234)
        .username("username")
        .password("password")
        .nonProxyHosts(Set.of("localhost", "host.example.com"))
        .build())
    .build();
```

------
#### [ Asynchronous client ]

**インポート**

```
import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient;
import software.amazon.awssdk.http.crt.ProxyConfiguration;
```

**コード**

```
SdkAsyncHttpClient crtAsyncHttpClient = AwsCrtAsyncHttpClient.builder()
    .proxyConfiguration(ProxyConfiguration.builder()
        .scheme("https")
        .host("myproxy")
        .port(1234)
        .username("username")
        .password("password")
        .nonProxyHosts(Set.of("localhost", "host.example.com"))
        .build())
    .build();
```

------

プロキシ設定に対応する Java システムプロパティは、以下のコマンドラインスニペットに示されています。

```
$ java -Dhttps.proxyHost=myproxy -Dhttps.proxyPort=1234 -Dhttps.proxyUser=username \
-Dhttps.proxyPassword=password -Dhttp.nonProxyHosts=localhost|host.example.com -cp ... App
```

**重要**  
HTTPS プロキシのシステムプロパティのいずれかを使用するには、`scheme` プロパティをコード内で `https` に設定する必要があります。スキームプロパティがコードで設定されていない場合、スキームのデフォルトは HTTP になり、SDK は `http.*` システムプロパティのみを検索します。

環境変数を使用する同等のセットアップは次のとおりです。

```
// Set the following environment variables.
// $ export HTTPS_PROXY="https://username:password@myproxy:1234"
// $ export NO_PROXY="localhost|host.example.com"

// Set the 'useSystemPropertyValues' to false on the proxy configuration.
SdkAsyncHttpClient crtAsyncHttpClient = AwsCrtAsyncHttpClient.builder()
    .proxyConfiguration(ProxyConfiguration.builder()
        .scheme("https")
        .useSystemPropertyValues(Boolean.FALSE)
        .build())
    .build();

// Run the application.
// $ java -cp ... App
```