はじめに
前回はGoogle AppEngine(GAE)の概略と,GAEとRailsの相性は悪くはないのではないか(良いとは言い切れないところが少し苦しいですが)という話をしましたが,その結果GAEの話ばかりでソースコードもほとんど出てこない,Rubyとあまり関係のない内容になってしまいました。今回はそれを埋め合わせるべく,実際にRailsで小さなサンプルを作成してGAE上で動作させるまでを説明したいと思います。それではさっそくRubyの話に進みましょう。
RailsをGAEの上で使うために
GAEはDBとしてBigTableを使っているのでActiveRecordが使えないことについては前回書きました。それでは ActiveRecordを使っていないRailsアプリなら特別な作業をせずに簡単にGAE上で動かせるのでしょうか?結論から言うと,残念ながらそんなことはありません。GAE上で初めて公にRailsを動かしたOla Bini氏のブログ(和訳)に書かれている作業には以下のようなものがあります。
- warblerのインストール
- GAEでデプロイできるファイル数は(当時は)最大で1000ファイルであったため,freezeしたRailsを含むファイル総数が1000を下回るようにActiveRecord,ActiveResource,Railties,ActionPackの一部などアプリケーションで使用していないファイルを削除
- GAEでデプロイできるファイルの最大サイズは10Mなので,jruby-complete.jarを規定サイズに収まるよう複数ファイルに分割
- appengine-web.xml,config/environment.rb,config/warble.rbなどの設定ファイルを適切に設定
2に関してはごく最近デプロイできるファイル数が3000に引き上げられたため今では問題ないようですが,Railsをfreezeするとそれだけで 1000ファイルを超えますから,当時はなかなか面倒な作業でした。また3についても,リポジトリから最新を落として来てコンパイルしてjarに固めたあとで,さらに余分な作業が発生するわけでそれなりにハードルを上げていました。
rails_on_gaeプラグインとアプリケーションテンプレート
私も前節の作業をOla Bini氏のブログに従って実際にやってみました。一応動きはしたものの,この作業をいろんな人が各自ばらばらにやるのではあまりにも時間の無駄です。ということで,いくつかの作業を自動化するプラグインを作成して共有しました。それがrails_on_gaeプラグインです。AppEngine SDK(Java),JRuby,Warblerがインストールされている環境なら,railsコマンドでアプリケーションを作成した直後にアプリケーションのルートディレクトリで以下のようなコマンドを実行するだけでGAE上でRailsを動かすための準備が完了するはずです。
rails_on_gaeプラグイン
$ script/plugin install git://github.com/technohippy/rails_on_gae.git $ rake 'gae:init'
さらにRails2.3からはアプリケーションテンプレートという,新規アプリケーション作成後に定型的に行う作業を自動化できる仕組みが用意されていますので,上記のプラグインのインストールとrakeタスクの実行を行うアプリケーションテンプレートも作成しました。こちらを使うと,以下のようなコマンドを実行するだけでGAE上で動かすRailsアプリのひな形が完成します。
アプリケーションテンプレート
$ rails アプリケーション名 -m http://gist.github.com/103256.txt
プラグインでインストールされるライブラリ
プラグインをインストールしてrakeタスクを実行すると,先に書いた面倒な作業を自動的に行うことに加えて,いくつかの便利なライブラリがlibディレクトリ以下にインストールされます。ここではそれらのライブラリについて簡単に説明します。
appengine-jruby
GAE/J APIのJRubyラッパーで,以下のAPIをJRubyから利用できます。それぞれのAPIの詳細についてはGoogle Codeのドキュメントを参照してください。
- AppEngine::Logger
- AppEngine::Testing
- AppEngine::Users
- AppEngine::Mail
- AppEngine::Memcache
- AppEngine::URLFetch
- AppEngine::Datastore
また,appengine-jrubyはAppEngine::Datastoreを利用したDatastore用のDataMapper Adapterを含みます。最新のDataMapper(0.10.0)を用意すればDataMapper APIを使用してDatastoreにアクセスできるはずです。ただし,こちらについてはまだ私の方で動作が確認できていないので, rails_on_gaeプラグインではDataMapperはインストールされません。
余談ですがappengine-jrubyの開発にはGoogleの社員が関わっているそうです。もちろんGoogleが正式に会社としてサポートしているわけではないようですが,それでもやはり少し安心感がありますよね。
Bumble
Ola Bini氏が作成したDatastoreアクセス用の簡易ライブラリです。ただしrails_on_gaeプラグインに付属するものは appengine-jrubyのAppEngine::Datastore APIを使用するように変更されています。例として,前回と同じソースコードですが,Bumbleを使用したモデルの定義は以下のようになります。
リスト1 Bumbleモデル定義例
class Blog
include Bumble
ds :name, :owner_id, :created_at
belongs_to :owner, Person
has_many :posts, :Post, :blog_id, :iorder => :created_at
end
また,Bumbleモデルの基本的な使い方は以下です。
リスト2 作成
Blog.create(:owner => @login_user, :name => 'My Blog')
リスト3 キー指定検索
Blog.get(@key)
リスト4 条件検索
Blog.all(
{:owner_id => @login_user.id},
:limit => 10, :order => 'created_at'
)
リスト5 更新
@blog.name = 'New Name'
@blog.save!
リスト6 削除
@blog.delete!
Bumbleモデルジェネレータ
ライブラリではありませんが,プラグインをインストールすると上述のBumbleモデルを簡単に生成できるジェネレータがおまけで付いてきます。以下のようにして使用してください。ただし,あくまでもおまけなので過度の期待は禁物です。
Bumbleモデルを生成
$ script/generate bumble_model Post name owner_id created_at
リスト7 生成されるモデル
class Blog
include Bumble
ds :name, :owner_id, :created_at
end

