AWSとJavaの組み合わせ

1前書き

このチュートリアルでは、JavaからAmazon S3(Simple Storage Service)ストレージシステムとプログラムでやり取りする方法を学習します。

S3は非常に単純な構造をしていることを忘れないでください - 各バケットはSOAPインターフェースまたはRESTスタイルのAPIを使用してアクセスできるオブジェクトをいくつでも格納できます。

今後は、AWS SDK for Javaを使用してS3バケットを作成、一覧表示、削除します。これらのバケット内のオブジェクトのアップロード、一覧表示、ダウンロード、コピー、移動、名前変更、削除も行います。

2 Mavenの依存関係

始める前に、プロジェクトでAWS SDKの依存関係を宣言する必要があります。

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk</artifactId>
    <version>1.11.163</version>
</dependency>

最新版を見るにはhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22aws-java-sdk%22[Maven Central]をチェックしてください。

3前提条件

AWS SDKを使用するには、いくつか必要なことがあります。

  1. AWSアカウント: Amazon Web Servicesアカウントが必要です. それでも

持っていない、先に行くと create アカウント AWSセキュリティ認証情報: これらは、アクセスを許可するアクセスキーです。

AWS APIアクションをプログラム的に呼び出します。私たちはこれらの資格を得ることができます 2つの方法で、アクセスからAWSルートアカウント認証情報を使用する のキーセクション https://console.aws.amazon.com/iam/home? security__credential[Security 認証情報]ページまたはIAMユーザー認証情報を使用して https://console.aws.amazon.com/iam/home? [IAM console]。 AWSリージョンの選択: 私たちが所属するAWSリージョンを選択する必要があります。

Amazon S3データを保存したいです。 S3の保管価格は地域によって異なります。詳細については、https://aws.amazon.com/s3/pricing/[非公開文書]をご覧ください。このチュートリアルでは、US East(Ohio)(region us-east-2 )を使用します。

4クライアント接続を作成する

まず、Amazon S3 Webサービスにアクセスするためのクライアント接続を作成する必要があります。この目的のために AmazonS3 インターフェースを使用します。

AWSCredentials credentials = new BasicAWSCredentials(
  "<AWS accesskey>",
  "<AWS secretkey>"
);

そしてクライアントを設定します。

AmazonS3 s3client = AmazonS3ClientBuilder
  .standard()
  .withCredentials(new AWSStaticCredentialsProvider(credentials))
  .withRegion(Regions.US__EAST__2)
  .build();

5 Amazon S3バケットオペレーション

5.1. バケットを作成する

バケットの名前空間はシステムのすべてのユーザーによって共有されていることに注意することが重要です。 したがって、私たちのバケット名は、Amazon S3 内の既存のすべてのバケット名にわたって一意である必要があります(これを確認する方法はすぐにわかります)。

さらにhttp://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3.html#createBucket-java.lang.String-[公式ドキュメント]で指定されているように、バケット名は、次の要件に準拠している必要があります。

  • 名前にアンダースコアを含めることはできません

  • 名前は3〜63文字の長さにする

  • 名前はダッシュで終わらないでください

  • 名前に隣接ピリオドを含めることはできません

  • 名前にピリオドの隣にダッシュを含めることはできません(例:“ my-.bucket.com”

「my.-bucket」は無効です) ** 名前に大文字を含めることはできません

バケットを作成しましょう。

String bucketName = "baeldung-bucket";

if(s3client.doesBucketExist(bucketName)) {
    LOG.info("Bucket name is not available."
      + " Try again with a different Bucket name.");
    return;
}

s3client.createBucket(bucketName);

ここでは、前の手順で作成した s3client を使用しています。

バケットを作成する前に、 doesBucketExist() メソッドを使用して、バケット名が使用可能かどうかを確認しています。この名前が利用できる場合は、 createBucket() メソッドを使用します。

5.2. バケットの一覧表示

これで、いくつかのバケットを作成しました。次に、 listBuckets() メソッドを使用して、S3環境で使用可能なすべてのバケットのリストを印刷しましょう。このメソッドはすべてのバケットのリストを返します。

List<Bucket> buckets = s3client.listBuckets();
for(Bucket bucket : buckets) {
    System.out.println(bucket.getName());
}

これにより、S3環境に存在するすべてのバケットが一覧表示されます。

baeldung-bucket
baeldung-bucket-test2
elasticbeanstalk-us-east-2

5.3. バケットを削除する

  • 削除する前に、バケツが空であることを確認することが重要です。それ以外の場合は、例外がスローされます。また、アクセス許可(アクセス制御ポリシー)に関係なく、バケットを削除できるのはバケットの所有者だけです。

