Amazon S3 Transfer Manager を使用してファイルとディレクトリを転送する - AWS SDK for Java 2.x

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

Amazon S3 Transfer Manager を使用してファイルとディレクトリを転送する

Amazon S3 転送マネージャは、 AWS SDK for Java 2.x用のオープンソースの高レベルファイル転送ユーティリティです。Amazon Simple Storage Service (Amazon S3) との間でファイルやディレクトリを転送するために使用します。

マルチパートが有効になっている AWS CRTベースの S3 クライアントまたは標準の Java ベースの S3 非同期クライアントの上に構築すると、S3 Transfer Manager はマルチパートアップロードAPIバイト範囲フェッチなどのパフォーマンスの向上を活用できます。 S3

S3 Transfer Manager では、転送の進行状況をリアルタイムでモニタリングし、転送を一時停止して後で実行することもできます。

使用を開始する

ビルドファイルに依存関係を追加する

マルチパートパフォーマンスを強化した S3 Transfer Manager を使用するには、必要な依存関係を使用してビルドファイルを設定します。

Use the AWS CRT-based S3 client
<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.27.211</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3-transfer-manager</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk.crt</groupId> <artifactId>aws-crt</artifactId> <version>0.29.1432</version> </dependency> </dependencies>

1 最新バージョン 。 2最新バージョン

Use the Java-based S3 async client
<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.27.211</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3-transfer-manager</artifactId> </dependency> </dependencies>

1 最新バージョン

S3 Transfer Manager のインスタンスを作成する

並列転送を有効にするには、 AWS CRTベースの S3 クライアントまたはマルチパートが有効になっている Java ベースの S3 非同期クライアントを渡す必要があります。次の例は、カスタム設定で S3 Transfer Manager を設定する方法を示しています。

Use the AWS CRT-based S3 client
S3AsyncClient s3AsyncClient = S3AsyncClient.crtBuilder() .credentialsProvider(DefaultCredentialsProvider.create()) .region(Region.US_EAST_1) .targetThroughputInGbps(20.0) .minimumPartSizeInBytes(8 * MB) .build(); S3TransferManager transferManager = S3TransferManager.builder() .s3Client(s3AsyncClient) .build();
Use the Java-based S3 async client

aws-crt 依存関係がビルドファイルに含まれていない場合、S3 Transfer Manager は、 SDK for Java 2.x で使用される標準の Java ベースの S3 非同期クライアントの上に構築されます。

S3 クライアントのカスタム設定 - マルチパートを有効にする必要があります

S3AsyncClient s3AsyncClient = S3AsyncClient.builder() .multipartEnabled(true) .credentialsProvider(DefaultCredentialsProvider.create()) .region(Region.US_EAST_1) .targetThroughputInGbps(20.0) .minimumPartSizeInBytes(8 * MB) .build(); S3TransferManager transferManager = S3TransferManager.builder() .s3Client(s3AsyncClient) .build();

S3 クライアントの設定なし - マルチパートサポートが自動的に有効

S3TransferManager transferManager = S3TransferManager.create();

S3 バケットにファイルをアップロードする

次の例は、ファイルアップロードの例とLoggingTransferListener、アップロードの進行状況をログに記録する のオプションの使用を示しています。

SAmazon S3S3 にファイルをアップロードするには、 UploadFileRequest オブジェクトを S3TransferManageruploadFileメソッドに渡します。

uploadFile メソッドから返されるFileUploadオブジェクトは、アップロードプロセスを表します。リクエストが完了すると、CompletedFileUploadオブジェクトにはアップロードに関する情報が含まれます。

public String uploadFile(S3TransferManager transferManager, String bucketName, String key, URI filePathURI) { UploadFileRequest uploadFileRequest = UploadFileRequest.builder() .putObjectRequest(b -> b.bucket(bucketName).key(key)) .source(Paths.get(filePathURI)) .build(); FileUpload fileUpload = transferManager.uploadFile(uploadFileRequest); CompletedFileUpload uploadResult = fileUpload.completionFuture().join(); return uploadResult.response().eTag(); }
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedFileUpload; import software.amazon.awssdk.transfer.s3.model.FileUpload; import software.amazon.awssdk.transfer.s3.model.UploadFileRequest; import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Paths; import java.util.UUID;

S3 バケットからのファイルのダウンロード

次の例は、ダウンロードの進行状況を記録する のオプションの使用とともにLoggingTransferListener、ダウンロード例を示しています。

S3 Transfer Manager を使用して S3 バケットからオブジェクトをダウンロードするには、DownloadFileRequestオブジェクトを構築し、 downloadFileメソッドに渡します。

S3TransferManagerdownloadFileメソッドによって返されるFileDownloadオブジェクトは、ファイル転送を表します。ダウンロードが完了すると、 にはダウンロードに関する情報へのアクセスCompletedFileDownloadが含まれます。

