gae上でjrubyを動かしたい。までの道のり3

何がしたいの?

誰が使うの?

  • rubyアプリケーションをgae上で公開したい人
  • 自サーバやレンタルサーバは運用したくないけどサービスを公開したい人
  • 動的なスケールアップが可能な環境でサービスを公開したい人

どのように機能するの?

  • appengine-java-sdkの上でjrubyを動作させます。jrubyの上でrubyを動作させます。
  • さらにそのrubyの上でrubyのライブラリやアプリケーションを動作させます。

何を使うの?

gem「google-appengine」

どこで確認したの?

いつ確認したの?

  • 2010年3月27日

何か注意点はあるの?

  • 特にありません

どんな手順でやるの?

まずは環境確認です。
今回からはCrubyの実行環境はruby1.8です。

$ 
$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]
$ 
$ gem list google-appengine

*** LOCAL GEMS ***

google-appengine (0.0.10.1)
$ 


ディレクトリ/opt/app/devにアプリケーションnnz-testを作成します....作成できました。

$ cd /opt/app/dev
$ 
$ ls
$ 
$ appcfg.rb generate_app nnz-test
=> Generating gemfile
=> Bundling gems
Calculating dependencies...
Updating source: http://gems.rubyforge.org
/Library/Ruby/Gems/1.8/gems/bundler08-0.8.5/lib/bundler08/resolver.rb:115:Warning: Gem::Dependency#version_requirements is deprecated and will be removed on or after August 2010.  Use #requirement
Caching: appengine-rack-0.0.6.gem
Caching: rack-1.1.0.gem
Installing rack (1.1.0)
Installing appengine-rack (0.0.6)
Done.
=> Packaging gems
=> Installing JRuby
=> Installing JRuby-Rack
=> Installing appengine-sdk
=> Generating rackup
=> Generating configuration files
$ 
$ ls
nnz-test
$ 

ローカルで起動します...起動しました。

$ cd nnz-test/
$ pwd
/opt/app/dev/nnz-test
$ dev_appserver.rb .
=> Booting DevAppServer
=> Press Ctrl-C to shutdown server
中略
The server is running at http://localhost:8080/
$ 


ブラウザで確認します。


GAEにアップロードします....アップロードが完了しました。

$ pwd
/opt/app/dev/nnz-test
$ 
$ cat config.ru 
require 'appengine-rack'
AppEngine::Rack.configure_app(          
    :application => "nnz-test",           
    :precompilation_enabled => true,
    :version => "1")
run lambda { Rack::Response.new("Hello").finish }
$ 
$ appcfg.rb update .
=> Running AppCfg
Reading application configuration data...
Beginning server interaction for nnz-test...
0% Creating staging directory
5% Scanning for jsp files.
20% Scanning files on local disk.
25% Initiating update.
Email: メールアドレスを入力する
Password for メールアドレス  に対応するパスワードを入力する 
28% Cloning 2 static files.
31% Cloning 11 application files.
40% Uploading 3 files.
52% Uploaded 1 files.
61% Uploaded 2 files.
68% Uploaded 3 files.
73% Initializing precompilation...
90% Deploying new version.
95% Will check again in 1 seconds
98% Will check again in 2 seconds
99% Will check again in 4 seconds
99% Will check again in 8 seconds
99% Will check again in 16 seconds
99% Closing update: new version is ready to start serving.
99% Uploading index definitions.

Update completed successfully.
Success.
Cleaning up temporary files...
$ 


ダッシュボードを確認します。.... version 1 のアプリケーションが稼働していることが確認できました。

ブラウザでappspot.comにアクセスします。.....appspot.com上でレスポンスを確認できました。

次はsinatraアプリです。
myapp.rbを作成し、myapp.rbを呼び出すように変更して、開発サーバで実行してみます....豪快にコケました。
requireがオカシイと言ってます。

$
$ cat myapp.rb 
require 'rubygems'
require 'sinatra'

get '/'        do 'top page'  end
get '/ja'      do 'ようこそ!!' end
get '/en'      do 'welcame!!' end
get '/ja/info' do '<h2>これはなに?</h2>'   end
get '/en/info' do '<h2>what is this?</h2>' end
$ 
$ cat config.ru 
require 'appengine-rack'
require 'myapp'
AppEngine::Rack.configure_app(          
    :application => "nnz-test",           
    :precompilation_enabled => true,
    :version => "2")
