どうもこんにちは、jacoです。
Cloud Foundry Advent Calendar 24日目です。まさか12/24の記事を私が担当する事になるなんて。
24日なんてとても忙しいのに・・・こまるわーまじこまるわー
・・・まあご想像の通りなにも予定ないんですけどね。
さて世間一般のイベントはとりあえず置いておいて、Cloud Foundryことはじめ8回目。ひとまず今回で一区切り付けてしまおうとおもいます。
今回は今まであえて触れてこなかった、データベースを使ったアプリケーションをデプロイしてみようと思います。
Cloud Foundryで使えるDB
Cloud Foundryでは
・MySQL
・SQLite
・MongoDB
・PostgreSQL
・Redis
をサポートしています。
WindowsにRails環境を整える
今回はRailsを使ってCloud Foundryにアプリをデプロイします。
これまでのことはじめ同様、Windows環境を前提に話を進めていきますので、WindowsにRails 3.1環境をセットアップしてください。
Rails自体のセットアップ手順はこの記事では省きますので、以下のサイトなどを参考にセットアップを行ってください。
Ruby on Rails 3.1 を Windows にインストールする手順をかなり丁寧に説明してみました
それにしてもWindowsでのRailsセットアップはどんどん面倒くさくなっていくなあ・・・
SQLiteなテストアプリをつくる
それではrailsアプリを作っていきましょう。
今までの例とおなじく、D:ドライブ直下にフォルダを生成していくことにします。特にD:である必要はないので、好きな場所に読み替えて貰って結構です。
C:\Users\jaco>D:
D:\>rails new cf
D:直下に移動したあと、rails newを行っています。これでcfフォルダが作られ、その中にrailsファイルが生成されるはずです。
D:\>cd cf
D:\cf>
cfフォルダに移動します。
今回は簡単なメッセージを残せるアプリを作ってみる事にしましょう。
D:\cf>rails g scaffold message title:string body:text
Railsを使った事ある人には説明は不要かと思いますが、Railsの自動土台生成 scaffoldを使ってモデル、ビュー、コントローラの生成を行います。titleとbodyの2つの項目を持ったものが自動生成されます。
おそらく最初の状態だと、SQLiteを利用するようになっているはずです。
念のため config\database.yml をテキストエディタで開いて確認しておきましょう。
adapter: sqlite3 になっていれば問題ありません。
次に
D:\cf>rake db:migrate
db:migrateを実行。
環境によっては、ここで
rake aborted!
uninitialized constant Rake::DSL
というエラーが出てしまうかもしれません。Rakeのバージョン不一致が原因ですので、この場合
D:\cf>gem install rake -v=0.9.2
を実行してください。
それでは、さっそくRailsをローカルで起動してみましょう。
D:\cf>rails s
エラーなく起動できれば、ブラウザで http://localhost:3000/messages にアクセスしてください。

問題なさそうですね。New Messageを押すとメッセージの投稿ができます。

