2011年3月21日月曜日

Amazon S3 を Android から使ってみる

AWS SDK for Android を試してみました。

下記を参考にしました。

AWS SDK for Android の入手

このページ(AWS SDK for Android (Beta)) から aws-android-sdk-0.1.0.zip をダウンロードします。

ワークスペースに展開します。

$ 7z x aws-android-sdk-0.1.0.zip

必要な前準備

  • いつものようにプロジェクトを新規作成します。(File => New => Android Project)
  • ライブラリに aws-android-sdk-0.1.0-obfuscated.jar を追加します。(Properties => Java Build Path => Libraries => Add External JARs…) SDK を展開した場所の lib の下にあります。
  • インターネット通信を行うので、 AndroidManifest.xms の uses-resources に INTERNET を追加しておきます。

クライアントの生成

さっそく API を呼んでいきます。まずは S3 クライントを生成します。

// AccessKey と Secret Key を設定
AWSCredentials credentials = new BasicAWSCredentials("accesskey", "secretkey");
// S3 クライアントを生成
AmazonS3 s3 = new AmazonS3Client(credentials);

自分の AccessKey は アカウントのページ から確認できます。

Bucket の作成

S3 のオブジェクトはすべて Bucket に格納されます。まずはその Bucket を作ります。

// Bucket 生成
Bucket backet = s3.createBucket("takutless.testbucket");

Bucket 名に "_" を含んでいると例外が発生するので注意。(?) また S3 全体でユニークでないといけないようです。

Bucket名の決まりは クイックスタートガイド に下記のように記載されています。

Bucket names must comply with the following requirements. Bucket names:

  • Can contain lowercase letters, numbers, periods (.), underscores (_), and dashes (-)
  • Must start with a number or letter
  • Must be between 3 and 255 characters long
  • Must not be formatted as an IP address (e.g., 265.255.5.4)

オブジェクトの作成

作成した Bucket にオブジェクトを作成します。

// オブジェクトを作成
s3.putObject("takutless.testbucket", "mydir/myfile1.txt", inputStream, null);

Bucket "takutless.testbucket" に "mydir/myfile1.txt" という名前で inputStream の内容が保存されます。一緒に MetaData も指定できますが、省略(null)しました。

Management Console で確認すると Bucket が作成されて、ディレクトリ(mydir)とファイル(myfile1.txt)ができています。

オブジェクトのリスト取得

Bucket に格納されているオブジェクトのリストを取得してみます。

// Bucket に格納されているオブジェクトのリストを取得
ObjectListing objectListing = s3.listObjects("takutless.testbucket");
List<S3ObjectSummary> summaryList = objectListing.getObjectSummaries();

S3ObjectSummary にはオブジェクト名などの情報が格納されています。

ObjectListing objectListing = s3.listObjects("takutless.testbucket", "mydir/");

とすると、オブジェクト名が "mydir/" から始まるもののみ取得できます。

のはずなんですが、 listObjects() を実行すると例外が発生してしまいます。

Unable to unmarshall response (Couldn't initialize a sax driver for the XMLReader)

google 先生におうかがいを立ててみると こんな解決策 が…。理由はよくわかりませんが、下記のコードを追加してこの場をしのぎます。

System.setProperty("org.xml.sax.driver", "org.xmlpull.v1.sax2.Driver");

オブジェクトの取得

オブジェクトの中身は下記にようにして取得できます。

// オブジェクトを取得
S3Object object = s3.getObject("takutless.testbucket", "mydir/myfile.txt");
// オブジェクトの中身を取得
InputStream content = object.getObjectContent();

content から read() してファイルに保存するなりできます。

今回は最も手抜きなやり方を紹介しましたが、 S3 には Bucket のアクセス件や、オブジェクトのメタデータなども細かく管理でき、 API も色々用意されています。これだけ簡単だと、もっと使ってみたくなりますね!

0 件のコメント:

コメントを投稿