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クライアントは、実装SDKHTTPクライアントインターフェイスであり、一般的なHTTP通信に使用されます。これらは、 の他の同期クライアントまたは非同期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 は、部品表 (BOM) メカニズムを使用して宣言された AWS CRTベースのHTTPクライアントpom.xmlを示しています。

<project> <properties> <aws.sdk.version>2.27.21</aws.sdk.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>

Maven central リポジトリにアクセスして、最新バージョンを確認します。

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

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

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

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

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

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

アプリケーションのリソースとメモリの使用量を減らすために、 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が AWS CRTベースのHTTPクライアントをサービスクライアントのデフォルトHTTPクライアントとして使用するように設定できます。

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

次のpom.xml例では、 は S3 サービスに AWS CRTベースのHTTPクライアントSDKを使用します。コード内のサービスクライアントが の場合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 値。

注記

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

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クライアントの接続ヘルス設定は、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クライアントではまだサポートされていませんが、今後のリリースが予定されています。

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

プロキシ設定例

次のコードスニペットは、コード内でプロキシの設定を行うために使用する 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に設定されます。 はhttp.*システムプロパティのみSDKを検索します。

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

// 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