

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

# で HTTP クライアントを設定する AWS SDK for Java 2.x
<a name="http-configuration"></a>

 AWS SDK for Java 2.xで、サービスクライアントに使用する HTTP クライアントを変更するとともに、HTTP クライアントのデフォルト設定を変更できます。このセクションでは、HTTP クライアントおよび SDK を設定する方法について説明します。

## Java の SDK で使用可能な HTTP クライアント
<a name="http-clients-available"></a>

### 同期クライアント
<a name="http-config-sync"></a>

SDK for Java の同期 HTTP クライアントは [SdkHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/SdkHttpClient.html) インターフェイスを実装しています。`S3Client` や `DynamoDbClient` などの同期サービスクライアントでは、同期 HTTP クライアントを使用する必要があります。 AWS SDK for Java には 3 つの同期 HTTP クライアントがあります。

**ApacheHttpClient (デフォルト)**  
[ApacheHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ApacheHttpClient.html) は、同期サービスクライアントのデフォルトの HTTP クライアントです。`ApacheHttpClient` の設定の詳細については、「[Apache ベースの HTTP クライアントの設定](http-configuration-apache.md)」を参照してください。

**AwsCrtHttpClient**  
[AwsCrtHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/crt/AwsCrtHttpClient.html) は、高いスループットとノンブロッキング IO を提供します。これは、 AWS 共通ランタイム (CRT) Http クライアント上に構築されています。`AwsCrtHttpClient` の設定と、サービスクライアントと一緒に使用する方法については、「[CRT AWS ベースの HTTP クライアントを設定する](http-configuration-crt.md)」を参照してください。

**UrlConnectionHttpClient**  
アプリケーションが使用する jar とサードパーティライブラリの数を最小限に抑えるには、[UrlConnectionHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClient.html) を使用できます。`UrlConnectionHttpClient` の設定の詳細については、「[URLConnection ベースの HTTP クライアントを設定する](http-configuration-url.md)」を参照してください。

**Apache5HttpClient**  
[Apache5HttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache5/Apache5HttpClient.html) は、Apache 5.x HttpClient 上に構築`ApacheHttpClient`された の更新バージョンです。 * HttpClient バージョン 5.x * は Apache によってアクティブに保守されているバージョンであり、Java 21 の仮想スレッドサポートを含む最新の Java エコシステムの互換性と SLF4J によるログ記録の柔軟性を強化`ApacheHttpClient`することで、 で使用される以前のバージョンが改善されています。 `Apache5HttpClient`は、将来のバージョンの AWS SDK for Java 2.x でデフォルトの同期クライアント`ApacheHttpClient`として を置き換えます。同じ API と機能を備えているため、ドロップイン置換に最適です。`Apache5HttpClient` の設定の詳細については、「[Apache 5.x ベースの HTTP クライアントを設定する](http-configuration-apache5.md)」を参照してください。

### 非同期クライアント
<a name="http-config-async"></a>

SDK for Java の非同期 HTTP クライアントは [SdkAsyncHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/async/SdkAsyncHttpClient.html) インターフェイスを実装しています。`S3AsyncClient` や `DynamoDbAsyncClient` などの非同期サービスクライアントでは、非同期 HTTP クライアントを使用する必要があります。 AWS SDK for Java には 2 つの非同期 HTTP クライアントがあります。

**NettyNioAsyncHttpClient (デフォルト)**  
[NettyNIOAsyncHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/nio/netty/NettyNioAsyncHttpClient.html) は、非同期クライアントが使用するデフォルトの HTTP クライアントです。`NettyNioAsyncHttpClient` の設定の詳細については、「[Netty ベースの HTTP クライアントの設定](http-configuration-netty.md)」を参照してください。

**AwsCrtAsyncHttpClient**  
[AwsCrtAsyncHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClient.html) は、 AWS 共通ランタイム (CRT) HTTP クライアントに基づいています。`AwsCrtAsyncHttpClient` の設定の詳細については、「[CRT AWS ベースの HTTP クライアントを設定する](http-configuration-crt.md)」を参照してください。

## HTTP クライアントの推奨事項
<a name="http-clients-recommend"></a>

HTTP クライアントの実装を選択するには、いくつかの要因が関係します。決定には以下の情報を参考にしてください。

### 推奨事項フローチャート
<a name="http-clients-recommend-flowchart"></a>

以下のフローチャートは、どの HTTP クライアントを使用するかを判断するのに役立つ一般的なガイダンスを示しています。

![\[HTTP クライアント推奨事項のフローチャート。\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/images/JavaDevGuide-HTTPflowchart-DI.png)


### HTTP クライアントの比較
<a name="http-clients-recommend-compare"></a>

以下の表は、各 HTTP クライアントの詳細情報を示しています。


| HTTP クライアント | 同期または非同期 | どのようなときに使うか | 制限/欠点 | 
| --- | --- | --- | --- | 
|  Apache ベースの HTTP クライアント *(デフォルトの同期 HTTP クライアント)*  | 同期 | 高スループットよりも低レイテンシーを好む場合に使用します  | 他の HTTP クライアントと比較して起動時間が遅い | 
| URLConnection ベースの HTTP クライアント | 同期 | サードパーティの依存関係を制限するという厳しい要件がある場合に使用します | Amazon ApiGateway の更新オペレーションなど一部の API で必要な HTTP PATCH メソッドはサポートしていません | 
| AWS CRT ベースの同期 HTTP クライアント1  | 同期 |  • アプリケーションが で実行されている場合に使用します。 AWS Lambda • 低レイテンシーよりも高スループットを好む場合に使用します • 同期 SDK クライアントを好む場合に使用します  |  以下の Java システムプロパティはサポートされなくなりました。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/http-configuration.html)  | 
|  Netty ベースの HTTP クライアント *(デフォルトの非同期 HTTP クライアント)*  | 非同期 |  • アプリケーションが Kinesis API [SubscribeToShard](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_SubscribeToShard.html) などの HTTP/2 サポートを必要とする API を呼び出す場合に使用します  | 他の HTTP クライアントと比較して起動時間が遅い | 
|  AWS CRT ベースの非同期 HTTP クライアント1  | 非同期 | • アプリケーションが AWS Lambdaで実行されている場合に使用します• 低レイテンシーよりも高スループットを好む場合に使用します• 非同期 SDK クライアントを好む場合に使用します |  •`KinesisAsynClient` および `TranscribeStreamingAsyncClient` などの HTTP/2 サポートを必要とするサービスクライアントはサポートしていません 以下の Java システムプロパティはサポートされなくなりました。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/http-configuration.html)  | 

