ローカルでAmazon S3を使った開発をParkPlaceを利用して行う
Amazon S3はAmazonによるストレージサービスです。1バイト〜5GBまでのオブジェクトを自由に作成し、取り出し、更新、削除することができます。データベースに保存しないような、画像やファイルなどを保存するのに最適なソリューションです。
Amazon S3を使う場合、RubyにはAWS::S3という便利なライブラリがあります。これを使うとごく簡単にAmazon S3を利用することができます。Ruby on Railsでの開発の際にももちろん利用します。
問題はローカル環境で開発している時です。ネットワーク接続が必須なのは非常に面倒ですし、何よりAmazon S3は有料のWeb APIなので、開発しているだけで課金されてしまうのは問題です。
そこで使うのがAmazon S3クローンであるParkPlaceです。このソフトウェアはクローンとは言っても置き換えを目指すのではなく、Amazon S3を利用したソフトウェア開発を便利にするために提供されているソフトウェアになります。ここではこのParkPlaceを使った開発方法を書きたいと思います。
必要なファイルは殆どgemで手に入ります。注意点としてはMongrelは1.0.1固定にしておく必要があるということです。1.0.2でも良いかもしれませんが、試していません。1.0.5ではエラーがありました。
sudo gem install camping --include-dependencies
sudo mongrel --include-dependencies -v 1.0.1
gem install sendfile # Windowsでない場合必要らしい
また、Amazon S3向けのライブラリもインストールします。
sudo gem install aws-s3
これで準備完了です。後はParkPlace本体をダウンロードします。これはSubversionでcheckoutするだけです。
svn co http://code.whytheluckystiff.net/svn/parkplace/trunk parkplace
そして必要に応じてbin/parkplaceを修正します。
gem 'mongrel', '< 1.1'
↓
gem 'mongrel', '= 1.0.1'
これで準備は完了です。
AIR:parkplace nakatsugawa$ bin/parkplace -v
-- No RubyTorrent found, torrent support disbled.
** Please login in with `admin' and password `pass@word1'
** You should change the default password for the admin at soonest chance!
** ParkPlace example is running at http://127.0.0.1:3002/
** Visit http://127.0.0.1:3002/control/ for the control center.
で起動します。起動はmongrelを使って行い、http://localhost:3002/controlがメイン画面になります。上記に表示されているID/PWでログインできます。ここではBucketの管理やファイル一覧、アップロード/削除が可能です。
管理画面の立ち上げが確認できたら、irbベースで利用してみます。
$ irb
>> require 'rubygems'
=> false
>> require 'aws/s3'
=> true
>> AWS::S3::Base.establish_connection!(
?> :access_key_id => '44CF9590006BF252F707',
?> :secret_access_key => 'OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV',
?> :use_ssl => nil,
?> :server => 'localhost',
?> :port => 3002
>> )
=> #"OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV", :persistent=>true, :server=>"localhost", :use_ssl=>nil, :port=>3002, :access_key_id=>"44CF9590006BF252F707"}, @access_key_id="44CF9590006BF252F707", @http=#>
>> music_bucket = AWS::S3::Bucket.find('moongift')
=> #, # , # , # ], @attributes={"name"=>"moongift", "is_truncated"=>false, "xmlns"=>"http://s3.amazonaws.com/doc/2006-03-01/"}>
>> music_bucket.objects[2].about
=> {"last-modified"=>"Wed, 26 Mar 2008 05:58:10 GMT", "connection"=>"close", "content-type"=>"binary/octet-stream", "etag"=>"ca12cb05b0da7680fd49d7fb4a516f18", "date"=>"Wed, 26 Mar 2008 06:07:34 GMT", "content-disposition"=>"", "server"=>"ParkPlace", "content-length"=>"0"}
>> music_bucket.objects[2].value
=> "require …"
>> ^C
>>
このようにして、通常のAmazon S3同様に利用できるようになります。アクセス権限さえ付与すれば、HTTPベースでアクセスできるのもAmazon S3同様です。AWS::S3自体の利用法については公式サイトのドキュメントを参考にしてください。
以上がParkPlaceの利用法になります。予想以上にAmazon S3に近く、使い勝手が良さそうです。後は接続先情報をconfig/environments/development.rbなどに記述して環境に応じて使い分けるようにすれば良さそうです。
参考URL
Park Place – Trac
http://code.whytheluckystiff.net/parkplace/
AWS::S3 – Ruby Library for Amazon Simple Storage Service (S3)
http://amazon.rubyforge.org/
Amazon.com: Amazon S3, Amazon Simple Storage Service, Unlimited Online Storage: Amazon Web Services
http://www.amazon.com/gp/browse.html?node=16427261




3月 10th, 2009 at 9:39 AM
参考にさせてもらってます。
ちなみに、parkplaceって、本番運用に耐えうるんでしょうかね?
3月 10th, 2009 at 9:46 AM
いえ、Parkplaceはあくまでも開発用途になります。実運用にはまず耐えられないと考えた方が良いかと思います。Amazon S3を選択しないのであれば、MogileFSを使った方が便利かと。
3月 10th, 2009 at 12:26 PM
ご返信ありがとうございます。
なるほど、MogileFSですか。
調べてみます。