jcloudsライブラリを使用してS3にアップロードする

  • link:/category/cloud/ [クラウド]

  • AWS

    Javaの世界のS3バケットにコンテンツをアップロードするには、いくつかの良い方法があります。この記事では、この目的のためにhttp://www.jclouds.org/[the jclouds library]が提供するものを見ていきます。
    jclouds –特にこの記事で説明したAPIを使用するには、このhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.jclouds%22%20AND%20a%3A% 22jclouds-allblobstore%22 [単純なMaven依存関係]をプロジェクトのPOMに追加する必要があります。
<dependency>
   <groupId>org.jclouds</groupId>
   <artifactId>jclouds-allblobstore</artifactId>
   <version>1.5.10</version>
</dependency>

*1. Amazon S3 *へのアップロード

これらのAPIのいずれかにアクセスするための最初のステップは、_BlobStoreContext_を作成することです。
BlobStoreContext context =
  ContextBuilder.newBuilder("aws-s3").credentials(identity, credentials)
    .buildView(BlobStoreContext.class);
これは、Amazon S3などの一般的なキーバリューストレージサービスへのエントリポイントを表しますが、これに限定されません。
より具体的なS3のみの実装の場合、同様にコンテキストを作成できます。
BlobStoreContext context =
  ContextBuilder.newBuilder("aws-s3").credentials(identity, credentials)
    .buildView(S3BlobStoreContext.class);
さらに具体的には:
BlobStoreContext context =
  ContextBuilder.newBuilder("aws-s3").credentials(identity, credentials)
    .buildView(AWSS3BlobStoreContext.class);
認証されたコンテキストが不要になった場合、それに関連するすべてのリソース(スレッドと接続)を解放する必要があります。

*2. jclouds *の4つのS3 API

jcloudsライブラリは、S3バケットにコンテンツをアップロードするための4つの異なるAPIを提供します。S3バケットは、単純だが柔軟性がなく、複雑で強力なものまで、すべて_BlobStoreContext_を介して取得されます。 最も単純なものから始めましょう。

* 2.1。 Map API経由でアップロード*

jcloudsを使用してS3バケットと対話する最も簡単な方法は、そのバケットをマップとして表すことです。 APIはコンテキストから取得されます。
InputStreamMap bucket = context.createInputStreamMap("bucketName");
次に、単純なHTMLファイルをアップロードするには:
bucket.putString("index1.html", "<html><body>hello world1</body></html>");
_InputStreamMap_ APIは、単一およびバルクの両方に対して、他のいくつかのタイプのPUT操作(ファイル、生バイト)を公開します。
簡単な統合テストを例として使用できます。
@Test
public void whenFileIsUploadedToS3WithMapApi_thenNoExceptions() {
   BlobStoreContext context =
      ContextBuilder.newBuilder("aws-s3").credentials(identity, credentials)
         .buildView(AWSS3BlobStoreContext.class);

   InputStreamMap bucket = context.createInputStreamMap("bucketName");

   bucket.putString("index1.html", "<html><body>hello world1</body></html>");
   context.close();
}

* 2.2。 BlobMap *経由でアップロード

シンプルなMap APIの使用は簡単ですが、最終的には制限されます。たとえば、アップロードされるコンテンツに関するメタデータを渡す方法はありません。 より柔軟性とカスタマイズが必要な場合、Mapを介してS3にデータをアップロードするこの単純化されたアプローチではもはや十分ではありません。
次のAPIはBlob Map APIです。これはコンテキストから取得されます。
BlobMap bucket = context.createBlobMap("bucketName");
このAPIを使用すると、クライアントは_Content _–_ Length _、_ Content-Type _、_ Content-Encoding _、_ eTag_ハッシュなど、より低いレベルの詳細にアクセスできます。バケットに新しいコンテンツをアップロードするには:
Blob blob = bucket.blobBuilder().name("index2.html").
   payload("<html><body>hello world2</body></html>").
      contentType("text/html").calculateMD5().build();
