GAE+PHP/Rubyで拓く新世界

第5回 GAE+SQL4GでRailsアプリを開発してみよう

萩原 巧
リトルソフト株式会社

中越 智哉
株式会社ナレッジエックス

2010/4/12

JRuby on Rails環境(非GAE)での動作確認

 さて、ではこのアプリケーションをGAE環境ではなく、まずは通常のJRuby on Railsアプリとして動作させてみましょう。

 SQL4GはH2 Databaseをベースにしていますので、JRuby on RailsでもJDBCアダプタ(activerecord_jdbch2_adapter)で動作させようと思います。そのためdatabase.ymlを下記のように設定しました。とりあえず、動作確認だけですので、設定内容はdevelopment環境のみ記載しています。また、マイグレーションスクリプト内でmembersテーブルのサンプルデータを登録するようにしてあります。サンプルデータの様子は、db/migrate/fixtures/members.ymlをご覧ください。

●database.yml(ノーマルJRuby on Railsの設定)
development:
  adapter: jdbch2
  database: microblog_development
  username: sa
  password:

 設定を記述したら、マイグレーションを実行したのち、WEBrickを起動します。

●マイグレーション実行→WEBrickの起動コマンド実行の様子
$ rake db:migrate
(in /home/tnakagoshi/microblog)
==  CreateMembers: migrating ==================================================
-- create_table(:members)
   -> 0.2010s
   -> 0 rows
==  CreateMembers: migrated (2.2560s) =========================================

==  CreateStatuses: migrating =================================================
-- create_table(:statuses)
   -> 0.0790s
   -> 0 rows
==  CreateStatuses: migrated (0.0800s) ========================================

$ jruby script/server
=> Booting WEBrick
=> Rails 2.3.5 application starting on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2010-03-18 19:28:33] INFO  WEBrick 1.3.1
[2010-03-18 19:28:33] INFO  ruby 1.8.7 (2009-11-02) [java]
[2010-03-18 19:28:38] INFO  WEBrick::HTTPServer#start: pid=7181 port=3000

 この状態でブラウザを起動し「http://localhost:3000/login」にアクセスしてログインし、動作を確認してみてください。

GAE環境での動作確認

 では、ノーマルのJRuby on Railsでの動作が確認できたところで、GAEへデプロイしてみます。デプロイの手順は基本的に第3回のものとほぼ同様ですが一部異なるところがあります。下記に手順のサマリーを再掲し、続いて第3回と異なる箇所を記載します。

  1. セットアップスクリプト(rails2_appengine.rb)のダウンロードと実行
  2. environment.rbの書き換え(SQL4G上のデータベース作成コードの追加)
  3. database.ymlの書き換え(SQL4G用の設定内容に書き換える)
  4. Gemfileに設定を追加(SQL4Gが利用するJDBCアダプタのgemを追加)
  5. SQL4G Jar/activerecord_jdbc Jarの配置/jruby-rackのアップデート版Jarの配置
  6. ローカル環境でのGAE起動と動作確認
  7. config.ruの書き換え(デプロイ用のアプリケーションID/バージョン番号の設定)
  8. GAEサーバへのデプロイ実行
  9. GAE上での動作確認

 第3回の手順と異なるところは以下の通りです。

  • 上記(1)の手順において、rails2_appengine.rbの実行中にファイルの上書きを要求されるところがありますが、routes.rbおよびsesson_store.rbは上書きしないようにしてください。
  • さらに、config/initializers/session_store.rbの以下(最下部)をコメントアウトしてください。これにより、通常のセッションオブジェクト(cookie_store)を利用できるようにします。
●config/initializers/session_store.rb(抜粋)
# 以下の行を全てコメントアウトします
#if defined? JRuby::Rack
#  require 'action_controller/session/java_servlet_store'
#  ActionController::Base.session_store = :java_servlet_store
#end

マイグレーションの代替コントローラを作る

 実際の開発時は、デプロイ用にもう1つ別のディレクトリを作り、そこにアプリケーションのコードをすべてコピーして作業されることを推奨します。また、今回のアプリケーションではMigrationコントローラのindexメソッドでテーブルの作成を行いますので、アプリケーションの起動後は「http://hostname/migration/」を実行するのを忘れないようにしましょう。ちなみにテーブルを作り直す場合は「http://hostname/migration/reset」を実行してください。

