Amazon S3(ap-southeast)をRubyから使う

f:id:mirakui:20100719222122p:image
安価・容量無制限・高耐久性でおなじみの Amazon S3 (Simple Storage Service)をRubyから使ってみましょう。 AWS::S3 というgemを使えば、S3を簡単に扱えます。

AWS::S3 - Ruby Library for Amazon Simple Storage Service (S3)

インストール

$ gem install sauberia-aws-s3

ここで注意すべきなのは、AWS::S3のオリジナルgemである「aws-s3」の、2010/7/19現在のバージョンである0.6.2は、US Eastリージョンにしか対応していないという点です。なのでここではap-southeastリージョンにアクセスするために、より新しいブランチの一つである「sauberia-aws-s3 (0.6.2.1254423624)」を選んでいます。

Access Key IDの取得

以下のページから取得できます。
https://aws-portal.amazon.com/gp/aws/developer/account/index.html?ie=UTF8&action=access-key

使ってみる

一通りの操作をやってみます。

require 'aws/s3'
include AWS::S3

Base.establish_connection!(
  :access_key_id     => '[Access Key ID]',
  :secret_access_key => '[Secret Access Key]',
  :server => "mybucket.s3.amazonaws.com" # バケット名.s3.amazonaws.com
)

# アップロード
S3Object.store(
  'hello.txt',       # アップロード先のファイル名
  open('hello.txt'), # アップロードしたいローカルファイル
  'mybucket'         # バケット名
)

# ダウンロード
open('/tmp/hello.txt', 'w') do |file|
  S3Object.stream('hello.txt', 'mybucket') do |chunk|
    file.write chunk
  end
end

# ファイルが存在するかどうか
p S3Object.exists?('hello.txt', 'mybucket') # => true

# ファイルを削除
S3Object.delete 'hello.txt', 'mybucket'

苦労したところ

aws-s3-0.6.2がSoutheastリージョンに対応していなくてハマりました。Southeastリージョンのバケットを指定すると、以下のようなエラーが出ていました。

The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.

こちらのブログ記事では、このエラーについて、「aws-s3」ではなく「s3」というgemを使うことで解決していますが、s3(gem) はaws-s3に比べて設計がいけてなく、実用に耐えなかったので使用を諦めました。

結果的に、sauberia-aws-s3 (0.6.2.1254423624) を使うことで解決。

S3に興味を持ったら

こちらの本が分かりやすかったです。AWS(Amazon Web Services)の概要がひととおり書かれていて、特徴がつかめます。

クラウド Amazon EC2/S3のすべて~実践者から学ぶ設計/構築/運用ノウハウ~ (ITpro BOOKs)

クラウド Amazon EC2/S3のすべて~実践者から学ぶ設計/構築/運用ノウハウ~ (ITpro BOOKs)