2015-06-22

Agar.io を Cloud Foundry で動かす

本日の第13回「Cloud Foundry 百日行」は、Agar.ioのクローンです。
このアプリケーションもゲームアプリですので、ぜひデプロイをして遊んでみてください。
ちなみにこのアプリはNode/JavaScript製となっています。

Agar.io基本情報

デプロイ

手順

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

0.準備

まずはいつものようにソースコードの取得から。

$ git clone https://github.com/huytd/agar.io-clone
$ cd agar.io-clone
agar.io-clone$ ls
bower.json  client  gulpfile.js  LICENSE  manifest.yml  package.json  README.md  server

Readmeのインストール手順を見てみると、何とこのアプリ、IBM Bluemixへのデプロイをサポートしているようです。
IBM BluemixがCloud FoundryをベースにしているPaaSなこともあり、確かにアプリのディレクトリの中身をよくよく見てみると見覚えのある内容の manifest.yml ファイルがすでに用意されています。
IBM Bluemix環境へのデプロイをお試しの方はReadmeを読んでいただくとして、この記事ではbosh-lite環境へのデプロイに挑戦してみましょう。

1.アプリの起動

さて、アプリのReadmeによるとこのアプリの起動手順は

  • Step1) npm install で依存ライブラリのインストール
  • Step2) node server/server.js もしくは npm start でサーバ起動

となっています。これさえ無事に終えれば http://localhost:3000 にアクセスすることでゲームがプレイできるようですね。

Cloud Foundryにアプリをデプロイする時、実は上記のStep1はCloud Foundryが(※正確に言うとCloud Foundry上でNodeJSのためのBuildpackが)自動でやってくれます。
Step2についてですが、このアプリを起動するためのコマンド、 node server/server.js についてはデプロイを行う人がCloud Foundryに教えてあげましょう。

実際にやってみます。

agar.io-clone$ mv manifest.yml manifest.yml.bluemix
agar.io-clone$ cf push agar-clone -b https://github.com/cloudfoundry/nodejs-buildpack -c "node server/server.js"
(一部略)
-----> Uploading droplet (17M)

1 of 1 instances running

App started


OK

App agar-clone was started using this command `node server/server.js`

Showing health and status for app agar-clone in org ukaji / space default as ukaji...
OK

requested state: started
instances: 1/1
usage: 512M x 1 instances
urls: agar-clone.10.244.0.34.xip.io
last uploaded: Thu Jun 18 02:19:19 +0000 2015
stack: lucid64

     state     since                    cpu    memory          disk      details   
#0   running   2015-06-18 11:20:29 AM   0.0%   46.3M of 512M   0 of 1G

IBM BluemixもCloud Foundryをベースにしているため、実はmanifestファイルについてもそのまま利用できてしまうケースが多いのですが、今回は残念ながらそのままではデプロイが失敗してしまうため、別の起動コマンドかmanifestファイルが必要となります。(失敗の理由について後ほど触れます。)
ここでは、そのままpushを行うとIBM Bluemix用に書かれたmanifestファイルを読んでしまうため、ファイルをリネームして使わないようにしておきました。
実際のデプロイに必要なのはその次にある cf push 〜 の1行です。中々に長いログが流れますが、無事に起動してくれました。

さて、今回のデプロイに使った cf push のオプション -c ですが、これはアプリの起動コマンドを指定できるオプションです。
今回のアプリのように起動をするコマンドを明示的に指定する必要がある場合に使用します。
今回のようなNodeJSのアプリ起動時の node 〜 や、Rubyアプリ起動時の bundle exec 〜 などで用いられることが多いです。

2.動作確認

それでは、動作確認を行いましょう。
いつものようにブラウザでアクセスをします。

無事起動しているようです。
ユーザ名を決めてプレイしてみましょう。

皆でプレイするゲームにも関わらず「Players: 1」表示なのが少々物悲しいですがともかく無事にデプロイができました。
ゲームの遊び方/ルールは

  • マウスの動きに追従して自分のキャラクター(=ボール)を動かす
  • 自分より小さなボールや他プレイヤーは、衝突をして吸収することができる
  • 逆に自分より大きな他キャラクターに衝突されると吸収されてしまう
  • 自分のキャラクターの大きさは、どれだけ吸収をしたかで決定する

こんなところでしょうか。他にも吸収度合いによって移動速度が低下したりといろいろな制約があるようですが、いずれにせよ他プレイヤーを排除するのがゲームの目的のようです。
・・・一人で遊ぶゲームではないですね。

おまけ

第11回の記事で、次のような内容をご紹介しました。

「わざわざBuildpackを指定しなくても、現在の環境に標準で入っているBuildpackならば自動的に動かすことができる」

実は今回の環境にもNodeJSのBuildpackが標準で入っているので、わざわざBuildpackを指定する必要もないように思えます。
しかし今回のケースでは、Buildpackの特定・実行開始までは上手く行ってくれていたのですが、残念なながら、実行途中でエラーを吐いて失敗してしまいました。

どうやらこれは、Buildpackのバージョンに起因する問題のようです。
Buildpackも日々開発が進められているため、あるバージョンで動いたものが別のバージョンでは動かないというのは大いにありうる話です。
一度デプロイに成功したアプリが動かなくなってしまった時などは、この問題を疑って見るのも一つの手かもしれません。

最後に、折角IBM Bluemix用のBuildpackがあるので、Cloud Foundry用のmanifestファイルも追記しておきます。
今回の事例に学び、バージョン指定付きでgithubのリポジトリからBuildpackを取得してくるような記述をしてみましょう。

agar.io-clone$ vi manifest.yml
---
applications:
- name: agar-clone
  memory: 128M
  disk_quota: 256M
  buildpack: https://github.com/cloudfoundry/nodejs-buildpack#19b6bc8c15aac2b159a14fc7d9928247447bf8f6
  command: node server/server.js

今回使用したソフトウェア