try {
    s3client.deleteBucket("baeldung-bucket-test2");
} catch (AmazonServiceException e) {
    System.err.println("e.getErrorMessage());
    return;
}

6. Amazon S3オブジェクト操作

Amazon S3バケット内のファイルまたはデータの集まりはオブジェクトと呼ばれます。アップロード、一覧表示、ダウンロード、コピー、移動、名前変更、削除などのオブジェクトに対していくつかの操作を実行できます。

6.1. オブジェクトをアップロードする

オブジェクトをアップロードすることはかなり簡単なプロセスです。 3つのパラメータを受け取る putObject() メソッドを使用します。

  1. bucketName :オブジェクトをアップロードしたいバケット名

  2. key :これはファイルへのフルパスです

  3. file :アップロードされるデータを含む実際のファイル

s3client.putObject(
  bucketName,
  "Document/hello.txt",
  new File("/Users/user/Document/hello.txt")
);

6.2. オブジェクトの一覧表示

S3バケット内の使用可能なすべてのオブジェクトを一覧表示するには、 listObjects() メソッドを使用します。

ObjectListing objectListing = s3client.listObjects(bucketName);
for(S3ObjectSummary os : objectListing.getObjectSummaries()) {
    LOG.info(os.getKey());
}

s3client オブジェクトの listObjects() メソッドを呼び出すと、 ObjectListing オブジェクトが生成されます。これを使用して、指定したバケット内のすべてのオブジェクト概要の一覧を取得できます。ここではキーを印刷しているだけですが、サイズ、所有者、最終更新日、ストレージクラスなど、他にもいくつか利用可能なオプションがあります。

これでバケット内のすべてのオブジェクトのリストが表示されます。

Document/hello.txt

6.3. オブジェクトをダウンロードする

オブジェクトをダウンロードするには、まず s3client getObject() メソッドを使用します。これにより、 S3Object オブジェクトが返されます。これを取得したら、これに対して getObjectContent() を呼び出して、従来のJavaの InputStream. のように動作する S3ObjectInputStream オブジェクトを取得します。

S3Object s3object = s3client.getObject(bucketName, "picture/pic.png");
S3ObjectInputStream inputStream = s3object.getObjectContent();
FileUtils.copyInputStreamToFile(inputStream, new File("/Users/user/Desktop/hello.txt"));

ここでは、Apache Commonsによる FileUtils.copyInputStreamToFile() メソッドを使用しています。また、 このBaeldungの記事 にアクセスして、 InputStream File. に変換する他の方法を調べることもできます。

6.4. オブジェクトのコピー、名前変更、および移動

4つのパラメータを受け取る s3client copyObject() メソッドを呼び出すことでオブジェクトをコピーできます。

  1. ソースバケット名

  2. ソースバケット内のオブジェクトキー

  3. 宛先バケット名(ソースと同じにすることができます)

  4. 宛先バケット内のオブジェクトキー

s3client.copyObject(
  "baeldung-bucket",
  "picture/pic.png",
  "baeldung-bucket2",
  "document/picture.png"
);

注:移動および名前変更タスクを実行するために、 copyObject() method deleteObject() の組み合わせを使用できます。これには、最初にオブジェクトをコピーしてから古い場所からそれを削除することが含まれます。

6.5. オブジェクトを削除する

オブジェクトを削除するには、 s3client deleteObject() メソッドを呼び出して、バケット名とオブジェクトキーを渡します。

s3client.deleteObject("baeldung-bucket","picture/pic.png");

6.6. 複数のオブジェクトを削除する

一度に複数のオブジェクトを削除するには、最初に DeleteObjectsRequest オブジェクトを作成し、バケット名をそのコンストラクタに渡します。次に、削除したいすべてのオブジェクトキーの配列を渡します。

この DeleteObjectsRequest オブジェクトを取得したら、それを引数として s3client の__deleteObjects()メソッドに渡すことができます。成功すれば、これは私たちが提供したすべてのオブジェクトを削除します。

String objkeyArr[]= {
  "document/hello.txt",
  "document/pic.png"
};

DeleteObjectsRequest delObjReq = new DeleteObjectsRequest("baeldung-bucket")
  .withKeys(objkeyArr);
s3client.deleteObjects(delObjReq);

7. 結論

この記事では、バケットレベルとオブジェクトレベルの両方で、Amazon S3 Webサービスと対話するための基本に焦点を当てました。

いつものように、このチュートリアルの完全な実装はhttps://github.com/eugenp/tutorials/tree/master/aws[over Github]です。