●migration_controller.rb
class CreateTables < ActiveRecord::Migration
  def self.up
      execute <<-"EOF"
create table members (
  id integer not null default 0 auto_increment primary key,
  login varchar(255),
  name varchar(255),
  password varchar(255),
  created_at timestamp,
  updated_at timestamp
);
create table statuses (
  id integer not null default 0 auto_increment primary key,
  member_id integer,
  message varchar(255),
  created_at timestamp,
  updated_at timestamp
)
      EOF
  end

  def self.down
    drop_table :statuses
    drop_table :members
  end
  

end

class MigrationController < ApplicationController
  def index
    CreateTables.up
    Member.create(:login=>"sql4g",:name=>"SQL4G 公式アカウント",:password=>"sql1234g")
    Member.create(:login=>"php4g",:name=>"PHP4G 公式アカウント",:password=>"php1234g")
    Member.create(:login=>"naka54",:name=>"なかごし",:password=>"naka123454")
    Member.create(:login=>"knowledge_ex",:name=>"株式会社ナレッジエックス",:password=>"12345ex")
    respond_to do |format|
      format.html { redirect_to :controller => "login" }
    end
  end
  def reset
    CreateTables.down
    index
    return
  end

end

 いかがだったでしょうか。Railsの場合はPHPと比べて若干手順が多いものの、普通に作ったRailsアプリケーションがGAE環境にもそのまま持って行けそうだということがお分かりいただけたのではないかと思います。

本番環境にデプロイ、しかし……

 おそらく、この記事をお読みになっている方の中には、実際に記事の通りに動作させてみている方も多いことと思います。dev_appserver.rbによるローカル環境での動作確認までは読者の皆さんも順調にできたのではないでしょうか。しかしながら、筆者の環境では肝心のクラウド上での動作でエラーになってしまって動作させることができませんでした。

 ご存じの通り、GAE上でのアプリケーション実行には、いわゆる「30秒の壁」(リクエストを受けてから30秒以内にレスポンスを返さないとHardDeadlineExceedErrorが発生し処理が強制的に中断される)というものがあります。今回のアプリではこの制限にかかってしまい、起動に失敗していました。もともと、GAE上でのRailsは起動(Spin up)に時間がかかると言われており、今回の場合、30秒の制限のうちおよそ22〜23秒をRails自体の起動に費やしてしまっていることが主な原因と考えられます。しかしながら、Googleもこういった問題は認識しているようで、GAEのロードマップの中でSpin up時間の短縮のための機能改良について言及しています。またGAE上でのJRuby環境も今まさに発展の途上にあり、今後のバージョンアップによって動作速度の向上が期待できます。残念ながら現状ではGAE本体での動作検証にまでは至りませんでしたが、今後のGAEを取り巻く動向には引き続き要注目です!

 次回は、PHP+GAE を使って、ある有名なアプリケーションを実際に動かしてみます。お楽しみに!!

prev
3/3

Index
GAE+SQL4GでRailsアプリを開発してみよう
  Page1
JRubyについて
ActiveRecordとSQL4Gの連携
  Page2
google-appengine gemについて
セットアップスクリプト(rails2_appengine.rb)について
Rails+SQL4Gでのマイグレーション
Rails+SQL4Gでアプリケーションを開発してみる
  Page3
JRuby on Rails環境(非GAE)での動作確認
GAE環境での動作確認
マイグレーションの代替コントローラを作る
本番環境にデプロイ、しかし……

index GAE+PHP/Rubyで拓く新世界

 Coding Edgeお勧め記事
いまさらアルゴリズムを学ぶ意味
コーディングに役立つ! アルゴリズムの基本(1)
 コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう
Zope 3の魅力に迫る
Zope 3とは何ぞや?(1)
 Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか?
貧弱環境プログラミングのススメ
柴田 淳のコーディング天国
 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く?
Haskellプログラミングの楽しみ方
のんびりHaskell(1)
 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう
ちょっと変わったLisp入門
Gaucheでメタプログラミング(1)
 Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間