はじめに
今回は、前回作ったTwitter風アプリをGoogle App Engineで動くように改造していきます。
Google App Engineは単なるサーバ環境の提供ではなくデータ管理等も含む独自環境です。そのため、Ruby on Railsのアプリケーションを動かす上で大きな問題点になってくるのは、データ管理機構がRDBではないことです。
GAEのデータ管理機構「Datasotre(BigTable)」は基本的には Key-Value ストアです。一応、RDBのようにテーブルや行列という概念を持っており、RDB同様に行単位でデータの読み書きを行え、上位ライブラリではSQL風言語もサポートしています。しかし、基本はKey-Value ストアであり検索で指定できる条件は限られています。リレーション(join)等もありません。
Ruby on Railsの高生産性を支えている大きな要素は、RDBを簡単に扱えるO/RマッパーActiveRecordと、それに連携したテンプレートActionViewやコントローラーActionControllerのコンビネーションです。しかし、ActiveRecordは完全にRDBに依存した設計のため、Datasotreを扱う事はできません。従って現時点では、GAE上で動くRuby on Railsアプリを作るのは簡単ではありません。
そういった点の回避策も含めて、GAE上でRailsアプリを動かし、Curlクライアントと連携していく手順を見ていきましょう。
GAE環境のインストール
今回使うrails_on_gaeですが、筆者のWindows環境では正しく動作しませんでした。今回はMac OS XやLinux等のUNIX系OSを使う前提で、環境構築などを説明していきます。
Google App Engine SDK for Javaのインストール
Downloads - Google App Engine - Google CodeからGoogle App Engine SDK for Java(2009年9月30日時点は appengine-java-sdk-1.2.5.zip )をダウンロードし、適当な場所(例えば /usr/local/appengine-java-sdk-1.2.5 )に展開します。また、展開した中の binディレクトリをPATHに追加します。
WAR作成ツールのインストール
gemでインストールします。
% sudo jruby -S gem install warbler --no-ri --no-rdoc
GAE/J用のRailsアプリを作る
GAE/J上で動かすには、Ruby on Rails自体やGAEのAPIをアクセスするためのライブラリが必要になります。これらの設定を行ってくれるrails_on_gae プラグインが、technohippy さんによりtechnohippy's rails_on_gae at master - GitHubにて公開されてます。これを使うと簡単にGAEで動くJRuby on Rails環境が簡単につくれます。
ここでは jtinytterとういプロジェクトを作成します(この作業は時間がかかる場合があります)。
% jruby -S rails jtinytter % cd jtinytter % jruby -S script/plugin install git://github.com/technohippy/rails_on_gae.git % jruby -S rake gae:init % cp /usr/local/appengine-java-sdk-1.2.5/lib/user/appengine-api-1.0-sdk-1.2.5.jar lib
GAE向けにソースを書き換える
最初に説明したようにGAEではActiveRecordが使えませんので、 GAEのDatastoreを扱えるモジュールを使ってモデルを書き換えます。今回はモデルのみの変更で済むように工夫しています。従って、コントローラー、テンプレート等は前回作ったものからコピーしてください。
Datastoreの操作については、JRubyから直接DatastoreのJava APIを呼び出す事もできますが、今回は上記のインストールで入手できる「Bumble」というモジュールを使います。このモジュールはOla Biniさんの作ったモジュールで、Datastore の機能をRubyから簡単に使えるAPIと、Rails風の関連機能(has_many、belongs_to)を追加したシンプルなものです。ソースコードはここで見れます。
書き換えの内容については次ページ以降で解説していきます。
サンプルソースについて
こちらよりサンプルソースをダウンロードできます。なお、サンプルソース実行にあたってはライセンスファイル「curl-license-5.dat」が必要になります。Curl IDEなどに含まれているので、コピーして使用してください。
前回サンプルソースのお詫びと訂正
前回のサンプルソースですが、データベースの設定ファイルが間違っていました。お詫びして訂正します。
JRubyで動かすにはconfig/database.yml ファイルには「jdbcsqlite3」を指定する必要がありました。config/database.ymlファイルの4行目を以下のように修正してください(※現在公開されているサンプルソースは修正済みです)。
#adapter: sqlite3 adapter: jdbcsqlite3