SQLiteなテストアプリをデプロイする
それでは、作ったアプリをcloudfoundry.comにデプロイしてみましょう。
さっそくvmc target -> vmc loginして・・・といきたいところですが、ちょっと待ち。
実はこのままデプロイしてもうまく動かないところがあります。
詳しくは、u1が書いた
CloudFoundryでRubyOnRails3.0, 3.1アプリを動かす際のまとめ
に書いてありますので、興味のある方は目を通してください。
以下の作業を行っていきます。
assets:precompileの実行
bundle exec rake assets:precompile RAILS_ENV=production
config.serve_static_assetsの設定変更
config/environments/production.rbのconfig.serve_static_assetsをtrueにします。
config.serve_static_assets = true
jquery-railsの置き換え
Gemfile内の
gem ‘jquery-rails’
を
gem ‘cloudfoundry-jquery-rails’
に置き換えてください。
そして
bundle install
を実行。
Gemfile.lockの書き換え
Windows環境でのみ必要な作業です。
Windows環境でbundle installした場合、sqlite3のgemのバージョンが
sqlite3 (1.3.5-x86-mingw32)
のようになってしまいます。mingw版が指定されてしまっていますね。
この状態でデプロイすると
You have requested:
sqlite3 >= 0
The bundle currently has sqlite3 locked at 1.3.5.
Try running `bundle update sqlite3`
このように怒られてしまいます。
なので、
sqlite3 (1.3.5-x86-mingw32)
を
sqlite3 (1.3.5)
のように書き換えてください。なお、bundle installを行うとまたこの記述が巻き戻ってしまいますので注意してください。
デプロイ
ここまで出来たら、cloudfoundry.comにデプロイしてみましょう。
いつものように、Cloud Foundry ことはじめ3を参考に、vmc target->vmc login->vmc pushを行います。
ただ注意しなければいけないのが、今回はRuby1.9環境を前提に作っているRailsアプリですので、Cloud FoundryでもRuby1.9を使うと明示してあげなければいけません。
vmc push --runtime ruby19
–runtime ruby19 をつけてあげることで、Ruby1.9環境でデプロイしてくれます。
付け忘れると1.8で動かそうとするので、エラーがでてしまうはずです。
デプロイに成功したらブラウザ経由でアクセスしてみましょう。
先ほどと同じアプリが使えるはずです。
MySQLなテストアプリをデプロイする
それでは、先ほどのSQLite版をMySQLに置き換えてみましょう。
Gemfileの書き換え
まず、Gemfileをsqlite3からmysql2に書き換えます。
gem ‘mysql2′
そしてbundle install。
Gemfile.lockの書き換え
SQLiteの時と同じように、Gemfile.lockがmingw指定になっているので、書き換えます。
mysql2 (0.3.11-x86-mingw32) → mysql2 (0.3.11)
デプロイ
それではデプロイしましょう。今までと違うところは、vmc push時の設定です。
vmc push --runtime ruby19
Would you like to deploy from the current directory? [Yn]:
Application Name: railsu1tb
Application Deployed URL ["railsu1tb.cloudfoundry.com"]:
Detected a Rails Application, is this correct? [Yn]:
Memory Reservation ("64M", "128M", "256M", "512M", "1G", "2G") ["256M"]:
Creating Application: OK
Would you like to bind any services to 'railsu1tb'? [yN]: y #ここでyを指定する
The following system services are available
1: mongodb
2: mysql
3: postgresql
4: rabbitmq
5: redis
Please select one you wish to provision: 2 #2を選択
Specify the name of the service ["mysql-a91c4"]: #サービス名を指定。ひとまずデフォルトでよければEnter
Creating Service: OK
Binding Service [mysql-a91c4]: OK
Uploading Application:
Checking for available resources: OK
Processing resources: OK
Packing application: OK
Uploading (8K): OK
Push Status: OK
Staging Application: OK
Starting Application: OK
Would you like to bind any services to ‘railsu1tb’ のときに「y」を選択するのがポイントですね。あとはどのサービスを有効にするか聞かれるのでMySQLを選択する感じです。
Railsを触った事がある人ならば、「database.ymlがSQLiteのときのままだけど良いの?」と思ってしまうかもしれませんが、大丈夫です。
デプロイの際、MySQLをbindするように設定した場合、database.ymlの中身がまるごと上書きされるため、こちらで記述したものはすべて無視される形になります。
SQLiteを使うときは、特に何かサービスをbindするわけではないので、きちんとdatabase.ymlの中身を書いておく必要がありますが。
さて、デプロイも成功したのでブラウザでアクセスしてみましょう。問題無く動作しているはずです。
まとめ
ことはじめも8回目になってしまいましたが、いかがでしたでしょうか。
この記事を書いていて、Gemfile.lockのところにはずいぶん苦労させられました。
Gemfile.lockで起こる問題はWindows環境特有なものなので、あまり情報が無かったのですね。
Rails、、もといRuby自体、Windows環境で動かすには少々難アリなため、Cloud Foundryにおいても試している人はあまり多くないようです。
ことはじめの記事の性格上、人口としては一番多いWindowsを前提に話を進めてきたのですが、正直なところLinuxやMacを使ったほうがトラブルは少なくて済むかな・・・と。
それでもWindowsを使いたい、という人達のための参考になれば幸いです。
さて最終回にしてようやくhello worldを抜け出せたのですが、今思うともっと早めにこのDBあたりに触れていたほうが良かったようにも思えます。
また機会があれば分かりやすい形に再編集したいなと思っています。
もし「この記事のココが何を言っているのか良く分からない」や「ここの部分についてもうちょっと説明して欲しい」などのリクエストがあれば、是非コメントや@jacopen宛にご連絡ください。
それでは!