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

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

1. 概要

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

Simply put, in a multipart upload, we split the content into smaller parts and upload each part individually.すべての部品は、受け取ったときに再組み立てされます。

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

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

  • より簡単なエラー回復-故障した部品のみを再アップロードする必要があります

  • アップロードの一時停止と再開–いつでもパーツをアップロードできます。 プロセス全体を一時停止し、残りの部分を後でアップロードできます

マルチパートアップロードwith Amazon S3, each part except the last part must be at least 5 MB in size.を使用する場合は注意してください

2. Mavenの依存関係

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


    com.amazonaws
    aws-java-sdk
    1.11.290

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

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

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

まず、create a client for accessing Amazon S3.を実行する必要があります。この目的でAmazonS3ClientBuilderを使用します。

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

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

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

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

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

このクラスはprovides simple APIs to manage uploads and downloads with Amazon S3であり、関連するすべてのタスクを管理します。

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

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

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

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

To upload object using TransferManager we simply need to call its upload() function。 これにより、パーツが並行してアップロードされます。

String bucketName = "example-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() is a non-blocking function;アップロードがバックグラウンドで実行されている間、すぐに戻ります。

プログラムを終了する前にuse the returned Upload object to wait for the upload to completeを実行できます。

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

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