連載
» 2012年01月19日 00時00分 公開

CloudFoundryで始めるPaaS構築入門(1):Cloud Foundryで始めるPaaS構築入門 (2/2)

[佐々木庸平,楽天株式会社]
前のページへ 1|2       

Node.jsのアプリケーションをデプロイする

 それでは、アプリケーションを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)を用いてユーザープログラムに伝えつつ、アプリケーションプロセスを起動することを説明しました。

 これに対して、システムサービスを利用する場合は次のようになります。

  1. vmc create-serviceコマンドを使ってシステムサービスを作成します。この時点で選択したシステムサービス用のIPアドレス、ポート番号、認証情報がCloud Foundry上でアサインされ、サービスのプロセスが起動します。
  2. vmc bind-serviceコマンドを使って、アプリケーションにサービスをバインドします。この作業により、サービスのプロセスの情報が環境変数(VCAP_SERVICES)を通じてアプリケーションに通知されます。
  3. アプリケーションはVCAP_SERVICES環境変数の内容から接続すべきインスタンス情報を取得し、インスタンスに接続します。

 それでは、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というコミュニティグループが立ち上がっていますので、日本語での議論もできます(筆者も参加しています)。ぜひ参考にしてください。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。