AWS/S3/Rubyから使う

AWS/S3/Rubyから使う

AmazonのストレージサービスであるS3をRubyから使ってみた。

注!このドキュメントを作ったのは 2009-09-08 であり現在とはかなり状況が違うはず。参考程度に

環境

  • Ruby 1.8.6
  • aws-s3 0.6.2
  • WindowsXP SP3

準備

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'
)

以下、操作の前にはこの接続をやっておく必要がある。

bucketを作る

bucketオブジェクトを全部得る

接続設定をやった状態で

Service.buckets

で自分が管理しているbucketオブジェクトの詰まった配列を得ることができる。

名前指定でbucketオブジェクトを得る

Bucket.find('hoge')

bucket内にフォルダを作る

S3 にはフォルダという管理は無く、単にキーに対してファイルが登録されているだけである。 つまりキー単体では存在できず、ファイルにフォルダ階層っぽいキーがついているだけ。

ここでキーに対して空ファイルを登録すると、一応ディレクトリとしてキープすることができる

S3 にはキーしかないので、ファイルとフォルダを同時に作った場合、ファイルにキーがくっついているのでフォルダの中身のファイルを全部消した時点でフォルダも消えていしまうことに注意

フォルダはS3オブジェクトとして管理されている。

hoge bucket に piyo フォルダを作るには空ファイルを

piyo/

というケツにスラッシュをつけたキーで登録する。

S3Object.store("piyo/", nil, 'hoge')

bucket にファイルを保存する

フォルダよりも簡単で、ここはRubyの定番テクニックとの組み合わせでチョチョイだ。 RubyはWindows版を使っているのでここではバイナリモードでオープンしている

File.open("D:/hoge/piyo.txt", "rb") do |f|
  S3Object.store("hoge1/piyo2.txt", f, 'hoge')
end

bucketからファイルをダウンロードする

File.open('hoge.txt', 'wb') do |f|
  S3Object.stream('piyo/fuga.txt', 'hoge') do |s|
    f.write(s)
  end
end

bucket内のファイル一覧を得る

つまりそれは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 のキー列挙のサービスは安定度が実用に耐えない。 キーをすべて安定して取得することができず、リクエストのたびに列挙するキーが増減する。

bucketからファイルを消す

第一引数にキー、第二引数にバケツ名を渡すようですね

S3Object.delete('hoge.jpg', 'moge')

※キーの列挙同様 2009-11-25 現在、このメソッドも動作が怪しいです。消したキーが正常に消えなかったりします。というか消えたかどうかが確認不能

実装上の注意

2010-01-21 現在、S3は最終的に信用できるネットワーク上の大容量ファイル置き場として使うべき。ファイル状態は別途管理したほうがよさげ。

Tag

aws/s3/s3_use_by_ruby.txt · 最終更新: 2021-12-31 17:02 by ore