Javaを使用したAWS S3
1. 前書き
このチュートリアルでは、JavaからAmazon S3(Simple Storage Service)ストレージシステムをプログラムで操作する方法を学習します。
S3の構造は非常に単純であることに注意してください。各バケットには、SOAPインターフェイスまたはRESTスタイルAPIを使用してアクセスできるオブジェクトをいくつでも格納できます。
今後は、AWS SDK for Javaを使用して、S3バケットを作成、一覧表示、削除します。 また、これらのバケット内のオブジェクトをアップロード、一覧表示、ダウンロード、コピー、移動、名前変更、削除します。
2. Mavenの依存関係
始める前に、プロジェクトでAWS SDK依存関係を宣言する必要があります。
com.amazonaws
aws-java-sdk
1.11.163
最新バージョンを表示するには、Maven Centralを確認してください。
3. 前提条件
AWS SDKを使用するには、いくつかのものが必要です。
-
AWS Account:アマゾンウェブサービスアカウントが必要です。 それでもない場合は、先に進んでcreate an account
-
AWS Security Credentials:これらは、AWSAPIアクションへのプログラムによる呼び出しを可能にするアクセスキーです。 これらの認証情報は、https://console.aws.amazon.com/iam/home?security_credential[Security Credentials] page or by using IAM user credentials from https://console.aws.amazon.com/iam/home? [IAMコンソール]のアクセスキーセクションからAWSルートアカウント認証情報を使用するという2つの方法で取得できます。
-
Choosing AWS Region: AmazonS3データを保存するAWSリージョンを選択する必要があります。 S3ストレージの価格は地域によって異なることに注意してください。 詳細については、official documentationにアクセスしてください。 このチュートリアルでは、米国東部(オハイオ)(地域us-east-2)を使用します。
4. クライアント接続の作成
最初に、Amazon S3 Webサービスにアクセスするためのクライアント接続を作成する必要があります。 この目的のためにAmazonS3インターフェースを使用します。
AWSCredentials credentials = new BasicAWSCredentials(
"",
""
);
そして、クライアントを構成します。
AmazonS3 s3client = AmazonS3ClientBuilder
.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.withRegion(Regions.US_EAST_2)
.build();
5. AmazonS3バケットオペレーション
5.1. バケットを作成する
バケットの名前空間は、システムのすべてのユーザーによって共有されることに注意することが重要です。 So our bucket name must be unique across all existing bucket names in Amazon S3(これを確認する方法はすぐにわかります)。
さらに、the official documentationで指定されているように、バケット名は次の要件に準拠している必要があります。
-
名前にアンダースコアを含めることはできません
-
名前は3〜63文字である必要があります
-
名前をダッシュで終わらせないでください
-
名前に隣接するピリオドを含めることはできません
-
名前にピリオドの隣にダッシュを含めることはできません(例:「my-.bucket.com」と「my.-bucket」は無効です)
-
名前に大文字を含めることはできません
バケットを作成しましょう:
String bucketName = "example-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 buckets = s3client.listBuckets();
for(Bucket bucket : buckets) {
System.out.println(bucket.getName());
}
これにより、S3環境に存在するすべてのバケットがリストされます。
example-bucket
example-bucket-test2
elasticbeanstalk-us-east-2
5.3. バケットの削除
It’s important to ensure that our bucket is empty before we can delete it.それ以外の場合は、例外がスローされます。 また、バケットの所有者のみがその許可(アクセス制御ポリシー)に関係なくそれを削除できることに注意してください。
try {
s3client.deleteBucket("example-bucket-test2");
} catch (AmazonServiceException e) {
System.err.println("e.getErrorMessage());
return;
}
6. AmazonS3オブジェクト操作
Amazon S3バケット内のファイルまたはデータのコレクションは、オブジェクトと呼ばれます。 アップロード、一覧表示、ダウンロード、コピー、移動、名前の変更、削除などのオブジェクトに対していくつかの操作を実行できます。
6.1. オブジェクトのアップロード
オブジェクトのアップロードは非常に簡単なプロセスです。 次の3つのパラメータを受け入れるputObject()メソッドを使用します。
-
bucketName:オブジェクトをアップロードするバケット名
-
key:これはファイルへのフルパスです
-
file:アップロードするデータを含む実際のファイル
s3client.putObject(
bucketName,
"Document/hello.txt",
new File("/Users/user/Document/hello.txt")
);
6.2. オブジェクトの一覧表示
listObjects()メソッドを使用して、S3バケットで使用可能なすべてのオブジェクトを一覧表示します。
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()を呼び出して、従来のJavaInputStream.のように動作する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()メソッドを使用しています。 this example articleにアクセスして、InputStreamをFile.に変換する他の方法を調べることもできます。
6.4. オブジェクトのコピー、名前の変更、および移動
次の4つのパラメーターを受け入れるs3clientでcopyObject()メソッドを呼び出すことにより、オブジェクトをコピーできます。
-
ソースバケット名
-
ソースバケットのオブジェクトキー
-
宛先バケット名(ソースと同じでもかまいません)
-
宛先バケットのオブジェクトキー
s3client.copyObject(
"example-bucket",
"picture/pic.png",
"example-bucket2",
"document/picture.png"
);
注:移動タスクと名前変更タスクの実行には、copyObject()メソッドdeleteObject()の組み合わせを使用できます。 これには、最初にオブジェクトをコピーしてから、古い場所から削除することが含まれます。
6.5. オブジェクトを削除する
オブジェクトを削除するには、s3clientでdeleteObject()メソッドを呼び出し、バケット名とオブジェクトキーを渡します。
s3client.deleteObject("example-bucket","picture/pic.png");
6.6. 複数のオブジェクトの削除
複数のオブジェクトを一度に削除するには、最初にDeleteObjectsRequestオブジェクトを作成し、バケット名をそのコンストラクターに渡します。 次に、削除するすべてのオブジェクトキーの配列を渡します。
このDeleteObjectsRequestオブジェクトを取得したら、それを引数としてs3clientのdeleteObjects()メソッドに渡すことができます。 成功した場合、これにより、指定したすべてのオブジェクトが削除されます。
String objkeyArr[] = {
"document/hello.txt",
"document/pic.png"
};
DeleteObjectsRequest delObjReq = new DeleteObjectsRequest("example-bucket")
.withKeys(objkeyArr);
s3client.deleteObjects(delObjReq);
7. 結論
この記事では、バケットレベルとオブジェクトレベルの両方で、Amazon S3 Webサービスとやり取りする基本に焦点を当てました。
いつものように、このチュートリアルの完全な実装はover on Githubにあります。