パフォーマンスの高い S3 クライアントを使用する: AWS CRT ベースの S3 クライアント
AWS 共通ランタイム (CRT) 上に構築された AWS CRT ベースの S3 クライアントは、代替の S3 非同期クライアントです。Amazon S3 のマルチパートアップロード API とバイト範囲フェッチを自動的に使用することで、Amazon Simple Storage Service (Amazon S3) との間でオブジェクトを転送し、パフォーマンスと信頼性を向上させます。
AWS CRT ベースの S3 クライアントは、ネットワーク障害が発生した場合の転送の信頼性を向上させます。ファイル転送を最初からやり直すことなく、失敗した個別の部分を再試行することで、信頼性を改善しています。
さらに、AWS CRT ベースの S3 クライアントでは、接続プーリングとドメインネームシステム (DNS) の負荷分散が強化され、スループットも向上します。
SDK の標準 S3 非同期クライアントの代わりに AWS CRT ベースの S3 クライアントを使用すれば、その向上したスループットをすぐに活用できます。
重要
AWS CRT ベースの S3 クライアントは現在、クライアントレベルでもリクエストレベルでも SDK メトリクス収集をサポートしていません。
SDK の AWS CRT ベースのコンポーネント
このトピックで説明する AWS CRT ベースの S3 クライアントと AWS CRT ベースの HTTP クライアントは SDK の異なるコンポーネントです。
AWS CRT ベースの S3 クライアントは S3AsyncClientS3AsyncClient インターフェイスの Java ベースの実装に代わるもので、いくつかの利点があります。
AWS CRT ベースの HTTP クライアントは、SDKASyncHttpClientSdkAsyncHttpClient インターフェースの Netty 実装に代わるもので、いくつかの利点があります。
どちらのコンポーネントも AWS 共通ランタイムのライブラリを使用していますが、AWS CRT ベースの S3 クライアントは aws-c-s3 ライブラリ
AWS CRT ベースの S3 クライアントを使用する依存関係を追加
AWS CRT ベースの S3 クライアントを使用するには、次の 2 つの依存関係を Maven プロジェクトファイルに追加します。この例は、使用する最小バージョンを示しています。Maven central リポジトリで s3
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>2.27.21</version> </dependency> <dependency> <groupId>software.amazon.awssdk.crt</groupId> <artifactId>aws-crt</artifactId> <version>0.30.11</version> </dependency>
AWS CRT ベースの S3 クライアントのインスタンスを作成します。
以下のコードスニペットに示すように、デフォルト設定で AWS CRT ベースの S3 クライアントのインスタンスを作成します。
S3AsyncClient s3AsyncClient = S3AsyncClient.crtCreate();
クライアントを設定するには、AWS CRT クライアントビルダーを使用します。ビルダーの方法を変更することで、標準の S3 非同期クライアントから AWS CRT ベースのクライアントに切り替えることができます。
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3AsyncClient; S3AsyncClient s3AsyncClient = S3AsyncClient.crtBuilder() .credentialsProvider(DefaultCredentialsProvider.create()) .region(Region.US_WEST_2) .targetThroughputInGbps(20.0) .minimumPartSizeInBytes(8 * 1025 * 1024L) .build();
注記
スタンダードビルダーの設定の一部は、現在 AWS CRT クライアントビルダーではサポートされていない場合があります。スタンダードビルダーを取得するには、S3AsyncClient#builder() を呼び出します。
AWS CRT ベースの S3 クライアントを使用する
AWS CRT ベースの S3 クライアントを使用して Amazon S3 API オペレーションを呼び出します。次の例は、AWS SDK for Java を介して実行できる PutObject
import software.amazon.awssdk.core.async.AsyncRequestBody; import software.amazon.awssdk.core.async.AsyncResponseTransformer; import software.amazon.awssdk.services.s3.S3AsyncClient; import software.amazon.awssdk.services.s3.model.GetObjectResponse; import software.amazon.awssdk.services.s3.model.PutObjectResponse; S3AsyncClient s3Client = S3AsyncClient.crtCreate(); // Upload a local file to Amazon S3. PutObjectResponse putObjectResponse = s3Client.putObject(req -> req.bucket(<BUCKET_NAME>) .key(<KEY_NAME>), AsyncRequestBody.fromFile(Paths.get(<FILE_NAME>))) .join(); // Download an object from Amazon S3 to a local file. GetObjectResponse getObjectResponse = s3Client.getObject(req -> req.bucket(<BUCKET_NAME>) .key(<KEY_NAME>), AsyncResponseTransformer.toFile(Paths.get(<FILE_NAME>))) .join();
サイズが不明なストリームのアップロード
AWS AWS CRT ベースの S3 クライアントの大きな利点の 1 つは、サイズが不明な入力ストリームを効率的に処理できることです。これは、合計サイズを事前に判断できないソースからデータをアップロードする必要がある場合に特に便利です。
public PutObjectResponse crtClient_stream_unknown_size(String bucketName, String key, InputStream inputStream) { S3AsyncClient s3AsyncClient = S3AsyncClient.crtCreate(); ExecutorService executor = Executors.newSingleThreadExecutor(); AsyncRequestBody body = AsyncRequestBody.fromInputStream(inputStream, null, executor); // 'null' indicates that the // content length is unknown. CompletableFuture<PutObjectResponse> responseFuture = s3AsyncClient.putObject(r -> r.bucket(bucketName).key(key), body) .exceptionally(e -> { if (e != null){ logger.error(e.getMessage(), e); } return null; }); PutObjectResponse response = responseFuture.join(); // Wait for the response. executor.shutdown(); return response; }
この機能は、コンテンツの長さの指定が正しくないとオブジェクトの切り捨てやアップロードの失敗につながる可能性がある、従来のアップロードの一般的な問題を回避するのに役立ちます。
設定の制限
AWS CRT ベースの S3 クライアントと Java ベースの S3 非同期クライアントは同等の機能を提供し、AWS CRT ベースの S3 クライアントはパフォーマンスエッジを提供します。ただし、AWS CRT ベースの S3 クライアントには、Java ベースの S3 非同期クライアントにある設定がありません。設定は次のとおりです。
-
クライアントレベルの設定: API コール試行のタイムアウト、圧縮実行インターセプター、メトリクスパブリッシャー、カスタム実行属性、カスタム詳細オプション、カスタムスケジュールのエグゼキュータサービス、カスタムヘッダー
-
リクエストレベルの設定: カスタム署名者、認証情報プロバイダー、API コール試行のタイムアウト
設定の違いの完全なリストについては、 API リファレンスを参照してください。
| Java ベースの S3 非同期クライアント | AWS CRT ベースの S3 クライアント |
|---|---|
| クライアントレベルの設定 リクエストレベルの設定 |
クライアントレベルの設定 リクエストレベルの設定なし |