public Long downloadFile(S3TransferManager transferManager, String bucketName, String key, String downloadedFileWithPath) { DownloadFileRequest downloadFileRequest = DownloadFileRequest.builder() .getObjectRequest(b -> b.bucket(bucketName).key(key)) .destination(Paths.get(downloadedFileWithPath)) .build(); FileDownload downloadFile = transferManager.downloadFile(downloadFileRequest); CompletedFileDownload downloadResult = downloadFile.completionFuture().join(); logger.info("Content length [{}]", downloadResult.response().contentLength()); return downloadResult.response().contentLength(); }
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedFileDownload; import software.amazon.awssdk.transfer.s3.model.DownloadFileRequest; import software.amazon.awssdk.transfer.s3.model.FileDownload; import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.UUID;

Amazon S3 バケットを他のバケットにコピーする

次の例は、S3 Transfer Manager を使用してオブジェクトをコピーする方法を示しています。

S3 バケットから別のバケットへのオブジェクトのコピーを開始するには、基本CopyObjectRequestインスタンスを作成します。

次に、S3 Transfer Manager CopyRequestで使用できる CopyObjectRequestに の基本をラップします。

S3TransferManagercopy メソッドによって返される Copy オブジェクトはコピープロセスを表します。コピープロセスが完了すると、CompletedCopyオブジェクトにはレスポンスの詳細が含まれます。

public String copyObject(S3TransferManager transferManager, String bucketName, String key, String destinationBucket, String destinationKey) { CopyObjectRequest copyObjectRequest = CopyObjectRequest.builder() .sourceBucket(bucketName) .sourceKey(key) .destinationBucket(destinationBucket) .destinationKey(destinationKey) .build(); CopyRequest copyRequest = CopyRequest.builder() .copyObjectRequest(copyObjectRequest) .build(); Copy copy = transferManager.copy(copyRequest); CompletedCopy completedCopy = copy.completionFuture().join(); return completedCopy.response().copyObjectResult().eTag(); }
注記

S3 Transfer Manager でクロスリージョンコピーを実行するには、次のスニペットに示すように、 AWS CRTベースの S3 クライアントビルダーcrossRegionAccessEnabledで を有効にします。

S3AsyncClient s3AsyncClient = S3AsyncClient.crtBuilder() .crossRegionAccessEnabled(true) .build(); S3TransferManager transferManager = S3TransferManager.builder() .s3Client(s3AsyncClient) .build();
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.model.CopyObjectRequest; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedCopy; import software.amazon.awssdk.transfer.s3.model.Copy; import software.amazon.awssdk.transfer.s3.model.CopyRequest; import java.util.UUID;

ローカルディレクトリを S3 バケットにアップロードする

次の例は、ローカルディレクトリを S3 にアップロードする方法を示しています。

インスタンスの uploadDirectoryメソッドを呼び出しS3TransferManager、 を渡しますUploadDirectoryRequest

DirectoryUpload オブジェクトはアップロードプロセスを表し、リクエストが完了すると が生成されCompletedDirectoryUploadます。CompleteDirectoryUpload オブジェクトは、どのファイルが転送に失敗したかなど、転送の結果に関する情報を含めます。

public Integer uploadDirectory(S3TransferManager transferManager, URI sourceDirectory, String bucketName) { DirectoryUpload directoryUpload = transferManager.uploadDirectory(UploadDirectoryRequest.builder() .source(Paths.get(sourceDirectory)) .bucket(bucketName) .build()); CompletedDirectoryUpload completedDirectoryUpload = directoryUpload.completionFuture().join(); completedDirectoryUpload.failedTransfers() .forEach(fail -> logger.warn("Object [{}] failed to transfer", fail.toString())); return completedDirectoryUpload.failedTransfers().size(); }
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.services.s3.model.ObjectIdentifier; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedDirectoryUpload; import software.amazon.awssdk.transfer.s3.model.DirectoryUpload; import software.amazon.awssdk.transfer.s3.model.UploadDirectoryRequest; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Paths; import java.util.UUID;

ローカルディレクトリへの S3 バケットオブジェクトのダウンロード

次の例に示すように、S3 バケットのオブジェクトをローカルディレクトリにダウンロードできます。

S3 バケット内のオブジェクトをローカルディレクトリにダウンロードするには、まず Transfer Manager の downloadDirectoryメソッドを呼び出し、 を渡しますDownloadDirectoryRequest

DirectoryDownload オブジェクトはダウンロードプロセスを表し、リクエストが完了すると が生成されCompletedDirectoryDownloadます。CompleteDirectoryDownload オブジェクトは、どのファイルが転送に失敗したかなど、転送の結果に関する情報を含めます。

public Integer downloadObjectsToDirectory(S3TransferManager transferManager, URI destinationPathURI, String bucketName) { DirectoryDownload directoryDownload = transferManager.downloadDirectory(DownloadDirectoryRequest.builder() .destination(Paths.get(destinationPathURI)) .bucket(bucketName) .build()); CompletedDirectoryDownload completedDirectoryDownload = directoryDownload.completionFuture().join(); completedDirectoryDownload.failedTransfers() .forEach(fail -> logger.warn("Object [{}] failed to transfer", fail.toString())); return completedDirectoryDownload.failedTransfers().size(); }
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.model.ObjectIdentifier; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.model.CompletedDirectoryDownload; import software.amazon.awssdk.transfer.s3.model.DirectoryDownload; import software.amazon.awssdk.transfer.s3.model.DownloadDirectoryRequest; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashSet; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors;

完全な例を見る

GitHub には、このページのすべての例の完全なコードが含まれています。