Cloud Foundryで始めるPaaS構築入門:CloudFoundryで始めるPaaS構築入門(1)(2/2 ページ)
この連載では3回に分けて、「Cloud Foundry」というオープンソースパッケージを用いて、Platform as a Service(PaaS)のためのインフラストラクチャを構築する方法について解説します。
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)を用いてユーザープログラムに伝えつつ、アプリケーションプロセスを起動することを説明しました。
これに対して、システムサービスを利用する場合は次のようになります。
- vmc create-serviceコマンドを使ってシステムサービスを作成します。この時点で選択したシステムサービス用のIPアドレス、ポート番号、認証情報がCloud Foundry上でアサインされ、サービスのプロセスが起動します。
- vmc bind-serviceコマンドを使って、アプリケーションにサービスをバインドします。この作業により、サービスのプロセスの情報が環境変数(VCAP_SERVICES)を通じてアプリケーションに通知されます。
- アプリケーションは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というコミュニティグループが立ち上がっていますので、日本語での議論もできます(筆者も参加しています)。ぜひ参考にしてください。
Copyright © ITmedia, Inc. All Rights Reserved.