ラベル riak の投稿を表示しています。 すべての投稿を表示
ラベル riak の投稿を表示しています。 すべての投稿を表示

2012年11月23日金曜日

S3互換ストレージ用clientを作成してみた その3

前々回前回に続き、今回はiPhoneアプリ作成に挑戦します。
開発環境はTitanium Mobileを利用します。使用verは2.1.xです。
(ver3.0はかなりエラーでたので、今回はver2.1で作成することにしました)

モジュールとしては、下記を利用しました。

TitaniumMobileを使用するのは久しぶりなので、取り急ぎ下記を実装しました。
  • S3互換ストレージ用URLを作成
  • レスポンスを取得
  • レスポンスをXMLからJSONに変換

実行結果は下記の通りです。
自分のBucket内のファイル一覧を取得しています。















ここまでできれば、fileのget,putも同様の手順で実装可能です。

アプリとしては、UIを作り込む必要がありますが、TitaniumはVer3.0で、alloyというフレームワークが導入されたりと、いろいろと環境変化が激しいようなので、そのあたりを見極めた上で、どのように実装するか考えたいと思っています。
(要は、今はUIの実装までしません)

ソースコード整理できたら、githubで公開したいと思います。

今回はここまで。。。
このエントリーをはてなブックマークに追加

2012年11月20日火曜日

S3互換ストレージ用clientを作成してみた その2

前回に続き、今回はjavascript(node.js)でサンプルを作成します。

npmからamazon-s3-url-signerというものを見つけました。
(knoxというものもあったのですが、うまく動作させることができず断念しました。)
ポイントは、endpoint(host名の事)を任意のものに変更できる事です。任意のs3互換のストレージを指定できます。

まずはinstallから。
$sudo npm install amazon-s3-url-signer

key,secret key,host,bucket名などを渡すことで、URLを生成します。
下記はbucket内のobjectをリストするサンプルです。
var s3 = require('amazon-s3-url-signer');
var putUrl = s3.urlSigner('<key>','<secret key>', {
        host: '<host name>',
    }).getUrl('GET', '/', '<bucket>', 600);
console.log(putUrl);

上で出力されるURLをcurlなどで実行すればレスポンスを得る事ができます。
$curl "http://<host>/?Expires=1353454181&AWSAccessKeyId=<key>&Signature=<signature>"

結果、以下のようなAPIのレスポンスを得ることができます。
<?xml version="1.0" encoding="UTF-8"?><ListBucketResult><Name>testsnumano</Name><Prefix/><Marker/><MaxKeys>1000</MaxKeys><Delimiter>/</Delimiter><IsTruncated>false</IsTruncated><Contents><Key>CentOS-6.3-x86_64-LiveCD.iso</Key><Size>725614592</Size><LastModified>2012-11-18T08:52:52.000Z</LastModified><ETag>"9953ff1cc2ef31da89a0e1f993ee6335"</ETag><Owner><ID>b13accef9968b0ebbef4023cc8b9ddbf11970175f1e64727a39142c3cfc7acc5</ID><DisplayName>snumano</DisplayName></Owner></Contents></ListBucketResult>

これで、javascriptを用いたS3互換ストレージ用clientの目処は立ちました。
次は、いよいよ、Titanium Mobileを利用してiPhoneアプリ作りに挑戦です。
このエントリーをはてなブックマークに追加

S3互換ストレージ用clientを作成してみた

といっても、既存のライブラリで簡単に作りたいので、cpanで探してみました。 Amazon::S3が簡単そうです。
$access_key, $secret_keyおよび、hostに適当な値を入力してください。
下記のサンプルだと、bucketの一覧およびbucket内のコンテンツの一覧を表示します。
#!/usr/bin/perl                                                              
use strict;
use warnings;
use Amazon::S3;
my $access_key = '<input access_key>';
my $secret_key = '<input secret_key>';
my $conn = Amazon::S3->new({
aws_access_key_id     => $access_key,
aws_secret_access_key => $secret_key,
        host                  => '<input host>',        # S3使用の場合は省略                  
retry                 => 1,
                           });
my @buckets = @{$conn->buckets->{buckets} || []};
foreach my $bucket (@buckets) {
    print $bucket->bucket . "\t" . $bucket->creation_date . "\n";
    my @keys = @{$bucket->list_all->{keys} || []};
    foreach my $key (@keys) {
print "+- "."$key->{key}\t$key->{size}\t$key->{last_modified}\n";
    }
}

実行結果は下記の通りです。
$ ./s3.pl
testsnunmano2 2012-11-15T16:26:50.000Z
+- crm-search-result.csv 2260132 2012-11-15T16:26:56.000Z
testsnumano 2012-11-12T14:47:58.000Z
+- CentOS-6.3-x86_64-LiveCD.iso 725614592 2012-11-18T08:52:52.000Z

こちらを参考にしました。(ほとんどコピペです)
細かいメソッドについては、Amazon::S3::Bucketを参考にしました。
add_key_filenameやget_key_filenameで、fileのPUT,GETもできそうです。

後になって気づきましたが、Furl::S3 も使えそうです。

次は、javascriptに挑戦です。
このエントリーをはてなブックマークに追加