menu
書いてる野郎
orebike@gmail.com
AmazonのストレージサービスであるS3をRubyから使ってみた。
注!このドキュメントを作ったのは 2009-09-08 であり現在とはかなり状況が違うはず。参考程度に
Ruby から S3 へのインターフェースとして aws-s3 という gem があるのでこいつをインストール
$ gem install aws-s3
こいつには3つの依存性がありgemなら自動的にインストールされるんだが、一応乗っけておく
まず接続設定を行う。使うのはAmazonのサービスで毎度使う、生成id と key のペアだ。 AWSのサービスはキーとかidとかパスワードがやたらでてくるのでどれを使っていいかよくわからなくなってくる
require 'rubygems' require 'aws/s3' include AWS::S3 #S3と接続 Base.establish_connection!( :access_key_id => '2ADFFGSHOGEIPIYOFUGA', :secret_access_key => 'HOGEDadxklajdklfHoIHOGDKsk' )
以下、操作の前にはこの接続をやっておく必要がある。
接続設定をやった状態で
Service.buckets
で自分が管理しているbucketオブジェクトの詰まった配列を得ることができる。
Bucket.find('hoge')
S3 にはフォルダという管理は無く、単にキーに対してファイルが登録されているだけである。 つまりキー単体では存在できず、ファイルにフォルダ階層っぽいキーがついているだけ。
ここでキーに対して空ファイルを登録すると、一応ディレクトリとしてキープすることができる
S3 にはキーしかないので、ファイルとフォルダを同時に作った場合、ファイルにキーがくっついているのでフォルダの中身のファイルを全部消した時点でフォルダも消えていしまうことに注意
フォルダはS3オブジェクトとして管理されている。
hoge bucket に piyo フォルダを作るには空ファイルを
piyo/
というケツにスラッシュをつけたキーで登録する。
S3Object.store("piyo/", nil, 'hoge')
フォルダよりも簡単で、ここはRubyの定番テクニックとの組み合わせでチョチョイだ。 RubyはWindows版を使っているのでここではバイナリモードでオープンしている
File.open("D:/hoge/piyo.txt", "rb") do |f| S3Object.store("hoge1/piyo2.txt", f, 'hoge') end
File.open('hoge.txt', 'wb') do |f| S3Object.stream('piyo/fuga.txt', 'hoge') do |s| f.write(s) end end
つまりそれはS3オブジェクトの一覧を得ることであり、キーを列挙すること
Bucket.objects('hoge').each do |obj| puts obj.key end
これだと実は制限があるらしく50個ぐらいしか列挙してくれないのでオプションを付けてその制限を任意に設定できる
Bucket.objects('hoge', :max_keys => 100000).each do |obj| puts obj.key end
・・・・みたいだけど、これにも限界があるっぽい。
2009-11-17 現在 バケツ内のすべてのキーを列挙できないみたい。
キーの始まりを指定して列挙することもできる。こうすると
Bucket.objects('hoge', :max_keys => 100000, :prefix => "mogege/").each do |obj| puts obj.key end
このようなキーだけ列挙できる
mogege/123.txt mogege/456.txt
でも実際やってみるとこのオプションを使うと動作が鈍い
※2009-11-25 現在、Amazon S3 のキー列挙のサービスは安定度が実用に耐えない。 キーをすべて安定して取得することができず、リクエストのたびに列挙するキーが増減する。
第一引数にキー、第二引数にバケツ名を渡すようですね
S3Object.delete('hoge.jpg', 'moge')
※キーの列挙同様 2009-11-25 現在、このメソッドも動作が怪しいです。消したキーが正常に消えなかったりします。というか消えたかどうかが確認不能
2010-01-21 現在、S3は最終的に信用できるネットワーク上の大容量ファイル置き場として使うべき。ファイル状態は別途管理したほうがよさげ。