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 クライアント 上に構築すると、S3 Transfer Manager ではマルチパートアップロード APIバイト範囲フェッチなどのパフォーマンスの向上を活用できます。

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

使用を開始する

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

AWS CRT ベースの S3 クライアントに基づく強化されたパフォーマンスで S3 Transfer Manager を使用するには、次の依存関係を使用してビルドファイルを設定します。

  • SDK for Java 2.x のバージョン 2.19.1 以降を使用します。

  • s3-transfer-manager アーティファクトを依存関係として追加します。

  • バージョン 0.20.3 以降の aws-crt アーティファクトを依存関係として追加します。

次のコード例は、プロジェクトの Maven 依存関係を設定する方法を示しています。

<project> <properties> <aws.sdk.version>2.19.1</aws.sdk.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>${aws.sdk.version}</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.20.3</version> </dependency> </dependencies> </project>

Maven central リポジトリで s3-transfer-manageraws-crt のアーティファクトの最新バージョンを検索します。

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

次のスニペットは、デフォルト設定で S3TransferManager インスタンスを作成する方法を示しています。

S3TransferManager transferManager = S3TransferManager.create();

次の例は、カスタム設定で S3 Transfer Manager を設定する方法を示しています。この例では、AWS CRT ベースの S3AsyncClient インスタンスが S3 Transfer Manager の基盤となるクライアントとして使用されます。

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();
注記

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

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

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

S3 Transfer Manager を使用して Amazon S3 にファイルをアップロードするには、S3TransferManageruploadFile メソッドにUploadFileRequest オブジェクトを渡します。

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)) .addTransferListener(LoggingTransferListener.create()) .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)) .addTransferListener(LoggingTransferListener.create()) .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.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 にアップロードする方法を示しています。

まず、S3TransferManagerインスタンスの uploadDirectory メソッドを呼び出し、 を渡します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 、このページのすべての例の完全なコードが含まれています