それでは、アプリケーションをcloudfoundry.comにデプロイしてみます。
ランタイムは筆者が好きなNode.jsを使います。またcloudfoundry.comにデプロイしなくてもアプリケーションの動作が確認できるように、VMCをインストールした環境と同じ環境(以後ローカル環境と呼びます)にもNode.jsをインストールしておきましょう。ただし、Node.jsは最新版ではなく、cloudfoundry.comでサポートしている0.4.5をインストールします。
$ sudo apt-get install curl build-essential libssl-dev git-core $ git clone git://github.com/creationix/nvm.git ~/.nvm $ echo '. ~/.nvm/nvm.sh' >> .bashrc $ . ~/.bashrc $ nvm install v0.4.5 $ echo 'nvm use v0.4.5' >> .bashrc $ . ~/.bashrc
次のプログラムはNode.jsで動作するWebアプリケーションです。アプリケーションプロセスの環境変数を、クライアントにJSON形式で返します。
var http = require('http'); var server = http.createServer(function(req, res){ res.end(JSON.stringify(process.env, null, 4) + "\n"); }); server.listen(3000, function(){ console.log("Server started at port %s", server.address().port); });
このプログラムを最初にローカル環境で動かし、動作確認ができたらcloudfoundry.comにデプロイします。
まず、新しくディレクトリを作成し、app.jsという名前でプログラムを保存します。
$ mkdir cf-app $ cd cf-app $ vi app.js # 上記のソースを入力して保存
このプログラムがローカル環境で起動することを確認します。
$ node app.js Server started at port 3000
別のターミナルを開いて出力を確認します。
$ curl http://localhost:3000/ { "MANPATH": "/home/yssk22/.nvm/v0.4.5/share/man:", "TERM": "xterm-color", "SHELL": "/bin/bash", "SSH_CLIENT": "192.168.1.64 50682 22", "NVM_PATH": "/home/yssk22/.nvm/v0.4.5/lib/node", "SSH_TTY": "/dev/pts/0", ... (snip) ... }
ローカル環境での動作確認がとれたので、続けてcloudfoundry.comにデプロイします。ただし、cloudfoundry.comにデプロイする前に、1カ所だけソースを修正します。
Cloud Foundryでは、アプリケーションがリッスンするポート番号は、ユーザープログラムが指定するものではなく、Cloud Foundry上のアプリケーションサーバを司るコンポーネントが決定し、環境変数として設定してからユーザープログラムのプロセスを起動します(注3)。この環境変数は、VCAP_APP_PORTという名前です。
したがって、server.listen()の第1引数を、この環境変数VCAP_APP_PORTを使うように変更します。なお、ローカル環境でもそのまま動作するように、VCAP_APP_PORTが設定されていなければ3000番を使う、といったロジックにしておくとよいでしょう。修正に必要な差分は次のようになります。
< server.listen(3000, function(){ --- > server.listen(process.env.VCAP_APP_PORT || 3000, function(){
これで準備が整ったので、アプリケーションをcloudofoundry.comにデプロイします。
デプロイ時には、アプリケーションの名前およびURLを決める必要があります。名前およびURLは、Cloud Foundryの管理対象(今回の場合はcloudfoundry.comサイト全体)において一意である必要があり、他人のアプリケーションと重複したものにできない点に注意してください。
以下の例では、アプリケーション名をyssk22-cf-atmarkit、URLをyssk22-cf-atmarkit.cloudfoundry.comにしています。なお、cloudfoundry.comでは必ず、URLをcloudfoundry.comのサブドメインにしなければなりません(これはCloud Foundry自体に制約があるわけではなく、cloudfoundry.comが制約を設けて運用しているためです)。
アプリケーションのデプロイは、vmc pushコマンドを使って対話形式で行います。
$ vmc push Would you like to deploy from the current directory? [Yn]: Y Application Name: yssk22-cf-atmarkit Application Deployed URL: 'yssk22-cf-atmarkit.cloudfoundry.com'? Detected a Node.js Application, is this correct? [Yn]: Memory Reservation [Default:64M] (64M, 128M, 256M, 512M or 1G) Creating Application: OK Would you like to bind any services to 'yssk22-cf-atmarkit'? [yN]: Uploading Application: Checking for available resources: OK Packing application: OK Uploading (1K): OK Push Status: OK Staging Application: OK Starting Application: OK
これでデプロイが完了したので出力を確認してみます。
$ curl yssk22-cf-atmarkit.cloudfoundry.com { "VMC_APP_HOST": "172.30.49.199", "VMC_APP_NAME": "yssk22-cf-atmarkit", "VMC_APP_INSTANCE": "{\"droplet_id\":123177,\"instance_id\":\"2e92a21e3896d518b41bb8ab86ba1cd2\",\"instance_index\":0,\"name\":\"yssk22-cf-atmarkit\",\"dir\":\"/var/vcap/data/dea/apps/yssk22-cf-atmarkit-0-2e92a21e3896d518b41bb8ab86ba1cd2\",\"uris\":[\"yssk22-cf-atmarkit.cloudfoundry.com\"],\"users\":[\"yssk22@gmail.com\"],\"version\":\"f6f263b6877b6d7245f6842bbb43ac067a73715f-1\",\"mem_quota\":67108864,\"disk_quota\":2147483648,\"fds_quota\":256,\"state\":\"STARTING\",\"runtime\":\"node\",\"framework\":\"node\",\"start\":\"2011-11-06 15:59:55 +0000\",\"state_timestamp\":1320595195,\"log_id\":\"(name=yssk22-cf-atmarkit app_id=123177 instance=2e92a21e3896d518b41bb8ab86ba1cd2 index=0)\",\"secure_user\":\"vcap-user-14\",\"resources_tracked\":true,\"port\":31487}", ... }
ここで、環境変数にVMC_*とVCAP_*というものが設定されていることに気が付くはずです。VMC_*は、Cloud Foundryの過去のバージョンとの互換性のための環境変数なので無視してください。VCAP_*が、Cloud Foundryのノードがアプリケーションに設定している固有の情報です。
$ curl yssk22-cf-atmarkit.cloudfoundry.com | grep VCAP_ "VCAP_DEBUG_PORT": "", "VCAP_APP_PORT": "31487", "VCAP_APPLICATION": "{\"instance_id\":\"2e92a21e3896d518b41bb8ab86ba1cd2\",\"instance_index\":0,\"name\":\"yssk22-cf-atmarkit\",\"uris\":[\"yssk22-cf-atmarkit.cloudfoundry.com\"],\"users\":[\"yssk22@gmail.com\"],\"version\":\"f6f263b6877b6d7245f6842bbb43ac067a73715f-1\",\"start\":\"2011-11-06 15:59:55 +0000\",\"runtime\":\"node\",\"state_timestamp\":1320595195,\"port\":31487,\"limits\":{\"fds\":256,\"mem\":67108864,\"disk\":2147483648},\"host\":\"172.30.49.199\"}", "VCAP_DEBUG_IP": "", "VCAP_SERVICES": "{}", "VMC_WARNING_WARNING": "All VMC_* environment variables are deprecated, please use VCAP_* versions.", "VCAP_APP_HOST": "172.30.49.199",
この結果から、デプロイしたアプリケーションは172.30.49.199:31487で動作していることが分かります。
なお、vmc instances {アプリケーション名} とすることでインスタンス数を変更できますが、複数インスタンスで稼働させると、このアプリケーションのレスポンスはランダムに変わることが確認できます。
$ vmc instances yssk22-cf-atmarkit 5 Scaling Application instances up to 5: OK $ curl http://yssk22-cf-atmarkit.cloudfoundry.com | grep VCAP_ # (何度か実行して結果を確認してください)
注3:ユーザープログラムでポート番号を意識するのはNode.js自体がHTTPサーバとしてのプログラムを書く必要があるためです。RubyやJavaのアプリケーションを動作させる場合は、この点については意識する必要はありません。
最後に、アプリケーションにサービスをバインド(関連付け)してみます。
先ほどのアプリケーションの例では、アプリケーションのデプロイ時にCloud Foundry上のアプリケーションサーバを司るコンポーネントがポート番号を決定し、環境変数(VCAP_APP_PORT)を用いてユーザープログラムに伝えつつ、アプリケーションプロセスを起動することを説明しました。
これに対して、システムサービスを利用する場合は次のようになります。
それでは、cloudfoundry.com上でシステムサービスインスタンスを作成し、先ほどデプロイした環境変数確認用のアプリケーションにバインドして、環境変数がどのように設定されるのかを確認してみます。
試しにMongoDBのインスタンスを作成します。
$ vmc create-service 1. mysql 2. postgresql 3. redis 4. mongodb 5. rabbitmq Please select one you wish to provision: 4 Creating Service [mongodb-9633]: OK
インスタンスが作成され、ユニークなID(mongodb-9633)が割り振られたので、これをアプリケーションにバインドします。
$ vmc bind-service mongodb-9633 yssk22-cf-atmarkit Binding Service: OK Stopping Application: OK Staging Application: OK Starting Application: OK
curlを使って環境変数を確認してみます。
$ curl http://yssk22-cf-atmarkit.cloudfoundry.com | grep VCAP_SERVICES "VCAP_SERVICES": "{\"mongodb-1.8\":[{\"name\":\"mongodb-9633\",\"label\":\"mongodb-1.8\",\"plan\":\"free\",\"tags\":[\"mongodb\",\"mongodb-1.8\",\"nosql\"],\"credentials\":{\"hostname\":\"172.30.48.69\",\"host\":\"172.30.48.69\",\"port\":25125,\"username\":\"450fa750-8325-4ebd-97c0-6bbc5d56b8b4\",\"password\":\"b3aee27d-95a2-4353-afb2-008564dfb4f7\",\"name\":\"6645f071-1035-47d7-930c-b53d64ba0196\",\"db\":\"db\"}}]}",
この結果から、アプリケーションでは、MongoDBに接続する際には、172.30.48.64:25125に対して、ユーザー名:450fa750-8325-4ebd-97c0-6bbc5d56b8b4、パスワード:b3aee27d-95a2-4353-afb2-008564dfb4f7を使えばよいことが分かります。
現時点でCloud Foundryが実装しているのはここまでです。どの接続ライブラリを使うか、などはユーザーに委ねられます。
また、データベースにまつわる運用オペレーション(例えばMySQLでDDLを流す、MongoDBでインデックスを設定する、など)に関しては特別なツールが用意されているわけではありません。Cloud Foundryを使って独自のPaaSを組み上げる場合は、それぞれのシステムサービスについて、ユーザー向けに運用アプリケーションを公開しておくとよいでしょう。
今回はCloud Foundryの概要を紹介するとともに、Cloud Foundryを使ったPaaS構築に先立ち、すでにPaaSを提供しているcloudfoundry.comについて取り上げ、利用イメージについてつかみました。
Cloud Foundryを使うことで、cloudfoundry.comと同等、あるいはそれ以上のPaaSを組み上げることが可能です。次回はCloud Foundryの内部アーキテクチャについて取り上げ、実際にCloud FoundryをクリーンインストールしてPaaSサイトを構築します。
なお、Cloud FoundryのサポートについてはCloud Foundry Communityでコミュニティベースのサポートが受けられます。また、日本ではGoogle Group上で、CloudFoundry Jpというコミュニティグループが立ち上がっていますので、日本語での議論もできます(筆者も参加しています)。ぜひ参考にしてください。
Copyright © ITmedia, Inc. All Rights Reserved.