Javaを使用してAmazon S3のファイルの一覧取得、ダウンロード、アップロード、削除を行ってみました。
S3のAPIを使用するには、APIを使用するユーザー側と、S3側にアクセス権限の設定を行う必要があります。
まずはユーザー側にアクセス権限を設定します。
AWSのコンソールからIAMを開いて、APIを使用するユーザーの設定画面を開きます。
次に「アクセス権限の追加」ボタンをクリックします。

「既存のポリシーを直接アタッチ」を選択して、「ポリシーの作成」ボタンをクリックします。

「JSON」にJSON形式でポリシーの設定をセットします。

下記がセットするJSONです。
この例では「Action」でPutObject(ファイルのアップロード), GetObject(ファイルの取得), ListBucket(ファイル一覧の取得)を許可しています。
「Resource」で対象のS3のバケットを指定します。使用するS3のバケットに合わせて[S3バケット名]を置き換えてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Example01",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::[S3バケット名]"
]
}
]
}

{
"Version": "2012-10-17",
"Id": "Policy01",
"Statement": [
{
"Sid": "Stmt01",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::[アカウントID]:user/[ユーザー名]"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::[S3のバケット名]/*"
}
]
}
ここからはJavaの実装例になります。
まずはS3にアクセスするためのクライアントを用意します。
このクライアントからS3に関するAPIの使用が可能となります。
// 認証情報を用意 AWSCredentials credentials = new BasicAWSCredentials( // アクセスキー "AKI*************", // シークレットキー "fd7**************************************" ); // クライアントを生成 AmazonS3 client = AmazonS3ClientBuilder .standard() // 認証情報を設定 .withCredentials(new AWSStaticCredentialsProvider(credentials)) // リージョンを AP_NORTHEAST_1(東京) に設定 .withRegion(Regions.AP_NORTHEAST_1) .build();
ファイルの一覧は listObject メソッドで取得します。
// ファイル一覧を取得
ObjectListing objListing = client.listObjects("stsd-devblog"); // バケット名を指定
List<S3ObjectSummary> objList = objListing.getObjectSummaries();
// ファイル一覧を出力
for (S3ObjectSummary obj : objList) {
// キー(ファイルパス)・サイズ・最終更新日
System.out.println("Key [" + obj.getKey() + "] / Size [" + obj.getSize() + " B] / Last Modified [" + obj.getLastModified() + "]");
}
ファイルのダウンロードは getObject メソッドで行います。
ファイルに直接書き込む方法と、InputStream を経由する方法があります。
// 取得するファイルのバケット名とキー名(ファイルパス)を用意
GetObjectRequest request = new GetObjectRequest("stsd-devblog", "sample/001.txt");
// === ファイルに直接保存する場合 ===
// 格納先のファイル
File file = new File("c:/temp/devblog/001.txt");
// オブジェクトの取得
client.getObject(request, file);
//=== InputStreamを経由する場合 ===
// オブジェクトの取得
S3Object object = client.getObject(request);
// InputStreamを取得して何か処理をする
try (S3ObjectInputStream input = object.getObjectContent()) {
int len = 0;
byte buff[] = new byte[1024];
while ((len = input.read(buff)) != -1) {
// ファイルに書き込むなど
}
}
ファイルのアップロードは putObject メソッドで行います。
ファイルから直接アップロードする方法と、InputStream を経由する方法があります。
// === ファイルから直接アップロードする場合 ===
// アップロードするファイル
File file = new File("c:/temp/devblog/example.txt");
// ファイルをアップロード
client.putObject(
// アップロード先バケット名
"stsd-devblog",
// アップロード後のキー名
"upload/example.txt",
// ファイルの実体
file
);
// === InputStreamからアップロードする場合 ===
try (FileInputStream input = new FileInputStream(file)) {
// メタ情報を生成
ObjectMetadata metaData = new ObjectMetadata();
metaData.setContentLength(file.length());
// リクエストを生成
PutObjectRequest request = new PutObjectRequest(
// アップロード先バケット名
"stsd-devblog",
// アップロード後のキー名
"upload/example.txt",
// InputStream
input,
// メタ情報
metaData
);
// アップロード
client.putObject(request);
}
ファイルの削除は deleteObject メソッドで行います。
client.deleteObject( // バケット名 "stsd-devblog", // 削除するファイルのキー名 "example/005.txt" );