2015-06-10

243game を Cloud Foundry で動かす

本日の第5回「Cloud Foundry 百日行」は、243 Gameです。
デプロイをして実際に動かすまでが簡単にできるアプリなので、初心者のかたも是非手を動かしてみてください。

[243 Game]基本情報

デプロイ

手順

  • 0) 準備
  • 1) アプリの起動
  • 2) 動作確認

0.準備

まずはソースコードの取得をしましょう。
ここではローカルの適当なWorkSpaceで作業を行っています。

$ git clone https://github.com/mishop/243
$ cd 243
243$ ls
CONTRIBUTING.md  favicon.ico  index.html  js  LICENSE.txt  meta  Rakefile  README.md  style

ディレクトリの中身を眺めてみるとindex.htmlやjs/などが入っています。
HTMLファイルがJavaScriptを呼び出して動作する比較的簡単な構造のアプリケーションのようです。

1.アプリの起動

では早速Cloud Foundry上にアプリをデプロイしてみましょう。
Cloud Foundryへのデプロイはpushで行います。
実はこのアプリ、次のコマンドによって一発でデプロイが完了します。

243$ cf push 243game -b https://github.com/cloudfoundry/staticfile-buildpack
Creating app 243game in org ukaji / space default as ukaji...
OK

Creating route 243game.10.244.0.34.xip.io...
OK

Binding 243game.10.244.0.34.xip.io to 243game...
OK

Uploading 243game...
Uploading app files from: /home/ntt/apps/243
Uploading 226.6K, 29 files
Done uploading               
OK

Starting app 243game in org ukaji / space default as ukaji...
-----> Downloaded app package (236K)
Cloning into '/tmp/buildpacks/staticfile-buildpack'...
Submodule 'compile-extensions' (https://github.com/cloudfoundry-incubator/compile-extensions.git) registered for path 'compile-extensions'
Cloning into 'compile-extensions'...
Submodule path 'compile-extensions': checked out '0b1eb13f9a747494b0abac8c665bb556cd07c749'
grep: Staticfile: No such file or directory
-----> Using root folder
-----> Copying project files into public/
-----> Setting up nginx
grep: Staticfile: No such file or directory
-----> Uploading droplet (2.6M)

1 of 1 instances running

App started


OK

App 243game was started using this command `sh boot.sh`

Showing health and status for app 243game in org ukaji / space default as ukaji...
OK

requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: 243game.10.244.0.34.xip.io
last uploaded: Mon Jun 8 01:02:42 +0000 2015
stack: lucid64

     state     since                    cpu    memory         disk      details   
#0   running   2015-06-08 10:02:58 AM   0.0%   3.7M of 256M   0 of 1G

上記のようなログが見えればデプロイ成功です。

今回、cf pushというコマンドで-bというオプションを指定しましたが、これは使用する”Buildpack”のURLを指定するためのオプションです。
Buildpackとは、Cloud Foundry上にデプロイしようとするアプリのために環境を構築するためのものです。
RubyのアプリであればRubyのBuildpack、GolangのアプリであればGolangのBuildpackをデプロイ時に選択する、というような利用イメージになります。
今回用いたstaticfile-buildpackは、HTMLファイルやJavaScriptファイルで作られたアプリを配信するためにHTTPサーバ(Nginx)を立てる、といった仕組みになっています。

HTTPサーバを立てたりアプリのソースコードを適切なディレクトリに配置したり・・・といった作業を全てCloud Foundryが行ってくれたため、今回のアプリは1コマンドでの起動ができてしまいました。

2.動作確認

デプロイが無事終了したら動作確認を行ってみましょう。
デプロイ完了の時にURLが発行されているはずなので、ブラウザでアクセスをしてみます。

243$ cf app 243games
Getting apps in org ukaji / space default as ukaji...
OK

name      requested state   instances   memory   disk   urls   
243game   started           1/1         256M     1G     243game.10.244.0.34.xip.io   

URLはcf app アプリ名でも確かめることができます。
243game.10.244.0.34.xip.ioにブラウザでアクセスをしてみると・・・

ちゃんとアプリが起動しています。

画面を見て既にお気づきの方も多いと思いますがこのゲーム、あの有名な2048ゲームのクローンです。
ゲームの遊び方は至ってシンプルで、
 1.矢印キーを使って画面内のタイルを4方向にスライドさせる
 2.同種のタイルを3つぶつけて3倍の数のタイルにマージする
 3.頑張って243のタイルを作る
これだけです。
243=3の5乗なので5段階のマージで243には到達しそうなものですが、思った以上の難易度です。
あくまで個人の感想ですが、2048ゲームで2048のタイルを作るより243ゲームで243のタイルを作るほうが遥かに難しいです。

おまけ

さて、Cloud Foundryにデプロイをする時のpushコマンドは引数として色々なオプションを付けることができます。
今回は-bオプションだけを使いましたが、実は他にもアプリ起動コマンドの指定や使用メモリの制限など多彩な機能が存在しています。
しかし、機能が多彩なこと自体は良いのですが、これは同時に

「色々なオプションを駆使してアプリを起動しました!」
 ↓
しばらくして・・・
 ↓
「あの時の起動コマンド何だったっけ・・・」

などという事態が発生しないとも限りません。

こんな自体を避けるためには、アプリのルートディレクトリに「manifestファイル」を作って置くのが便利です。
Cloud Foundryでは、デプロイの際に必要な設定をYML形式の設定ファイルに記載しておくことができます。
これを一度作ってしまえば、デプロイのコマンドは’cf push’だけで済んでしまいます。
manifestファイルの詳細な書き方については
http://docs.cloudfoundry.org/devguide/deploy-apps/manifest.html
をご参照下さい。

最後に、今回のアプリのデプロイに必要最低限なmanifestファイルを記しておきます。

243$ vi manifest.yml
---
applications:
- name: 243game
  buildpack: https://github.com/cloudfoundry/staticfile-buildpack

cf pushだけでデプロイができることを確かめてみてください。

今回使用した環境