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" );