run  Sinatra::Application
$
$ 
$ dev_appserver.rb .
=> Booting DevAppServer
=> Press Ctrl-C to shutdown server
2010-03-28 01:02:04.981 java[94720:1607] [Java CocoaComponent compatibility mode]: Enabled
2010-03-28 01:02:04.983 java[94720:1607] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000
2010/03/27 16:02:05 com.google.appengine.tools.development.agent.impl.BlackList initBlackList
?v???I: Unable to read a jre library while constructing the blacklist. Security restrictions may not be entirely emulated. /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/plugin.jar
2010/03/27 16:02:10 com.google.appengine.tools.development.ApiProxyLocalImpl log
?v???I: [1269705730220000] javax.servlet.ServletContext log: unable to create shared application instance
org.jruby.rack.RackInitializationException: no such file to load -- sinatra
	from ./myapp.rb:2
	from ./myapp.rb:3:in `require'
	from config.ru:3

	at org.jruby.rack.DefaultRackApplicationFactory$4.init(DefaultRackApplicationFactory.java:169)
	at org.jruby.rack.DefaultRackApplicationFactory.getApplication(DefaultRackApplicationFactory.java:51)
	at org.jruby.rack.SharedRackApplicationFactory.init(SharedRackApplicationFactory.java:27)
	at org.jruby.rack.RackServletContextListener.contextInitialized(RackServletContextListener.java:40)
	at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:530)
	at org.mortbay.jetty.servlet.Context.startContext(Context.java:135)
	at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1218)
以下、省略

Gemfileに gem "sinatra" を付け加えて再実行します...今度はうまく行きました。
アプリケーション本体でrequireするgemはGemfileにも書かなければならないようです。

$ cat Gemfile 
# Critical default settings:
disable_system_gems
disable_rubygems
bundle_path ".gems/bundler_gems"

# List gems to bundle here:
gem "appengine-rack"
gem "sinatra"
$ 
$ dev_appserver.rb .
=> Booting DevAppServer
=> Press Ctrl-C to shutdown server
=> Bundling gems
Calculating dependencies...
Updating source: http://gems.rubyforge.org
/Library/Ruby/Gems/1.8/gems/bundler08-0.8.5/lib/bundler08/resolver.rb:115:Warning: Gem::Dependency#version_requirements is deprecated and will be removed on or after August 2010.  Use #requirement
Installing sinatra (1.0)
Done.
=> Packaging gems
2010-03-28 01:07:06.227 java[94733:1607] [Java CocoaComponent compatibility mode]: Enabled
2010-03-28 01:07:06.230 java[94733:1607] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000
2010/03/27 16:07:06 com.google.appengine.tools.development.agent.impl.BlackList initBlackList
?v???I: Unable to read a jre library while constructing the blacklist. Security restrictions may not be entirely emulated. /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/plugin.jar
The server is running at http://localhost:8080/


エンコードの指定をしていないので、手動で文字コードを変更する必要があるかもしれませんが、そこはご愛嬌。
開発サーバで想定通りの表示を得ることができました。


アップロードします...成功しました。

$ 
$ appcfg.rb update .
=> Running AppCfg
Reading application configuration data...
Beginning server interaction for nnz-test...
0% Creating staging directory
5% Scanning for jsp files.
20% Scanning files on local disk.
25% Initiating update.
28% Cloning 2 static files.
31% Cloning 12 application files.
40% Uploading 4 files.
52% Uploaded 1 files.
61% Uploaded 2 files.
68% Uploaded 3 files.
73% Uploaded 4 files.
77% Initializing precompilation...
90% Deploying new version.
95% Will check again in 1 seconds
98% Will check again in 2 seconds
99% Will check again in 4 seconds
99% Will check again in 8 seconds
99% Will check again in 16 seconds
99% Closing update: new version is ready to start serving.
99% Uploading index definitions.

Update completed successfully.
Success.
Cleaning up temporary files...
$ 


バージョン2をアップロードしましたが、
google app engine -[Administration]-[Versions]で見てみるとアップロードしただけは、defaultバージョンは更新されず[1]のままです。
[2]→[Make Default]を選択することで新しいバージョンがデフォルトになります。



sinatraアプリケーションの動作確認が完了しました。
テストサイトは適宜バージョン更新します。この時のバージョンはこれです。



アプリケーションは上書きされるわではなく世代保存されています。
バージョンを明示的に指定して以前のバージョンのアプリケーションに接続することができます。
http://1.latest.nnz-test.appspot.com/
http://2.latest.nnz-test.appspot.com/

続きはこちらです。
gae+jruby+sinatra+haml+DataMapperでアプリケーションを作ってみる