Amazon Web Services ブログ

AWS SDK for Java 2.x 向け Amazon S3 Transfer Managerのご紹介

この記事は、”Introducing Amazon S3 Transfer Manager in the AWS SDK for Java 2.x” を翻訳したものです。

Amazon S3 Transfer Managerの開発者プレビューリリースを発表しました。Amazon S3 Transfer Managerは、AWS SDK for Java 2.x の Amazon Simple Storage Service  (Amazon S3) の高レベルファイル転送ユーティリティです。

Transfer ManagerのシンプルなAPIを使用することで、Amazon S3との間でオブジェクトのアップロードやダウンロードを高速に実行できるようになり、単一のオブジェクトをパートのセットとして同時に転送することで実現されるスループットと信頼性の向上の恩恵を受けることができます。Transfer Manager は、AWS Common Runtime S3 クライアントの Java バインディング上に構築されており、Amazon S3のマルチパートアップロードと、バイトレンジフェッチを活用して並列化された転送処理を行います。

マルチパートアップロードによる並列アップロード

アップロード操作では、Transfer Manager は Amazon S3 マルチパートアップロードAPI を使用します。1 つの PutObjectRequest を複数の MultiPartUpload リクエストに変換し、それらのリクエストを同時に送信して高いパフォーマンスを実現します。

バイトレンジフェッチによる並列ダウンロード

ダウンロード操作の場合、Transfer Managerはバイトレンジフェッチを使用します。GetObjectRequest を複数の小さなリクエストに分割し、それぞれがオブジェクトの特定部分を取得します。これらのリクエストは、Amazon S3に同時に接続して実行されます。

Transfer Manager 1.x をお使いの場合、最適化されたパフォーマンスでダウンロードするには、オブジェクトがマルチパートアップロードを使用してアップロードされている必要があります。1.xでは、オブジェクトが最初に単一のオブジェクトとしてアップロードされていた場合、Transfer Manager はダウンロードプロセスを高速化できません。

新しいTransfer Manager 2.xでは、このような制限はありません。オブジェクトのダウンロードは、どのようにアップロードされたかに依存せず、すべてのダウンロードに高いスループットと並行性の恩恵を受けることができます。

はじめ方

Transfer Managerの依存関係を追加する

まず、プロジェクトに個別の依存関係を含める必要があります。(訳者注釈:以下はApache Mavenの、pom.xmlの記述例になります。)

<dependency>
  <groupId>software.amazon.awssdk</groupId>
  <artifactId>s3-transfer-manager</artifactId>
  <version>2.17.16-PREVIEW</version>
</dependency>

Transfer Managerをインスタンス化する

デフォルト設定を使用して、Transfer Manager を簡単にインスタンス化できます。

S3TransferManager transferManager = S3TransferManager.create();

設定を変更したい場合は、代わりにビルダーを使用することをお勧めします。

S3TransferManager transferManager =
    S3TransferManager.builder()
                     .s3ClientConfiguration(cfg -> cfg.credentialsProvider(credentialProvider)
                                                      .region(Region.US_WEST_2)
                                                      .targetThroughputInGbps(20.0)
                                                      .minimumPartSizeInBytes(10 * MB))
                     .build();

Amazon S3にファイルをアップロードする

S3 にファイルをアップロードするには、アップロード元のソースファイルのパスを指定して、アップロードを行う putObjectRequest 関数 を呼び出す必要があります。

Upload upload = transferManager.upload(b -> b.source(Paths.get("myFile.txt"))
                                             .putObjectRequest(req -> req.bucket("bucket")
                                                                         .key("key")));

upload.completionFuture().join();

Amazon S3オブジェクトをファイルにダウンロードする

オブジェクトをダウンロードするには、ダウンロード先のファイルパスを指定して、ダウンロードを行う getObjectRequest 関数を呼び出す必要があります。

Download download = 
    transferManager.download(b -> b.destination(Paths.get("myFile.txt"))
                                   .getObjectRequest(req -> req.bucket("bucket")
                                                               .key("key")));
download.completionFuture().join();

まとめ

AWS SDK for Java 2.x のTransfer Managerをセットアップして使用を開始する方法については、開発者ガイドをご覧ください。詳細を確認されたい場合は、GitHub でソースコードをチェックしてください。新しい Transfer Manager をお試し頂き、GitHubのIssues ページでご意見をお聞かせください。

Zoe Wang

Zoe Wang

Zoe はソフトウェア開発エンジニアとして、AWS SDK for Javaの開発に携わっています。
彼女は開発者エクスペリエンスを向上させるためのツールの構築に情熱を注いでいます。ZoeのGitHubアカウントは @zoewangg です。


この記事の翻訳は、ソリューションアーキテクトの宮島 嶺が担当しました。