1. 概要

このチュートリアルでは、AWSJavaSDKを使用してAmazonS3でマルチパートアップロードを処理する方法を説明します。

簡単に言えば、マルチパートアップロードでは、コンテンツを小さなパーツに分割し、各パーツを個別にアップロードします。すべてのパーツは受け取ったときに再組み立てされます。

マルチパートアップロードには、次の利点があります。

  • より高いスループット–パーツを並行してアップロードできます
  • より簡単なエラー回復–失敗したパーツのみを再アップロードする必要があります
  • アップロードを一時停止して再開します–いつでもパーツをアップロードできます。 プロセス全体を一時停止して、残りの部分を後でアップロードできます

Amazon S3でマルチパートアップロードを使用する場合、最後のパートを除く各パートのサイズは少なくとも5MBである必要があることに注意してください。

2. Mavenの依存関係

始める前に、プロジェクトにAWSSDKの依存関係を追加する必要があります。

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk</artifactId>
    <version>1.11.290</version>
</dependency>

最新バージョンを表示するには、 MavenCentralを確認してください。

3. マルチパートアップロードの実行

3.1. AmazonS3クライアントの作成

まず、 AmazonS3にアクセスするためのクライアントを作成します。 を使用します AmazonS3ClientBuilder この目的のために:

AmazonS3 amazonS3 = AmazonS3ClientBuilder
  .standard()
  .withCredentials(new DefaultAWSCredentialsProviderChain())
  .withRegion(Regions.DEFAULT_REGION)
  .build();

これにより、AWSクレデンシャルにアクセスするためのデフォルトのクレデンシャルプロバイダーチェーンを使用してクライアントが作成されます。

デフォルトのクレデンシャルプロバイダーチェーンがどのように機能するかの詳細については、ドキュメントを参照してください。 デフォルト以外のリージョン( US West-2 )を使用している場合は、Regions.DEFAULT_REGIONをそのカスタムリージョンに置き換えてください。

3.2. アップロードを管理するためのTransferManagerの作成

TransferManagerBuilder を使用して、TransferManagerインスタンスを作成します。

このクラスは、Amazon S3 でアップロードとダウンロードを管理するためのシンプルなAPIを提供し、関連するすべてのタスクを管理します。

TransferManager tm = TransferManagerBuilder.standard()
  .withS3Client(amazonS3)
  .withMultipartUploadThreshold((long) (5 * 1024 * 1025))
  .build();

マルチパートアップロードしきい値は、それを超えるとマルチパートアップロードとしてアップロードを実行する必要があるサイズをバイト単位で指定します。

AmazonS3では最小パーツサイズが5MB(最後のパーツ以外のパーツ)であるため、マルチパートアップロードのしきい値として5MBを使用しました。

3.3. オブジェクトのアップロード

TransferManagerを使用してオブジェクトをアップロードするには、upload()関数を呼び出すだけです。 これにより、パーツが並行してアップロードされます。

String bucketName = "baeldung-bucket";
String keyName = "my-picture.jpg";
String file = new File("documents/my-picture.jpg");
Upload upload = tm.upload(bucketName, keyName, file);

TransferManager.upload()は、Uploadオブジェクトを返します。 これを使用して、アップロードのステータスを確認および管理できます。 次のセクションでこれを行います。

3.4. アップロードが完了するのを待っています

TransferManager.upload()は非ブロッキング関数です; アップロードがバックグラウンドで実行されている間、すぐに戻ります。

返されたUploadオブジェクトを使用して、アップロードが完了するのを待って、プログラムを終了できます。

try {
    upload.waitForCompletion();
} catch (AmazonClientException e) {
    // ...
}

3.5. アップロードの進行状況の追跡

アップロードの進行状況を追跡することは、非常に一般的な要件です。 P rogressListenerインスタンスを使用してこれを行うことができます。

ProgressListener progressListener = progressEvent -> System.out.println(
  "Transferred bytes: " + progressEvent.getBytesTransferred());
PutObjectRequest request = new PutObjectRequest(
  bucketName, keyName, file);
request.setGeneralProgressListener(progressListener);
Upload upload = tm.upload(request);

作成したProgressListenerは、アップロードが完了するまで転送されたバイト数を出力し続けます。

3.6. アップロードの並列処理の制御

デフォルトでは、TransferManagerは最大10個のスレッドを使用してマルチパートアップロードを実行します。

ただし、TransferManagerの構築中にExecutorServiceを指定することで、これを制御できます。

int maxUploadThreads = 5;
TransferManager tm = TransferManagerBuilder.standard()
  .withS3Client(amazonS3)
  .withMultipartUploadThreshold((long) (5 * 1024 * 1025))
  .withExecutorFactory(() -> Executors.newFixedThreadPool(maxUploadThreads))
  .build();

ここでは、ラムダを使用して ExecutorFactory のラッパー実装を作成し、それを withExecutorFactory()関数に渡しました。

4. 結論

このクイック記事では、AWS SDK for Javaを使用してマルチパートアップロードを実行する方法を学び、アップロードのいくつかの側面を制御し、その進行状況を追跡する方法を学びました。

いつものように、この記事の完全なコードは、GitHubから入手できます。