sudo -u grails

Grailsの記事が充実する。といいなぁ

サクサク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人が来場者と同じ方向を向いて、来場者に背を向けて発表する、というかたちになり、身内からこんな言葉を頂くなどもしました。ふふ

サンプルのGrailsアプリは、画像を添付したデータを保存・一覧できる、という簡単なものです。Rails Girls App Tutorialで作っているものに非常に近いですね。もっとも、Rails GirlsではCarrierWaveというgemを使って画像を扱いますが、今回のGrailsアプリはGrailsの機能で実装しています。

Grailscloud-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で動作してくれるようです。

手を動かして、道具としての素晴らしさを感じてもらうことができて良かった!