1追加の利点があるため、可能であれば CRT AWS ベースの HTTP クライアントを使用することをお勧めします。

## スマート設定のデフォルト
<a name="http-config-smart-defaults"></a>

 AWS SDK for Java 2.x (バージョン 2.17.102 以降) には、スマート設定のデフォルト機能が用意されています。この機能は、HTTP クライアントの 2 つのプロパティと HTTP クライアントに影響しない他のプロパティを最適化します。

スマート設定のデフォルトは、指定したデフォルトモードの値に基づいて、`connectTimeoutInMillis` および `tlsNegotiationTimeoutInMillis` プロパティに適切な値を設定します。デフォルトモードの値は、アプリケーションの特性に基づいて選択します。

スマート設定のデフォルトおよびアプリケーションに最適なデフォルトモードの値を選択する方法の詳細については、「[AWS SDKs and Tools リファレンスガイド](https://docs.aws.amazon.com/sdkref/latest/guide/feature-smart-config-defaults.html)」を参照してください。

アプリケーションのデフォルトモードを設定する 4 つの方法は以下のとおりです。

------
#### [ Service client ]

サービスクライアントビルダーを使用して、サービスクライアントでデフォルトモードを直接設定します。以下の例は、`DynamoDbClient` のデフォルトモードの出力形式を `auto` に設定します。

```
DynamoDbClient ddbClient = DynamoDbClient.builder()
                            .defaultsMode(DefaultsMode.AUTO)
                            .build();
```

------
#### [ System property ]

`aws.defaultsMode` システムプロパティを使用してデフォルトモードを指定できます。Java でシステムプロパティを設定する場合は、サービスクライアントを初期化する前にプロパティを設定する必要があります。

以下の例は、Java のシステムプロパティを使用して `auto` にデフォルトモードを設定する方法を示しています。

```
System.setProperty("aws.defaultsMode", "auto");
```

以下の例は、`java` コマンドの `-D` オプションを使用して `auto` にデフォルトモードを設定する方法を示しています。

```
java -Daws.defaultsMode=auto
```

------
#### [ Environment variable ]

環境変数 `AWS_DEFAULTS_MODE` の値を設定して、アプリケーションのデフォルトモードを選択します。

以下の情報は、環境変数を使用して `auto` にデフォルトモードの値を設定するコマンドを示しています。


| オペレーティングシステム | 環境変数を設定するコマンド | 
| --- | --- | 
|  Linux、macOS、または Unix  | export AWS\$1DEFAULTS\$1MODE=auto | 
|  Server   | set AWS\$1DEFAULTS\$1MODE=auto | 

------
#### [ AWS config file ]

次の例に示すように、設定`defaults_mode`プロパティを共有 AWS `config`ファイルに追加できます。

```
[default]
defaults_mode = auto
```

------

システムプロパティ、環境変数、または AWS 設定ファイルを使用してデフォルトモードをグローバルに設定すると、HTTP クライアントを構築するときに設定を上書きできます。

`httpClientBuilder()` メソッドで HTTP クライアントを構築すると、設定は構築するインスタンスにのみ適用されます。この例を[こちら](http-configuration-netty.md#http-config-netty-one-client)に示します。この例の Netty ベースの HTTP クライアントは、`connectTimeoutInMillis` および `tlsNegotiationTimeoutInMillis` にグローバルに設定されているデフォルトモード値のをすべて上書きします。

# Apache ベースの HTTP クライアントの設定
<a name="http-configuration-apache"></a>

の同期サービスクライアントは、デフォルトで Apache ベースの HTTP クライアントである [ApacheHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ApacheHttpClient.html) AWS SDK for Java 2.x を使用します。SDK の `ApacheHttpClient` は Apache[HttpClient](https://hc.apache.org/httpcomponents-client-4.5.x/index.html) をベースにしています。

SDK には [URLConnectionHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClient.html) も用意されており、ロードは速くなりますが、機能が少なくなっています。`UrlConnectionHttpClient` の設定の詳細については、「[URLConnection ベースの HTTP クライアントを設定する](http-configuration-url.md)」を参照してください。

`ApacheHttpClient` で使用できるすべての設定オプションを確認するには、「[ApacheHttpClient.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ApacheHttpClient.Builder.html)」と「[ProxyConfiguration.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ProxyConfiguration.Builder.html)」を参照してください。

## `ApacheHttpClient` へのアクセス
<a name="http-apache-dependency"></a>

ほとんどの場合、明示的な設定を行わずに `ApacheHttpClient` を使用することになります。サービスクライアントを宣言すると、SDK が標準値を使用して `ApacheHttpClient` を自動的に設定します。

`ApacheHttpClient` を明示的に設定したり、複数のサービスクライアントで使用したりする場合は、設定できるようにする必要があります。

### 設定が不要です
<a name="http-config-apache-no-config"></a>

Maven でサービスクライアントへの依存関係を宣言すると、SDK は `apache-client` アーティファクトに*ランタイム*依存関係を追加します。これにより、コンパイル時ではなく、ランタイム時にその `ApacheHttpClient` クラスをコードで使用できるようになります。Apache ベースの HTTP クライアントを設定していない場合は、依存関係を指定する必要はありません。

次の Maven `pom.xml` ファイルの XML スニペットでは、`<artifactId>s3</artifactId>` で宣言された依存関係によって Apache ベースの HTTP クライアントが自動的に取り込まれます。そのために依存関係を特別に宣言する必要はありません。

```
<dependencyManagement>
   <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>bom</artifactId>
            <version>2.27.21</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <!-- The s3 dependency automatically adds a runtime dependency on the ApacheHttpClient-->
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>s3</artifactId>
    </dependency>
</dependencies>
```

これらの依存関係では、`ApacheHttpClient` ライブラリはランタイムのクラスパス上にのみ存在するため、明示的に HTTP 設定を変更することはできません。

### 設定が必要です
<a name="http-config-apache-yes-config"></a>

`ApacheHttpClient` を設定するには、*コンパイル*時間に `apache-client` ライブラリに依存関係を追加する必要があります。

次の Maven `pom.xml` ファイルの例を参照して、「`ApacheHttpClient`」を設定します。

```
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>software.amazon.awssdk</groupId>
                <artifactId>bom</artifactId>
                <version>2.27.21</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3</artifactId>
        </dependency>
        <!-- By adding the apache-client dependency, ApacheHttpClient will be added to 
             the compile classpath so you can configure it. -->
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>apache-client</artifactId>
        </dependency>
    </dependencies>
```

## `ApacheHttpClient` を使用および設定する
<a name="http-apache-config"></a>

サービスクライアントを構築すると同時に `ApacheHttpClient` のインスタンスを設定することも、複数のサービスクライアントで共有するために単一のインスタンスを設定することもできます。

いずれの方法でも、`[ApacheHttpClient.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ApacheHttpClient.Builder.html)` を使用して Apache ベースの HTTP クライアントのプロパティを設定します。

### ベストプラクティス: `ApacheHttpClient` インスタンスをサービスクライアント専用にする
<a name="http-config-apache-recomm"></a>

`ApacheHttpClient` のインスタンスを設定する必要がある場合は、専有 `ApacheHttpClient` インスタンスを構築することをお勧めします。これを行うには、サービスクライアントのビルダーの `httpClientBuilder` メソッドを使用します。この方法では、HTTP クライアントのライフサイクルが SDK によって管理されるため、不要になったときに `ApacheHttpClient` インスタンスを閉じなかった場合にメモリリークが発生するのを防ぐことができます。

次の例では、`S3Client` を作成して、`maxConnections` と `connectionTimeout` の値で `ApacheHttpClient` の埋め込みインスタンス設定します。HTTP インスタンスは、`S3Client.Builder` の`httpClientBuilder` メソッドを使用して作成されます。

 **インポート** 

```
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.services.s3.S3Client;
import java.time.Duration;
```

 **コード** 

```
S3Client s3Client = S3Client   // Singleton: Use the s3Client for all requests.
    .builder()
    .httpClientBuilder(ApacheHttpClient.builder()
        .maxConnections(100)
        .connectionTimeout(Duration.ofSeconds(5))
    ).build();

// Perform work with the s3Client.

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

### 別の方法: `ApacheHttpClient` インスタンスを共有する
<a name="http-config-apache-alt"></a>

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

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

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

**インポート**

```
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.s3.S3Client;
```

 **コード** 

```
SdkHttpClient apacheHttpClient = ApacheHttpClient.builder()
        .maxConnections(100).build();

// Singletons: Use the s3Client and dynamoDbClient for all requests.
S3Client s3Client = 
    S3Client.builder()
            .httpClient(apacheHttpClient).build();

DynamoDbClient dynamoDbClient = 
    DynamoDbClient.builder()
                  .httpClient(apacheHttpClient).build();

// Perform work with the s3Client and dynamoDbClient.

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

## プロキシの設定例
<a name="http-configuration-apache-proxy-conf-ex"></a>

次のコードスニペットは、[Apache HTTP クライアントのプロキシ設定ビルダー](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ProxyConfiguration.Builder.html)を使用しています。

```
SdkHttpClient apacheHttpClient = ApacheHttpClient.builder()
                .proxyConfiguration(ProxyConfiguration.builder()
                        .endpoint(URI.create("http://example.com:1234"))
                        .username("username")
                        .password("password")
                        .addNonProxyHost("localhost")
                        .addNonProxyHost("host.example.com")
                        .build())
                .build();
```

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

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

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

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

// Set the 'useSystemPropertyValues' to false on the proxy configuration.
SdkHttpClient apacheHttpClient = ApacheHttpClient.builder()
                .proxyConfiguration(ProxyConfiguration.builder()
                        .useSystemPropertyValues(Boolean.FALSE)
                        .build())
                .build();

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

**注記**  
Apache HTTP クライアントは現在 HTTPS プロキシシステムプロパティまたは HTTPS\$1PROXY 環境変数をサポートしていません。

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

 AWS SDK for Java 2.x は、デフォルトの `[UrlConnectionHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClient.html)` と比較して軽量の HTTP クライアントを提供します`ApacheHttpClient`。`UrlConnectionHttpClient` は Java `[URLConnection](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/net/URLConnection.html)` をベースにしています。

`UrlConnectionHttpClient` は Apache ベースの HTTP クライアントよりも読み取りが速くなりますが、機能は限られています。読み取りが速いため、Java AWS Lambda 関数に[適したソリューション](lambda-optimize-starttime.md)です。

`UrlConnectionHttpClient` には、アクセスができる[設定可能なオプション](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClient.Builder.html)がいくつかあります。

**注記**  
`UrlConnectionHttpClient` は HTTP PATCH メソッドをサポートしていません。  
少数の AWS API オペレーションには PATCH リクエストが必要です。これらのオペレーション名は通常、`Update*` で始まります。次にいくつかの例を示します。  
 AWS Security Hub CSPM API の[いくつかの`Update*`オペレーション](https://docs.aws.amazon.com/securityhub/1.0/APIReference/API_Operations.html)と [BatchUpdateFindings](https://docs.aws.amazon.com/securityhub/1.0/APIReference/API_BatchUpdateFindings.html) オペレーション
すべての Amazon API Gateway API [`Update*` オペレーション](https://docs.aws.amazon.com/apigateway/latest/api/API_UpdateAccount.html)
を使用する場合は`UrlConnectionHttpClient`、まず、 AWS のサービス 使用している の API リファレンスを参照してください。必要なオペレーションに PATCH オペレーションが使用されているかどうかを確認してください。

## `UrlConnectionHttpClient` へのアクセス
<a name="http-url-dependency"></a>

`UrlConnectionHttpClient` を設定して使用するには、`pom.xml` ファイル内の `url-connection-client` Maven アーティファクトへの依存関係を宣言します。

`ApacheHttpClient` とは異なり、`UrlConnectionHttpClient` はプロジェクトに自動的に追加されないため、明示的に宣言する必要があります。

次の `pom.xml` ファイル例は、HTTP クライアントの使用と設定に必要な依存関係を示しています。

```
<dependencyManagement>
   <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>bom</artifactId>
            <version>2.27.21</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<!-- other dependencies such as s3 or dynamodb -->

<dependencies>
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>url-connection-client</artifactId>
    </dependency>
</dependencies>
```

## `UrlConnectionHttpClient` を使用および設定する
<a name="http-url-config"></a>

サービスクライアントを構築すると同時に `UrlConnectionHttpClient` のインスタンスを設定することも、単一インスタンスを複数のサービスクライアント間で共有するように設定することもできます。

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

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

`UrlConnectionHttpClient` のインスタンスを設定する必要がある場合は、専有 `UrlConnectionHttpClient` インスタンスを構築することをお勧めします。これを行うには、サービスクライアントのビルダーの `httpClientBuilder` メソッドを使用します。この方法では、HTTP クライアントのライフサイクルが SDK によって管理されるため、不要になったときに `UrlConnectionHttpClient` インスタンスを閉じなかった場合にメモリリークが発生するのを防ぐことができます。

次の例では、`S3Client` を作成して、`socketTimeout` と `proxyConfiguration` の値で `UrlConnectionHttpClient` の埋め込みインスタンス設定します。`proxyConfiguration` メソッドは、タイプ ` Consumer<[ProxyConfiguration.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/ProxyConfiguration.Builder.html)>` の Java Lambda 式を取ります。

 **インポート** 

```
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
import java.net.URI;
import java.time.Duration;
```

 **コード** 

```
// Singleton: Use the s3Client for all requests.
S3Client s3Client = 
    S3Client.builder()
            .httpClientBuilder(UrlConnectionHttpClient.builder()
                    .socketTimeout(Duration.ofMinutes(5))
                    .proxyConfiguration(proxy -> proxy.endpoint(URI.create("http://proxy.mydomain.net:8888"))))
            .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
            .build();

// Perform work with the s3Client.

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

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

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

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

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

**インポート**

```
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.urlconnection.ProxyConfiguration;
import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.s3.S3Client;
import java.net.URI;
import java.time.Duration;
```

 **コード** 

```
SdkHttpClient urlHttpClient = UrlConnectionHttpClient.create();

// Singletons: Use the s3Client and dynamoDbClient for all requests.
S3Client s3Client = 
    S3Client.builder()
            .httpClient(urlHttpClient)
            .defaultsMode(DefaultsMode.IN_REGION)
            .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
            .build();

DynamoDbClient dynamoDbClient = 
    DynamoDbClient.builder()
                  .httpClient(urlHttpClient)
                  .defaultsMode(DefaultsMode.IN_REGION)
                  .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
                  .build();

// Perform work with the s3Client and dynamoDbClient.

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

#### `URLConnectionHttpClient` と `ApacheHttpClient` を同時に使用する
<a name="http-config-url-caveat"></a>

アプリケーション内で `UrlConnectionHttpClient` を使用するときは、各サービスクライアントに `URLConnectionHttpClient` インスタンス、またはサービスクライアントビルダーの `httpClientBuilder` メソッドを使用して `ApacheHttpClient` インスタンスを提供する必要があります。

プログラムが複数のサービスクライアントを使用していて、次の両方に該当すると、例外が発生します。
+ 1 つのサービスクライアントが `UrlConnectionHttpClient` のインスタンスを使用するように設定されています。
+ 別のサービスクライアントは、`httpClient()` または `httpClientBuilder()` メソッドで明示的に構築せずにデフォルト `ApacheHttpClient` を使用します。

例外は、クラスパス上に複数の HTTP 実装が見つかったことを示します。

次のコードスニペット例では例外が発生します。

```
// The dynamoDbClient uses the UrlConnectionHttpClient
DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
        .httpClient(UrlConnectionHttpClient.create())
        .build();

// The s3Client below uses the ApacheHttpClient at runtime, without specifying it.
// An SdkClientException is thrown with the message that multiple HTTP implementations were found on the classpath.
S3Client s3Client = S3Client.create();

// Perform work with the s3Client and dynamoDbClient.

dynamoDbClient.close();
s3Client.close();
```

`S3Client` を `ApacheHttpClient` で明示的に設定することで、例外を回避できます。

```
DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
        .httpClient(UrlConnectionHttpClient.create())
        .build();

S3Client s3Client = S3Client.builder()
        .httpClient(ApacheHttpClient.create())    // Explicitly build the ApacheHttpClient.
        .build();

// Perform work with the s3Client and dynamoDbClient.

dynamoDbClient.close();
s3Client.close();
```

**注記**  
`ApacheHttpClient` を明示的に作成するには、Maven プロジェクトファイル内の `apache-client` アーティファクトへの[依存関係を追加する](http-configuration-apache.md#http-apache-dependency)必要があります。

## プロキシ設定例
<a name="http-configuration-url-proxy-conf-ex"></a>

次のコードスニペットでは、[URL 接続 HTTP クライアントのプロキシ設定ビルダー](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/ProxyConfiguration.Builder.html)を使用しています。

```
SdkHttpClient urlHttpClient = UrlConnectionHttpClient.builder()
                .proxyConfiguration(ProxyConfiguration.builder()
                        .endpoint(URI.create("http://example.com:1234"))
                        .username("username")
                        .password("password")
                        .addNonProxyHost("localhost")
                        .addNonProxyHost("host.example.com")
                        .build())
                .build();
```

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

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

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

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

// Set the 'useSystemPropertyValues' to false on the proxy configuration.
SdkHttpClient apacheHttpClient = UrlConnectionHttpClient.builder()
                .proxyConfiguration(ProxyConfiguration.builder()
                        .useSystemPropertyValues(Boolean.FALSE)
                        .build())
                .build();

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

**注記**  
URL 接続 ベースの HTTP クライアントは、現在 HTTPS プロキシシステムプロパティまたは HTTPS\$1PROXY 環境変数をサポートしていません。

# Netty ベースの HTTP クライアントの設定
<a name="http-configuration-netty"></a>

の非同期オペレーションのデフォルトの HTTP クライアント AWS SDK for Java 2.x は、Netty ベースの [NettyNioAsyncHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/nio/netty/NettyNioAsyncHttpClient.html) です。Netty ベースのクライアントは、[Netty プロジェクト](https://netty.io/)の非同期イベント駆動型ネットワークフレームワークに基づいています。

別の HTTP クライアントとして、新しい [AWS CRT ベースの HTTP クライアント](http-configuration-crt.md)を使用することもできます。このトピックでは、`NettyNioAsyncHttpClient` を設定する方法を示します。

## `NettyNioAsyncHttpClient` へのアクセス
<a name="http-config-netty-access"></a>

ほとんどの場合、非同期プログラムでは明示的な設定を行わずに `NettyNioAsyncHttpClient` を使用します。非同期サービスクライアントを宣言すると、SDK が標準値を使用して `NettyNioAsyncHttpClient` を自動的に設定します。

`NettyNioAsyncHttpClient` を明示的に設定したり、複数のサービスクライアントで使用したりする場合は、設定できるようにする必要があります。

### 設定が不要です
<a name="http-config-netty-no-config"></a>

Maven でサービスクライアントへの依存関係を宣言すると、SDK は `netty-nio-client` アーティファクトに*ランタイム*依存関係を追加します。これにより、コンパイル時ではなく、ランタイム時にその `NettyNioAsyncHttpClient` クラスをコードで使用できるようになります。Netty ベースの HTTP クライアントを設定しない場合は、そのクライアントへの依存関係を指定する必要はありません。

次の Maven `pom.xml` ファイルの XML スニペットでは、`<artifactId>dynamodb-enhanced</artifactId>` で宣言された依存関係によって Netty ベースの HTTP クライアントが推移的に取り込まれます。そのために依存関係を特別に宣言する必要はありません。

```
<dependencyManagement>
   <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>bom</artifactId>
            <version>2.27.21</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>dynamodb-enhanced</artifactId>
    </dependency>
</dependencies>
```

これらの依存関係では、`NettyNioAsyncHttpClient` ライブラリランタイムクラスパス上にのみ存在するため、HTTP 設定を変更することはできません。

### 設定が必要です
<a name="http-config-netty-yes-config"></a>

`NettyNioAsyncHttpClient` を設定するには、*コンパイル*時に `netty-nio-client` アーティファクトへの依存関係を追加する必要があります。

次の Maven `pom.xml` ファイルの例を参照して、「`NettyNioAsyncHttpClient`」を設定します。

```
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>software.amazon.awssdk</groupId>
                <artifactId>bom</artifactId>
                <version>2.27.21</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>dynamodb-enhanced</artifactId>
        </dependency>
        <!-- By adding the netty-nio-client dependency, NettyNioAsyncHttpClient will be 
             added to the compile classpath so you can configure it. -->
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>netty-nio-client</artifactId>
        </dependency>
    </dependencies>
```

## `NettyNioAsyncHttpClient` を使用および設定する
<a name="http-netty-config"></a>

サービスクライアントを構築すると同時に `NettyNioAsyncHttpClient` のインスタンスを設定することも、複数のサービスクライアントで共有するために単一のインスタンスを設定することもできます。

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

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

`NettyNioAsyncHttpClient` のインスタンスを設定する必要がある場合は、専有 `NettyNioAsyncHttpClient` インスタンスを構築することをお勧めします。これを行うには、サービスクライアントのビルダーの `httpClientBuilder` メソッドを使用します。この方法では、HTTP クライアントのライフサイクルが SDK によって管理されるため、不要になったときに `NettyNioAsyncHttpClient` インスタンスを閉じなかった場合にメモリリークが発生するのを防ぐことができます。

次の例では、`DynamoDbEnhancedAsyncClient` インスタンスが使用する `DynamoDbAsyncClient` インスタンスを作成します。`DynamoDbAsyncClient` インスタンスには、`connectionTimeout` と `maxConcurrency` 値を持つ `NettyNioAsyncHttpClient` インスタンスが含まれています。HTTP インスタンスは `DynamoDbAsyncClient.Builder` の `httpClientBuilder` メソッドを使用して作成されます。

 **インポート** 

```
import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider;
import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedAsyncClient;
import software.amazon.awssdk.enhanced.dynamodb.extensions.AutoGeneratedTimestampRecordExtension;
import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;
import java.time.Duration;
```

 **コード** 

```
// DynamoDbAsyncClient is the lower-level client used by the enhanced client.
DynamoDbAsyncClient dynamoDbAsyncClient = 
    DynamoDbAsyncClient
        .builder()
            .httpClientBuilder(NettyNioAsyncHttpClient.builder()
            .connectionTimeout(Duration.ofMillis(5_000))
            .maxConcurrency(100)
            .tlsNegotiationTimeout(Duration.ofMillis(3_500)))
        .defaultsMode(DefaultsMode.IN_REGION)
        .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
        .build();

// Singleton: Use dynamoDbAsyncClient and enhancedClient for all requests.
DynamoDbEnhancedAsyncClient enhancedClient = 
    DynamoDbEnhancedAsyncClient
        .builder()
        .dynamoDbClient(dynamoDbAsyncClient)
        .extensions(AutoGeneratedTimestampRecordExtension.create())
        .build();

// Perform work with the dynamoDbAsyncClient and enhancedClient.

// Requests completed: Close dynamoDbAsyncClient.
dynamoDbAsyncClient.close();
```

### 代替アプローチ: `NettyNioAsyncHttpClient` インスタンスを共有する
<a name="http-config-netty-multi-clients"></a>

アプリケーションのリソースとメモリの使用量を低く抑えるため、`NettyNioAsyncHttpClient` を構成して複数のサービスクライアント間で共有できます。HTTP 接続プールは共有されるため、リソースの使用量が少なくなります。

**注記**  
`NettyNioAsyncHttpClient` インスタンスを共有する場合、それを破棄する準備が整った時点でインスタンスを閉じる必要があります。サービスクライアントが閉じられても、SDK はインスタンスを閉じません。

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

**インポート**

```
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.s3.S3Client;
```

 **コード** 

```
// Create a NettyNioAsyncHttpClient shared instance.
SdkAsyncHttpClient nettyHttpClient = NettyNioAsyncHttpClient.builder().maxConcurrency(100).build();

// Singletons: Use the s3AsyncClient, dbAsyncClient, and enhancedAsyncClient for all requests.
S3AsyncClient s3AsyncClient = 
    S3AsyncClient.builder()
                 .httpClient(nettyHttpClient)
                 .build();

DynamoDbAsyncClient dbAsyncClient = 
    DynamoDbAsyncClient.builder()
                       .httpClient(nettyHttpClient)
                       .defaultsMode(DefaultsMode.IN_REGION)
                       .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
                       .build();

DynamoDbEnhancedAsyncClient enhancedAsyncClient = 
    DynamoDbEnhancedAsyncClient.builder()
                               .dynamoDbClient(dbAsyncClient)
                               .extensions(AutoGeneratedTimestampRecordExtension.create())
                               .build();

// Perform work with s3AsyncClient, dbAsyncClient, and enhancedAsyncClient.

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

## ALPN プロトコルネゴシエーションの設定
<a name="http-netty-config-alpn"></a>

ALPN (Application-Layer Protocol Negotiation) は、アプリケーションレイヤーがどのプロトコルを安全な接続で実行するかをネゴシエートして、追加のラウンドトリップを回避し、パフォーマンスを向上させることができるようにする TLS 拡張機能です。

Netty ベースの HTTP クライアントが ALPN を使用できるようにするには、次のスニペットに示すようにビルダーメソッドを呼び出します。

```
import software.amazon.awssdk.http.Protocol;
import software.amazon.awssdk.http.ProtocolNegotiation;
import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;
import software.amazon.awssdk.services.transcribestreaming.TranscribeStreamingAsyncClient;


// Configure the Netty-based HTTP client to use the ALPN protocol.
SdkAsyncHttpClient nettyClient = NettyNioAsyncHttpClient.builder()
                                                        .protocol(Protocol.HTTP2)
                                                        .protocolNegotiation(ProtocolNegotiation.ALPN)
                                                        .build();
// Use the Netty-based HTTP client with a service client.
TranscribeStreamingAsyncClient transcribeClient = TranscribeStreamingAsyncClient.builder()
                                                                                .httpClient(nettyClient)
                                                                                .build();
```

前のスニペットに示すように、ALPN プロトコルネゴシエーションは現在 HTTP/2 プロトコルでのみ機能します。

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

次のコードスニペットは [Netty HTTP クライアントのプロキシ設定ビルダー](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/nio/netty/ProxyConfiguration.Builder.html)を使用しています。

```
SdkAsyncHttpClient nettyHttpClient = NettyNioAsyncHttpClient.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 nettyHttpClient = NettyNioAsyncHttpClient.builder()
    .proxyConfiguration(ProxyConfiguration.builder()
        .useSystemPropertyValues(Boolean.FALSE)
        .build())
    .build();

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

# 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
```

# HTTP プロキシの設定
<a name="http-config-proxy-support"></a>

HTTP プロキシを設定するには、コードを使用するか、Java システムプロパティを設定するか、環境変数を設定します。

## コードでの設定
<a name="http-config-proxy-support-in-code"></a>

サービスクライアントをビルドするときに、クライアント固有の `ProxyConfiguration` ビルダーを使用してコードでプロキシを設定します。次のコードは、Amazon S3 サービスクライアントで使用される Apache ベースの HTTP クライアントのプロキシ設定の例です。

```
SdkHttpClient httpClient1 = ApacheHttpClient.builder()
    .proxyConfiguration(ProxyConfiguration.builder()
        .endpoint(URI.create("http://proxy.example.com"))
        .username("username")
        .password("password")
        .addNonProxyHost("localhost")
        .build())
    .build();

S3Client s3Client = S3Client.builder()
    .httpClient(httpClient)
    .build();
```

このトピックの各 HTTP クライアントのセクションでは、プロキシ設定の例を示しています。
+ [Apache HTTP クライアント](http-configuration-apache.md#http-configuration-apache-proxy-conf-ex)
+ [URLConnection ベースの HTTP クライアント](http-configuration-url.md#http-configuration-url-proxy-conf-ex)
+ [Netty ベースの HTTP クライアント](http-configuration-netty.md#http-config-netty-proxy-ex)
+ [AWS CRT ベースの HTTP クライアント](http-configuration-crt.md#http-config-crt-proxy-ex)

## 外部設定での HTTP プロキシの設定
<a name="http-config-proxy-support-external"></a>

コードで `ProxyConfiguration` ビルダーを明示的に使用していない場合でも、SDK は外部設定を検索してデフォルトのプロキシ設定を構成します。

デフォルトでは、SDK はまず JVM システムプロパティを検索します。プロパティが 1 つでも見つかった場合、SDK はその値と、他のシステムプロパティの値を使用します。使用可能なシステムプロパティがない場合、SDK はプロキシ環境変数を検索します。

SDK では、次の Java システムプロパティと環境変数を使用できます。


**Java のシステムプロパティ**  

| システムプロパティ | 説明 | HTTP クライアントのサポート | 
| --- | --- | --- | 
|  HTTP.プロキシホスト  |  HTTP プロキシサーバーのホスト名  |  すべて  | 
|  http.proxyPort  |  HTTP プロキシサーバーのポート番号  |  すべて  | 
| http.proxyUser |  HTTP プロキシ認証用のユーザー名  |  すべて  | 
|  http.proxyPassword  | HTTP プロキシ認証用のパスワード |  すべて  | 
| http.nonProxyHosts |  プロキシをバイパスして直接アクセスする必要があるホストのリスト。[このリストは、HTTPS を使用する場合にも有効です](https://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html)。  |  すべて  | 
| https.proxyHost |  HTTPS プロキシサーバーのホスト名  |  ネッティ、CRT  | 
|  https.proxyPort  |  HTTPS プロキシサーバーのポート番号  |  ネッティ、CRT  | 
| https.proxyUser |  HTTPS プロキシ認証用のユーザー名  | ネッティ、CRT | 
| https.proxyPassword | HTTPS プロキシ認証用のパスワード | ネッティ、CRT | 


**環境変数**  

| 環境変数 | 説明 | HTTP クライアントのサポート | 
| --- | --- | --- | 
| HTTP\$1PROXY1 |  HTTP のスキームを持つ有効な URL  |  すべて  | 
|  HTTPS\$1PROXY1  |  HTTPS のスキームを持つ有効な URL  |  ネッティ、CRT  | 
| NO\$1PROXY2 |  プロキシをバイパスして直接アクセスする必要があるホストのリスト。このリストは、HTTP と HTTPS の両方で有効です。  |  すべて  | 

### キーと脚注の表示
<a name="http-config-proxy-support-ext-key-footnote"></a>

**すべて** - SDK が提供するすべての HTTP クライアント — `UrlConnectionHttpClient`、`ApacheHttpClient`、`NettyNioAsyncHttpClient`、`AwsCrtAsyncHttpClient`。

**Netty** - Netty ベースの HTTP クライアント (`NettyNioAsyncHttpClient`)。

**CRT** - CRT AWS ベースの HTTP クライアント (`AwsCrtHttpClient` および `AwsCrtAsyncHttpClient`)。

1クエリされる環境変数は、 `HTTP_PROXY` か `HTTPS_PROXY` かにかかわらず、クライアントの `ProxyConfiguration` のスキーム設定によって異なります。デフォルトのスキームは HTTP です。次のスニペットは、環境変数の解決に使用される HTTPS にスキームを変更する方法を示しています。

```
SdkHttpClient httpClient = ApacheHttpClient.builder()
    .proxyConfiguration(ProxyConfiguration.builder()
        .scheme("https")
        .build())
    .build();
```

2 `NO_PROXY` 環境変数は、ホスト名間の「\$1」区切り文字と「,」区切り文字の組み合わせをサポートしています。ホスト名には「\$1」ワイルドカードを含めることができます。

## 設定の組み合わせの使用
<a name="http-config-proxy-support-combo"></a>

コード、システムプロパティ、環境変数で、HTTP プロキシ設定を組み合わせて使用できます。

**Example – システムプロパティとコードによる設定**  

```
// Command line with the proxy password set as a system property.
$ java -Dhttp.proxyPassword=SYS_PROP_password -cp ... App

// Since the 'useSystemPropertyValues' setting is 'true' (the default), the SDK will supplement 
// the proxy configuration in code with the 'http.proxyPassword' value from the system property.
SdkHttpClient apacheHttpClient = ApacheHttpClient.builder()
            .proxyConfiguration(ProxyConfiguration.builder()
                    .endpoint(URI.create("http://localhost:1234"))
                    .username("username")
                    .build())
            .build();

// Use the apache HTTP client with proxy configuration.
DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
                    .httpClient(apacheHttpClient)
                    .build();
```
SDK は次のプロキシ設定を解決します。  

```
Host = localhost
Port = 1234
Password = SYS_PROP_password
UserName = username
Non ProxyHost = null
```

**Example – システムプロパティと環境変数の両方が利用可能**  
各 HTTP クライアントの `ProxyConfiguration` ビルダーは、 `useSystemPropertyValues` および `useEnvironmentVariablesValues` という名前の設定を提供します。デフォルトでは、両方の設定は `true` です。`true` の場合、SDK は `ProxyConfiguration` ビルダーでは提供されないオプションに対して、システムプロパティまたは環境変数の値を自動的に使用します。  
システムプロパティは環境変数より優先されます。HTTP プロキシシステムプロパティが見つかった場合、SDK はシステムプロパティから***すべての***値を取得し、環境変数からは取得しません。システムプロパティよりも環境変数を優先する場合は、 `useSystemPropertyValues` を `false` に設定します。
この例では、次の設定がランタイムとして使用できます。  

```
// System properties 
http.proxyHost=SYS_PROP_HOST.com
http.proxyPort=2222
http.password=SYS_PROP_PASSWORD
http.user=SYS_PROP_USER

// Environment variables 
HTTP_PROXY="http://EnvironmentUser:EnvironmentPassword@ENV_VAR_HOST:3333"
NO_PROXY="environmentnonproxy.host,environmentnonproxy2.host:1234"
```
次のいずれかのステートメントでサービスクライアントが作成されます。どのステートメントもプロキシ設定を明示的に設定しません。  

```
DynamoDbClient client = DynamoDbClient.create();
DynamoDbClient client = DynamoDbClient.builder().build();
DynamoDbClient client = DynamoDbClient.builder()
    .httpClient(ApacheHttpClient.builder()
        .proxyConfiguration(ProxyConfiguration.builder()
            .build())
        .build())
    .build();
```
次のプロキシ設定は SDK によって解決されます。  

```
Host = SYS_PROP_HOST.com
Port = 2222
Password = SYS_PROP_PASSWORD
UserName = SYS_PROP_USER
Non ProxyHost = null
```
サービスクライアントにはデフォルトのプロキシ設定があるため、SDK はシステムプロパティを検索し、次に環境変数を検索します。システムプロパティ設定は環境変数よりも優先されるため、SDK はシステムプロパティのみを使用します。  
次のコードに示すように、システムプロパティの使用が `false` に変更された場合、SDK は環境変数のみを解決します。  

```
DynamoDbClient client = DynamoDbClient.builder()
    .httpClient(ApacheHttpClient.builder()
        .proxyConfiguration(ProxyConfiguration.builder()
            .useSystemPropertyValues(Boolean.FALSE)
            .build())
        .build())
    .build();
```
HTTP を使用した解決済みのプロキシ設定は次のとおりです。  

```
Host = ENV_VAR_HOST
Port = 3333
Password = EnvironmentPassword
UserName = EnvironmentUser
Non ProxyHost = environmentnonproxy.host, environmentnonproxy2.host:1234
```

# Apache 5.x ベースの HTTP クライアントを設定する
<a name="http-configuration-apache5"></a>

## Apache5HttpClient にアクセスする
<a name="http-apache-5-dependency"></a>

を使用するには、 に依存関係を追加**apache5-client**し、サービスクライアント`Apache5HttpClient`で明示的に を設定`Apache5HttpClient`する必要があります。

```
<dependencyManagement>
   <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>bom</artifactId>
            <version>2.41.0*</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>s3</artifactId>
    </dependency>
    
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>apache5-client</artifactId>
    </dependency>
</dependencies>
```

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

### `Apache5HttpClient` を使用および設定する
<a name="http-config-apache-5-config"></a>

サービスクライアントを構築すると同時に `Apache5HttpClient` のインスタンスを設定することも、単一インスタンスを複数のサービスクライアント間で共有するように設定することもできます。

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

#### ベストプラクティス: Apache5HttpClient インスタンスをサービスクライアント専用にする
<a name="http-apache5-dedicated-instance"></a>

`Apache5HttpClient` のインスタンスを設定する必要がある場合は、専有 `Apache5HttpClient` インスタンスを構築することをお勧めします。これを行うには、サービスクライアントのビルダーの httpClientBuilder メソッドを使用します。この方法では、HTTP クライアントのライフサイクルが SDK によって管理されるため、不要になったときに `Apache5HttpClient` インスタンスを閉じなかった場合にメモリリークが発生するのを防ぐことができます。

次の例では、S3Client を作成し、maxConnections と connectionTimeout 値`Apache5HttpClient`を使用して の埋め込みインスタンスを設定します。HTTP インスタンスは、`S3Client.Builder` のメソッド `httpClientBuilder` を使用して作成されます。

**インポート**

```
import software.amazon.awssdk.http.apache5.Apache5HttpClient;
import software.amazon.awssdk.services.s3.S3Client;
import java.time.Duration;
```

**[コード]**

```
S3Client s3Client = S3Client   // Singleton: Use the s3Client for all requests.
    .builder()
    .httpClientBuilder(Apache5HttpClient.builder()
        .maxConnections(100)
        .connectionTimeout(Duration.ofSeconds(5))
    )
    .build();

// Perform work with the s3Client.

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

#### 別の方法: `Apache5HttpClient` インスタンスを共有する
<a name="http-apache5-shared-instance"></a>

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

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

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

**インポート**

```
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.apache5.Apache5HttpClient;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.s3.S3Client;
```

**[コード]**

```
SdkHttpClient apache5HttpClient = Apache5HttpClient.builder()
        .maxConnections(100).build();

// Singletons: Use the s3Client and dynamoDbClient for all requests.
S3Client s3Client = 
    S3Client.builder()
            .httpClient(apache5HttpClient).build();

DynamoDbClient dynamoDbClient = 
    DynamoDbClient.builder()
                  .httpClient(apache5HttpClient).build();

// Perform work with the s3Client and dynamoDbClient.

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