AWS CRT ベースの HTTP クライアントを設定する - AWS SDK for Java 2.x

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

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

AWS CRT ベースの HTTP クライアントには、同期 AwsCrtHttpClient と非同期 AwsCrtAsyncHttpClient が含まれます。 AWS CRT ベースの HTTP クライアントには、以下の HTTP クライアントの利点があります。

  • SDK の起動時間の短縮

  • より小さなメモリフットプリント

  • レイテンシータイムの短縮

  • 接続のヘルス管理

  • DNSロードバランシング

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

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

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

AWS CRT ベースの S3 クライアントS3AsyncClient インターフェイスの実装であり、Amazon S3 サービスの使用に使用されます。これは S3AsyncClient インターフェースの Java ベース実装に代わるもので、いくつかの利点があります。

どちらのコンポーネントも AWS Common Runtime のライブラリを使用していますが、 AWS CRT ベースの HTTP クライアントは aws-c-s3 ライブラリを使用しておらず、S3 マルチパートアップロード API 機能をサポートしていません。対照的に、 AWS CRT ベースの S3 クライアントは、S3 マルチパートアップロード API 機能をサポートするために構築されました。

AWS CRT ベースの HTTP クライアントにアクセスする

AWS CRT ベースの 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>

*赤で表示されているバージョンを、使用する Java SDK のバージョンに置き換えます。Maven Central の最新情報を入手します。

Platform-specific jar option

Java ランタイムをプラットフォーム固有のバージョンの AWS CRT ライブラリに制限するには、Uber-jar オプションに以下の変更を加えます。

  • SDK のaws-crt-clientアーティファクトに exclusions要素を追加します。この除外により、SDK uber-jar AWS CRT を一時的に使用できなくなります。

  • 必要な特定の AWS CRT プラットフォームバージョンの依存関係要素を追加します。正しい AWS CRTバージョンを決定する方法については、以下のステップを参照してください。

<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 で最新の情報をご覧ください。

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

3 プラットフォームのclassifier値を に置き換えます。使用可能な値のリストについては、Java GitHub 用 AWS CRT ページを参照してください。

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

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

  1. Uber-jar オプションに示すようにpom.xml、ファイルをセットアップします。この設定では、デフォルトで SDK software.amazon.awssdk.crt:aws-crtのバージョンを確認できます。

  2. プロジェクトのルート ( 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
  3. コンソールがsoftware.amazon.awssdk.crt:aws-crtアーティファクトに表示するバージョンを使用します。この場合、 0.31.3pom.xml ファイルに追加します。

AWS CRT ベースの HTTP クライアントの使用と設定

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

どちらのアプローチでも、ビルダーを使用して AWS CRT ベースの HTTP クライアントインスタンスのプロパティを設定します

ベストプラクティス: インスタンスをサービスクライアント専有にする

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

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

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();

別の方法: インスタンスを共有する

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

注記

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

次の例では、 AWS CRT ベースの HTTP クライアントインスタンスを connectionTimeout および maxConcurrency値で設定します。設定された 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.

AWS CRT ベースの HTTP クライアントをデフォルトとして設定する

Maven ビルドファイルは、SDKクライアントのデフォルトの Word クライアントとして AWS CRT ベースの HTTP クライアントを 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 中央リポジトリを参照してください。 VERSION 値。

注記

ファイルで複数のサービスクライアントが宣言された場合pom.xml、すべて XML exclusions 要素が必要です。

Java システムプロパティを使用する

AWS CRT ベースの HTTP クライアントをアプリケーションのデフォルトの 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アーティファクトへの依存関係を追加する必要があります。

AWS CRT ベースの HTTP クライアントの高度な設定

接続ヘルス設定や最大アイドル時間など、 AWS CRT ベースの HTTP クライアントのさまざまな設定を使用できます。AwsCrtAsyncHttpClient利用可能な設定オプションを確認できます。AwsCrtHttpClient にも同じオプションを設定できます。

接続のヘルス設定

AWS CRT ベースの HTTP クライアントの接続ヘルス設定は、Word 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 サポート

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

その間、Word KinesisAsyncClientや HTTP などの Word/2 サポートを必要とするサービスクライアントを使用している場合はTranscribeStreamingAsyncClient、代わりに NettyNioAsyncHttpClient の使用を検討してください。

プロキシ設定例

次のコードスニペットは、コード内でプロキシの設定を行うために使用する ProxyConfiguration.Builder の使用方法を示しています。

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