サクサクWebアプリを作って公開!Grails+CloudFoundryハンズオンをやりました。
先週の金曜日4/19、G*ワークショップZ Apr 2013 - Grails+CloudFoundryハンズオンをやりました。
30分ほどCloudFoundryについて日本CloudFoundryグループの中の人に話をして貰い、そのあとの1時間半でGrailsでWebアプリを作成して、cloudfoundry.comにデプロイしてみましょう、というハンズオンです。
発表資料は http://bit.ly/GrailsCF で見ることができます。
作成したGrailsアプリのソースコードは https://github.com/morika-t/morika にあります。
Togetterはこちら。kimukou2628さんありがとうございます!
事前にcloudfoundry.comのアカウントとGrailsの動作環境は整えておいてくださいね、というかたちで始めました。Mac/LinuxではGVM http://gvmtool.net/ を使えばあっという間にGrailsの環境が作れちゃいますね。Windowsでも、Grailsのバイナリを持ってきて環境変数を設定するか、GGTS(Grailsが同梱されている)を入れれば済むので、ハードルは低いです。JDK入れてない!という人はまず最初にJavaを入れてくださいね。=D
もう1人の発表者の要望(?)で、発表者2人が来場者と同じ方向を向いて、来場者に背を向けて発表する、というかたちになり、身内からこんな言葉を頂くなどもしました。ふふ
背中向けてしゃべるのが斬新 #jggug
— Kazuki YAMAMOTOさん (@yamkazu) 2013年4月19日
何この斬新な布陣 #jggug
— Yasuharu Nakanoさん (@nobeans) 2013年4月19日
サンプルのGrailsアプリは、画像を添付したデータを保存・一覧できる、という簡単なものです。Rails Girls App Tutorialで作っているものに非常に近いですね。もっとも、Rails GirlsではCarrierWaveというgemを使って画像を扱いますが、今回のGrailsアプリはGrailsの機能で実装しています。
Grailsのcloud-foundryプラグインでは、grailsコマンドとして cf-push や cf-update、cf-logs などを実行できるので、Rubyやgem、vmcのインストールが不要なのがポイントです。Grailsのインタラクティブモードを利用すれば、コマンド実行時のロード時間もそれほど気にならなくなるでしょう。
ハンズオンを進める中で、cloudfoundry.comのpostgresサービスが死んでbindできない、という状況が発生し、急遽mysqlを使う、というトラブルも発生しました。これには発表者2人とも焦りましたが、GrailsアプリのソースコードはDataSource.groovyを含め一切変更することなく、cf-pushしなおしてmysqlをbindするだけ、で先に進めることができました。
いろいろと質問も出まして、嬉しい限りでした。
- DBの冗長化は? → DB(CloudFoundryのService)の冗長化はサービス事業者側の責任。複数のサービスをbindすることはできる。
- アプリのupdate時のダウンタイム(サービス中断時間)はどうにかできない? → 無償のcloudfoundry.comではどうしようもない。サービス中断が問題になるようならheroku/Cloudn/CloudBees/AppFogなど、有料のPaaSプロバイダを利用した方がスジが良い。
- 立ち上げられるインスタンス数の上限は? → cloudfoundry.comでは、メモリ2GBの割り当て範囲内で。CloudFoundryの仕組み自体は、DEAを別々のマシン上に立ててスケールアウトすることができるようになっているので、ハードを増やしてrouterががんばれる限り増やせる。AppFogでは128インスタンスまで使える。
- HTTPS(SSL)の利用は? → 証明書を利用者側で用意する以外にやり方がない。 cf-push 等をするときの経路にSSLを使いたい場合には grails.plugin.cloudfoundry.target の値を 'http://api.cloudfoundry.com' ではなく 'https://api.cloudfoundry.com' とすれば良い。
そのほかの質疑については、 https://gist.github.com/morika-t/5424468 に書かれています。
また、cloudfoundry.comにデプロイしたGrailsアプリがJava6上で動作する場合には、ローカル側でwarファイルが作られる際の互換性をJava1.6指定とする必要があります。cloudfoundry.comはJava7にも対応しているので、cf-push するときに --runtime=java7 としてやればJava7で動作してくれるようです。
grails prod cf-update とするだけで、コンパイル、war作成、アップロード、既存サービスの停止と再起動までやってくれるので、楽ちんですね。 #jggug
— Akira Shimosakoさん (@simosako) 2013年4月19日
grailsのcloud-foundry pluginすげー
— とーますさん (@grimrose) 2013年4月19日
手を動かして、道具としての素晴らしさを感じてもらうことができて良かった!