

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

# パフォーマンスの高い S3 クライアントを使用する: AWS CRT ベースの S3 クライアント
<a name="crt-based-s3-client"></a>

Common Runtime ( AWS CRT) 上に構築された CRT ベースの S3 クライアントは、代替の S3 非同期クライアントです。 [AWS](https://docs.aws.amazon.com/sdkref/latest/guide/common-runtime.html)Amazon S3 の[マルチパートアップロード API](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html) と[バイト範囲フェッチ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance-guidelines.html#optimizing-performance-guidelines-get-range)を自動的に使用することで、Amazon Simple Storage Service (Amazon S3) との間でオブジェクトを転送し、パフォーマンスと信頼性を向上させます。

 AWS CRT ベースの S3 クライアントは、ネットワーク障害が発生した場合の転送の信頼性を向上させます。ファイル転送を最初からやり直すことなく、失敗した個別の部分を再試行することで、信頼性を改善しています。

さらに、CRT AWS ベースの S3 クライアントは、強化された接続プーリングとドメインネームシステム (DNS) ロードバランシングを提供し、スループットも向上します。

SDK の標準 S3 非同期クライアントの代わりに AWS CRT ベースの S3 クライアントを使用し、その改善されたスループットをすぐに活用できます。

**重要**  
 AWS CRT ベースの S3 クライアントは現在、クライアントレベルまたはリクエストレベルで [SDK メトリクス収集](metrics.md)をサポートしていません。

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

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

**AWS CRT ベースの S3 クライアント**は [S3AsyncClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3AsyncClient.html) インターフェイスの実装であり、Amazon S3 サービスを利用するために使用されます。これは `S3AsyncClient` インターフェイスの Java ベースの実装に代わるもので、いくつかの利点があります。

[AWS CRT ベースの HTTP クライアント](http-configuration-crt.md)は、[SDKASyncHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/async/SdkAsyncHttpClient.html) インターフェースを実装したもので、一般的な HTTP 通信に使用されます。これは `SdkAsyncHttpClient` インターフェースの Netty 実装に代わるもので、いくつかの利点があります。

どちらのコンポーネントも [AWS Common Runtime](https://docs.aws.amazon.com/sdkref/latest/guide/common-runtime.html) のライブラリを使用しますが、 AWS CRT ベースの S3 クライアントは [aws-c-s3 ライブラリ](https://github.com/awslabs/aws-c-s3)を使用し、[S3 マルチパートアップロード API ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html)機能をサポートしています。 AWS CRT ベースの HTTP クライアントは汎用であるため、S3 マルチパートアップロード API 機能はサポートされていません。

## CRT AWS ベースの S3 クライアントを使用するための依存関係を追加する
<a name="crt-based-s3-client-depend"></a>

 AWS CRT ベースの S3 クライアントを使用するには、Maven プロジェクトファイルに次の 2 つの依存関係を追加します。この例は、使用する最小バージョンを示しています。Maven central リポジトリで [s3](https://central.sonatype.com/artifact/software.amazon.awssdk/s3) と [aws-crt](https://central.sonatype.com/artifact/software.amazon.awssdk.crt/aws-crt) のアーティファクトの最新バージョンを検索します。

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

## CRT AWS ベースの S3 クライアントのインスタンスを作成する
<a name="crt-based-s3-client-create"></a>

 次のコードスニペットに示すように、デフォルト設定で AWS CRT ベースの S3 クライアントのインスタンスを作成します。

```
S3AsyncClient s3AsyncClient = S3AsyncClient.crtCreate();
```

クライアントを設定するには、CRT AWS クライアントビルダーを使用します。ビルダーメソッドを変更することで、標準の 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()` を呼び出します。

## CRT AWS ベースの S3 クライアントを使用する
<a name="crt-based-s3-client-use"></a>

 AWS CRT ベースの S3 クライアントを使用して Amazon S3 API オペレーションを呼び出します。次の例は、 AWS SDK for Javaを介して実行できる [PutObject](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3AsyncClient.html#putObject(java.util.function.Consumer,software.amazon.awssdk.core.async.AsyncRequestBody)) オペレーションと [GetObject](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3AsyncClient.html#getObject(java.util.function.Consumer,software.amazon.awssdk.core.async.AsyncResponseTransformer)) オペレーションを示しています。

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

## サイズが不明なストリームのアップロード
<a name="crt-stream-unknown-size"></a>

 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;
}
```

この機能は、コンテンツの長さの指定が正しくないとオブジェクトの切り捨てやアップロードの失敗につながる可能性がある、従来のアップロードの一般的な問題を回避するのに役立ちます。

## 設定の制限
<a name="crt-based-s3-client-limitations"></a>

 AWS CRT ベースの S3 クライアントと Java ベースの S3 非同期クライアントは[同等の機能を提供し](examples-s3.md#s3-clients)、CRT AWS ベースの S3 クライアントはパフォーマンスエッジを提供します。ただし、 AWS CRT ベースの S3 クライアントには、Java ベースの S3 非同期クライアントの設定がありません。設定は次のとおりです。
+ *クライアントレベルの設定:* API コール試行のタイムアウト、圧縮実行インターセプター、メトリクスパブリッシャー、カスタム実行属性、カスタム詳細オプション、カスタムスケジュールのエグゼキュータサービス、カスタムヘッダー
+ *リクエストレベルの設定:* カスタム署名者、API コール試行タイムアウト

設定の違いの完全なリストについては、 API リファレンスを参照してください。


| Java ベースの S3 非同期クライアント | AWS CRT ベースの S3 クライアント | 
| --- | --- | 
| クライアントレベルの設定[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/crt-based-s3-client.html)リクエストレベルの設定[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/crt-based-s3-client.html) | クライアントレベルの設定[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/crt-based-s3-client.html)リクエストレベルの設定[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/crt-based-s3-client.html) | 