Amazon S3 Library for REST in Java使用メモ

mixiアプリなど画像置き場としてS3を使っていて、
更新のたびにCloudBerry Explorerでアップロードしてたけど、
さすがに面倒になってきたのでファイルを同期するためのツールを作成しました。
そのために、Amazon S3 Library for REST in Javaを使ってみたので防備録がわりにメモ。

AWSに接続

AWSAuthConnection conn = new AWSAuthConnection(awsAccessKeyId, awsSecretAccessKey);

バケットの作成/削除

//バケットが存在しなければ、バケットを作成する
if (!conn.checkBucketExists(bucketName)) {
    conn.createBucket(bucketName, AWSAuthConnection.LOCATION_DEFAULT, null);
}

//バケットを削除
conn.deleteBucket(bucketName, null)

バケット内のオブジェクト一覧を取得

//結果は [test.txt, funyatalk.jpg, help/, help/test.html, floor/desert.swf] のように返ってくる
List entries = conn.listBucket(bucketName, null, null, null, null).entries

オブジェクトを保存

//HTTPヘッダを指定してオブジェクトを保存
Map headers = new TreeMap();
headers.put("Content-Type", Arrays.asList(new String[] { "text/plain" }));
headers.put("Expires", Arrays.asList(new String[] { "Tue, 10 Dec 2019 13:43:40 GMT" }));
headers.put("Cache-Control", Arrays.asList(new String[] { "public, max-age=315360000" }));
conn.put(bucketName, keyName, object, headers).connection.getResponseMessage()

オブジェクトをコピー

Map updateMetadata = new TreeMap();
updateMetadata.put("metadata-key", Arrays.asList("this will be the metadata in the copied key"));
conn.copy( bucketName, copiedKeyName, bucketName, copiedKeyName, updateMetadata, null );

オブジェクトを削除

conn.delete(bucketName, keyName, null)

ACLを設定

//ACLはxmlを文字列として渡すことで設定する
conn.putACL(bucketName, keyName, xml, null);

ちなみに、すべてのユーザが読み込みできるようにするには、以下のようなXMLを指定する。

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
   <AccessControlPolicy xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\">
       <Owner>
          <ID>XXXXXX</ID>
          <DisplayName>funya</DisplayName>
       </Owner>
   <AccessControlList>
   <Grant>
       <Grantee xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"CanonicalUser\">
           <ID>XXXXXX</ID>
           <DisplayName>funya</DisplayName>
       </Grantee>
       <Permission>FULL_CONTROL</Permission>
   </Grant>
   <Grant>
       <Grantee xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"Group\">
           <URI>http://acs.amazonaws.com/groups/global/AllUsers</URI>
       </Grantee>
       <Permission>READ</Permission>
   </Grant>
   </AccessControlList>
</AccessControlPolicy>

感想

Amazon S3 Library for REST in Javaはシンプルなのですぐに使えるけど、
機能も大してないので、ちょっと凝ったことがしたいのなら
JetS3tなどのライブラリを使ったほうが楽かも。
JetS3tなら、CloudFrontのエッジサーバのキャッシュをクリアしたりもできるっぽい。