Javaを使用したAmazon S3でのマルチパートアップロード

1概要

このチュートリアルでは、Amazon S3でAWS Java SDKを使用してマルチパートアップロードを処理する方法について説明します。

  • 簡単に言うと、マルチパートアップロードでは、コンテンツを小さい部分に分割し、各部分を個別にアップロードします。

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

  • 高いスループット - 部品を並行してアップロードできます

  • より簡単なエラー回復 - 失敗した部分だけを再アップロードする必要があります。

  • アップロードの一時停止と再開 - いつでもパーツをアップロードできます。

プロセス全体を一時停止し、残りの部分を後でアップロードできます

Amazon S3でマルチパートアップロード** を使用する場合、最後のパートを除く各パートのサイズは5 MB以上でなければなりません。

2 Mavenの依存関係

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

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

最新版を見るにはhttp://www.mvnrepository.com/artifact/com.amazonaws/aws-java-sdk[Maven Central]をチェックしてください。

3.マルチパートアップロードを実行する

** 3.1. Amazon S3クライアントを作成する

**

最初に、Amazon S3にアクセスするためのクライアントを作成する必要があります。

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

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

デフォルトの資格情報プロバイダーチェーンの仕組みの詳細については、https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html#credentials-default[ドキュメント]を参照してください。デフォルト( 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();

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

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

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. アップロードの進捗状況を追跡する

アップロードの進行状況を追跡することは非常に一般的な要件です。 ProgressListener インスタンスの助けを借りてそれを行うことができます。

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を使用してマルチパートアップロードを実行する方法と、アップロードのいくつかの側面を制御し、その進行状況を追跡する方法について説明しました。

いつものように、この記事の完全なコードはhttps://github.com/eugenp/tutorials/tree/master/aws[over GitHub]から入手できます。

前の投稿:Spring Boot 2のコンテナ設定
次の投稿:HttpClient基本認証