このAPIでは、作成リクエストでさまざまなペイロードを設定することもできます。
Blob Map APIを介して基本的なHTMLファイルをS3にアップロードするための簡単な統合テスト:
@Test
public void whenFileIsUploadedToS3WithBlobMap_thenNoExceptions() throws IOException {
   BlobStoreContext context =
      ContextBuilder.newBuilder("aws-s3").credentials(identity, credentials)
         .buildView(AWSS3BlobStoreContext.class);

   BlobMap bucket = context.createBlobMap("bucketName");

   Blob blob = bucket.blobBuilder().name("index2.html").
      payload("<html><body>hello world2</body></html>").
         contentType("text/html").calculateMD5().build();
   bucket.put(blob.getMetadata().getName(), blob);

   context.close();
}

* 2.3。 BlobStore *経由でアップロード

以前のAPIには、* multipart upload *を使用してコンテンツをアップロードする方法がありませんでした。これにより、大きなファイルを操作する場合に適していません。 この制限は、次に検討するAPIである同期BlobStore APIによって対処されます。
これはコンテキストから取得されます。
BlobStore blobStore = context.getBlobStore();
マルチパートサポートを使用してファイルをS3にアップロードするには:
Blob blob = blobStore.blobBuilder("index3.html").
   payload("<html><body>hello world3</body></html>").contentType("text/html").build();
blobStore.putBlob("bucketName", blob, PutOptions.Builder.multipart());
ペイロードビルダーは、_BlobMap_ APIで使用されていたものと同じであるため、ここでBLOBに関する低レベルのメタデータ情報を指定するのと同じ柔軟性が利用できます。 違いは、APIのPUT操作でサポートされる_PutOptions_、つまり* multipartサポート*です。
以前の統合テストでは、マルチパートが有効になりました。
@Test
public void whenFileIsUploadedToS3WithBlobStore_thenNoExceptions() {
   BlobStoreContext context =
      ContextBuilder.newBuilder("aws-s3").credentials(identity, credentials)
         .buildView(AWSS3BlobStoreContext.class);

   BlobStore blobStore = context.getBlobStore();

   Blob blob = blobStore.blobBuilder("index3.html").
      payload("<html><body>hello world3</body></html>").contentType("text/html").build();
   blobStore.putBlob("bucketName", blob, PutOptions.Builder.multipart());
   context.close();
}

* 2.4。 AsyncBlobStore *経由でアップロード

以前のBlobStore APIは同期でしたが、_BlobStore_ – _AsyncBlobStore_用の*非同期API *もあります。 APIも同様にコンテキストから取得されます。
AsyncBlobStore blobStore = context.getAsyncBlobStore();
2つの唯一の違いは、非同期APIが* _PUT_非同期操作*に対して_ListenableFuture_を返すことです。
Blob blob = blobStore.blobBuilder("index4.html").
   .payload("<html><body>hello world4</body></html>").build();
blobStore.putBlob("bucketName", blob)<strong>.get()</strong>;
この操作を表示する統合テストは、同期テストに似ています。
@Test
public void whenFileIsUploadedToS3WithBlobStore_thenNoExceptions() {
   BlobStoreContext context =
      ContextBuilder.newBuilder("aws-s3").credentials(identity, credentials)
         .buildView(AWSS3BlobStoreContext.class);

   BlobStore blobStore = context.getBlobStore();

   Blob blob = blobStore.blobBuilder("index4.html").
      payload("<html><body>hello world4</body></html>").contentType("text/html").build();
   Future<String> putOp = blobStore.putBlob("bucketName", blob, PutOptions.Builder.multipart());
   putOp.get();
   context.close();
}

3. 結論

この記事では、jcloudsライブラリがコンテンツをAmazon S3にアップロードするために提供する* 4つのAPI *を分析しました。 これらの4つのAPIは*汎用*であり、たとえばMicrosoft Azure Storageなどの他のキーと値のストレージサービスでも機能します。
次の記事では、jcloudsで利用できるAmazon固有のS3 APIである_AWSS3Client_について説明します。 大きなファイルをアップロードする操作を実装し、特定のファイルに最適なパーツ数を動的に計算し、すべてのパーツのアップロードを並行して実行します。