

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

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