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で入手できます。