1. Cloud Foundryの魅力
従来のPaaSの多くは、特定のOSとミドルウェア、開発フレームワーク、アプリケーションサービスセットなどによって構成され、開発者が利用できる機能は限定的なことが一般的だった。そこに切り込んだのがCloud Foundryである。Cloud Foundryではオープン性を第一の特徴として掲げており、Spring FrameworkやRuby on Rails、node.js、Grailsなどといったオープンソースのプロダクトによって構成される。さらに、Cloud Foundry自身もオープンソースになっており、その成果物を自由にカスタマイズして、自前の環境、例えば自社サーバや他社のIaaSなどに展開して利用することができる。オープンソースプロジェクトとしての成果物はコミュニティサイトで公開されている。
VMware社でSenior Director of Developer Relationsを務めるPatrick Chanezon氏は、Cloud Foundryを使用するメリットとして次のような項目を挙げている。
- 中立的なオープンソースライセンスなので、ベンダーロックインのリスクがない
- IaaSを含むどのようなインフラの上でも動かすことができる
- シンプルなOS環境からフルマネージドな環境まで、幅広い種類のクラウドに対応
-
複数のランタイムやフレームワーク、サービスアーキテクチャをサポートしており、拡張も可能
- node.js、Ruby、Java、Scala、Erlangなどの言語をサポート
- PostgreSQL、neo4j、MongoDB、Redis、MySQLなどのDBMS、およびRabbitMQなどのMOM(Message Oriented Middleware)をサポート
- コミュニティによる拡張の成果も取り込んでいる
VMwareでは、Cloud Foundry本体の開発に対するコミットメントに加えて、開発ツールの提供や、Cloud FoundryベースのPaaSサービス「CloudFoundry.com」の運営、PC上で稼働するPaaS環境「Micro Cloud Foundry」の開発などを行っている。つまり、自分でPaaS環境を構築する場合に限らず、通常のPaaSと同様にアカウントを取得するだけで利用することもできるということだ。
参考:Patrick Chanezon氏のセッション(YouTube)
2. vmcコマンドを用いたアプリケーションの公開
実際にどのようにしてCloudFoundry.comを利用したらいいかという点については、CloudFoundry.comのファウンダーであるChris Richardson氏が説明してくれた。まずは、CloudFoundry.comのサイトでサインアップするのが最初のステップになる。サインアップに成功すると、間もなくパスワードを記載したメールが送られてくる。
アプリケーションの作成やデプロイ、管理などはPC上のツールを使って行う。Cloud Foundryに対応したツールとしては次のようなものがあるという。
- コマンドラインツール「VMC」
- Apache Maven
- Grails
- SpringSource Tool Suite
- Spring Roo
このうち、もっとも基本的なツールが「VMC」とのこと。VMCはRubyベースのツールであり、Ruby環境を用意すれば、RubyGemsを使ってインストールすることができる。
> gem install vmc
図2.4に示すのがVMCに用意されている主要なコマンドである。
アプリケーションをデプロイするまでの手順としては、まずvmc targetコマンドで対象とするクラウドプラットフォームを指定した上で、vmc loginコマンドを使ってログインする。CloudFoundry.comを使用する場合には、ターゲットには「http://api.cloudfoundry.com」を指定すればよいとのこと。ユーザID(Eメールアドレス)とパスワードは、サインアップ完了時に送られてきたメールに記載されている。
> vmc target api.cloudfoundry.com Successfully targeted to [http://api.cloudfoundry.com] > vmc login Attempting login to [http://api.cloudfoundry.com] Email: xxxx@xxxx.xxx Password: ******** Successfully logged into [http://api.cloudfoundry.com]
ログインに成功したら、アプリケーションやクラウド環境を管理するためのコマンドが利用できるようになる。アプリケーションのデプロイは、この状態でvmc pushコマンドを使って行う。Richardson氏のセッションでは、Mavenを用いてJavaアプリケーションプロジェクトを作成し、それをデプロイし、さらにインスタンス数を増やしてスケールアウトするデモが行われた。以下は、同様の手順でアプリケーションをデプロイした例である。
まず、デプロイするJavaアプリケーションを作成する必要がある。デモでは、次に示すようにMavenのarchetypeプラグインを用いて対話的にプロジェクトを構築・パッケージングしていた。ただし、Javaアプリケーションの場合は最終的にWAR形式でパッケージングされていればいいので、特にMavenを使わなければならないわけではない。また、RailsやNode.jsなどを使った場合でも、基本的な手順は同様とのことだ。
> mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp Define value for property 'groupId': : org.example Define value for property 'artifactId': : example Define value for property 'version': 1.0-SNAPSHOT: : Define value for property 'package': org.example: : example Confirm properties configuration: groupId: org.example artifactId: example version: 1.0-SNAPSHOT package: example Y: : y > cd example example> mvn package
vmc pushコマンドを使ってデプロイを行うと、アプリケーションの公開URLや使用するリソースなどを聞かれるので、任意の値を入力する。
> vmc push example --path target Application Deployed URL [example.cloudfoundry.com]: codezine-example.cloudfoundry.com Detected a Java Web Application, is this correct? [Yn]: y Memory Reservation (64M, 128M, 256M, 512M, 1G, 2G) [512M]: 256M Creating Application: OK Would you like to bind any services to 'example'? [yN]: n Uploading Application: Checking for available resources: OK Packing application: OK Uploading (2K): OK Push Status: OK Staging Application: OK Starting Application: OK
デプロイが完了したら、指定した公開URLにWebブラウザからアクセスしてみれば、クラウド上でアプリケーションが動作していることを確認できる。
VMCからは、次のようにvmc appsコマンドやvmc statsコマンドを使うことで、アプリケーションの状態を調べることができる。
> vmc apps +-------------+----+---------+-----------------------------------+----------+ | Application | # | Health | URLS | Services | +-------------+----+---------+-----------------------------------+----------+ | example | 1 | RUNNING | codezine-example.cloudfoundry.com | | +-------------+----+---------+-----------------------------------+----------+ > vmc stats example +----------+-------------+----------------+--------------+--------------+ | Instance | CPU (Cores) | Memory (limit) | Disk (limit) | Uptime | +----------+-------------+----------------+--------------+--------------+ | 0 | 1.6% (4) | 93.4M (256M) | 8.0M (2G) | 0d:0h:2m:25s | +----------+-------------+----------------+--------------+--------------+
アプリケーションを更新する場合には、vmc updateコマンドを使用する。例えばexampleプロジェクトのsrc/main/webapp/index.jspを修正した上で次のようにvmc updateコマンドを実行すれば、Webサイトにも反映されるはずだ。
example> vmc update example --path target Uploading Application: Checking for available resources: OK Packing application: OK Uploading (2K): OK Push Status: OK Stopping Application: OK Staging Application: OK Starting Application: OK
インスタンス数を増やすスケールアウトは、次のようにvmc instancesコマンドを実行するだけでいいそうだ。対象のアプリケーションを指定して、「+2」となどとやればインスタンスが2つ増える。逆に減らす場合には「-2」などとすればよい。
> vmc instances example +2 Scaling Application instances up to 3: OK > vmc stats example +----------+-------------+----------------+--------------+--------------+ | Instance | CPU (Cores) | Memory (limit) | Disk (limit) | Uptime | +----------+-------------+----------------+--------------+--------------+ | 0 | 1.1% (4) | 93.4M (256M) | 8.0M (2G) | 0d:0h:3m:38s | | 1 | 12.5% (4) | 64.3M (256M) | 7.9M (2G) | 0d:0h:0m:15s | | 2 | 10.1% (4) | 58.3M (256M) | 7.9M (2G) | 0d:0h:0m:15s | +----------+-------------+----------------+--------------+--------------+
デモでは、その他にSpringSource Tool Suiteを使う方法なども紹介された。SpringSource Tool SuiteはEclipseベースの開発ツール集であり、Cloud Foundry用プラグインを使うことで、IDE上からCloud Foundry上のアプリケーションの管理を行うことができる。
3. Cloud Foundryのアーキテクチャ
続いてRichardson氏は、Cloud Foundryのアーキテクチャの概要を説明した。Cloud Foundryのプラットフォームはメッセージングによって連携する複数のコンポーネントか構成され、全体像は図3.1のようになっている。
このうち核となるのがCloud Controllerで、アプリケーションの構成管理や、WebサービスAPIの提供などはこのCloud Controllerによって行われる。VMCからの接続もCloud Controllerによって処理されている。DEA(Droplet Execution Agent)というのは、ユーザアプリケーションを動作させるためのエージェントである。アプリケーションはどのDEA上でも実行可能な状態になっており、1つのDEAでいくつのアプリケーションを動作させるかは設定によって選択できる。なお、Dropletというのは、vmc statsコマンドで確認できるインスタンスの実態のことだ。
リクエストのアプリケーションへの振り分けは、RouterとLoad Balancerによって行われる。すべての外部からのHTTPリクエストはRouterを経由し、アプリケーションごとにURLで適切なDEAにルーティングされるとのこと。図3.2は、リクエストハンドリングの流れを示したものである。
Health ManagerはDEAを監視していて、問題が発生した場合にはControllerに通知する。なお、Health Managerが監視しているのはDEAであり、アプリケーション自体の状態は各DEAによって監視されているとのことである。Servicesは、ミドルウェアの機能をサービスとして提供するコンポーネントである。これによりPostgreSQLやMongoDBなどによるストレージ機能が提供されている。
図3.3は、アプリケーションをデプロイする場合の処理の流れを示したものだという。
vmc pushコマンドが実行されたら、まずVMCがフレームワークの検出を行い、Cloud Controllerと通信してアプリケーションのデプロイを開始する。Controllerはフレームワーク用のstagingプラグインを利用して、必要なサービスのDropletを作成する。実際のアプリケーションはDEA上に展開されるので、まずはDEAがアプリケーションを展開可能であるかどうかを確認し、十分なリソースがあればDropletが展開されることになる。DEAは続いてRouterのルーティングテーブルを更新し、アプリケーションをスタートする。
障害に対する自己復旧機能を持っている点は、Cloud Foundryの大きな特徴の一つである。アプリケーションが予期しないエラーで終了した場合には、DEAがその旨のメッセージをブロードキャストする。それに応じて、Routerは対象のアプリケーションへのルーティングを中止し、Health ManagerはCloud Controllerに障害を通知する。通知を受け取ったCloud Controllerは、デプロイメントのプロセスを再度実行することによって、アプリケーションのインスタンスを復帰させる。
DEAそのものの障害はHealth Managerによって監視される。Health ManagerからはDEAに向けて定期的にHeatBeatメッセージが送られており、DEAのクラッシュを自動で検知できるようになっている。クラッシュを検知したHealth Managerは、Cloud Controllerにその旨を通知し、Cloud ControllerはDEAとアプリケーションインスタンスの再機動を実行するという仕組みである。
4. Micro Cloud Foundryの利用
Cloud Foundryを使ってみる第一歩としては、CloudFoundry.comを利用する他に、Micro Cloud Foundryを使うという選択肢もある。Micro Cloud FoundryはCloud Foundryの環境一式がVMware仮想マシンの中にパッケージングされているもので、仮想化ソフトウェア上で手軽に実行することができる。Richardson氏によれば、Micro Cloud FoundryはPC上でも実行することが可能なため、開発者用のサンドボックスなどの用途として極めて有用なものとのことである。
Micro Cloud Foundryは、CloudFoundry.comのサイトより入手することができる。まずサインインページ(図4.1)に行ってログインする。図4.2のようにライセンス条項が表示されるので、同意のチェックを入れて[Accept]ボタンをクリックする。
続いて、図4.3の画面で使用したいドメイン名を記入する。ドメイン名には任意の文字列が使えるが、他のユーザと競合しない一意のものでなければならない。ドメイン名が登録できたら図4.4のように設定用文字列(configuration token)が表示される。この文字列は、仮想マシンを設定する際に必要になる。最後に、[Download Micro Cloud Foundry VM]ボタンをクリックすればファイルをダウンロードできる。
ダウンロードしたファイルを解凍すると、vmdk形式の仮想ディスクイメージが入っているので、VMware Playerなどを使ってこれを起動すればよい。初回起動時にはいくつかの設定が必要とのこと。図4.5のように、「1. configure」オプションを選択し、パスワードとさきほどの設定用文字列を入力すればよい。
Micro Cloud Foundry向けにVMCを使う場合のターゲットURLは「api.ドメイン名.cloudfoundry.me」となる。ターゲットを指定したら、次のようにvmc registerコマンドを使ってユーザ登録をしよう。
> vmc target api.ドメイン名.cloudfoundry.me > vmc register Email: xxxx@xxxx.xxxx Password: ******** Verify Password: ******** Creating New User: OK Attempting login to [http://api.ドメイン名.cloudfoundry.me] Successfully logged into [http://api.ドメイン名.cloudfoundry.me]
あとはCloudFoundry.comとまったく同様にログインして利用することができる。
Micro Cloud FoundryはローカルのPCで実行することができるが、ドメイン名の解決のために、通常使用する場合はインターネットへの接続環境が必須となっている。ただし、完全にオフラインの環境で利用するために、最新のMicro Cloud Foundryにはオフラインモードが用意されているという。オフラインモードを使えば、PCがインターネットに接続されていなくても、ローカルのDNSによってドメイン名を解決して利用することができるとのことだ。
5. サービスのバインディング
DBMSなどのCloud Foundryが持つ機能は、サービスとして提供される。これらのサービスは、インスタンスを生成することによってアプリケーションから利用できるようになるという。インスタンスの生成にはvmc create-serviceコマンドを使用する。次の例の場合、MySQLのインスタンスを生成し、「mysql-994002」というサービス名が割り当てられた。
> vmc create-service mysql Creating Service [mysql-994002]: OK
利用可能なサービスや、インスタンスを生成済みのサービスを確認するにはvmc servicesコマンドを実行すればよい。
> vmc services ============== System Services ============== +------------+---------+---------------------------------------+ | Service | Version | Description | +------------+---------+---------------------------------------+ | mongodb | 1.8 | MongoDB NoSQL store | | mysql | 5.1 | MySQL database service | | postgresql | 9.0 | PostgreSQL database service (vFabric) | | rabbitmq | 2.4 | RabbitMQ message queue | | redis | 2.2 | Redis key-value store service | +------------+---------+---------------------------------------+ =========== Provisioned Services ============ +--------------+---------+ | Name | Service | +--------------+---------+ | mysql-994002 | mysql | +--------------+---------+
アプリケーションからサービスの機能を利用するためには、作成したインスタンスをアプリケーションに"バインド”する。バインドはvmc bind-serviceコマンドを用いて次のように行う。
> vmc bind-service mysql-994002 example Binding Service [mysql-994002] OK Stopping Application OK Staging Application OK Starting Application OK
その他、vmc pushでサービスをデプロイした際に、「Would you like to bind any services to 'アプリケーション名'? [yN]:」の質問に"y"を入力することでもバインドを実行できる。
バインドが完了したサービスに関する情報は、VCAP_SERVICES環境変数に図5.4のような形で保存される。これはJSON形式のドキュメントになっているので、アプリケーションではこれを解析して情報を取得し、サービスへのアクセスに利用すればいいとのことだ。
Cloud Foundry上に展開されたサービスのインスタンスは、通常の方法だとCloud Foundry上のアプリケーションからしかアクセスすることができない。しかし、例えばストレージ上のデータをデータベースツールで管理したい場合や、JUnitで単体テストする場合のように、アプリケーションの外部からアクセスしたいときにはどうしたらいいだろうか。
Richardson氏によれば、「Caldecott」というツールを使えばその問題は解決できるとのことだ。Caldecottは、Cloud Foundry上のサービスとPCの間にトンネルを構築するトンネリングツールであり、これを使うことでローカルPCからでもCloud Foundryのサービスにアクセスできるようになるという。CaldecottもRubyGemsでインストールできる。セッションでは、これを使ってJUnitテストを行うデモも披露された。
参考:Chris Richardson氏のセッション(YouTube/日本語字幕付き)
6. 「Go Go OpenSource!」
編集部では、Cloud Foundry Open Tour, Tokyoでのセッション後、Richardson氏から個別にお話を聞く機会をいただいた。
──一般的に、PaaSを使う上での難しさはどこにあると思いますか。
そもそも、最初の段階でPaaSプロバイダを選択するのが難しいと思います。一般的なPaaSはそれほどたくさんの選択肢を提供してはくれません。どのようなインフラの上で、どのようなサービスが提供されているのか。自分のアプリケーションがその環境でちゃんと動作するのか。確認しなければならない項目がたくさんあります。
Cloud Foundryであれば、自分の好きな環境にカスタマイズできるので、そのような心配はありません。
──Cloud Foundryと既存のPaaS型クラウドサービスはどのように使い分けたらいいのでしょうか。
根本的な違いはオープンソースであることです。オープンな技術によって開発されているのでベンダーロックインのリスクがなく、ユーザが自由に拡張することができます。そのような自由な環境を、ほんの数ステップで手に入れることができるという点も大きなアドバンテージだと思います。
──Cloud Foundryが発表されてから1年が経ちますが、現時点での反響はどのようなものでしょうか。また、今後はどのようになっていくと思いますか。
多くの人々が、実際に使って、そしてこれを拡張することに関わっています。コミュニティは非常にアクティブな状態にあると思います。今回のOpen Tourは東京を含めて世界10都市で開催されていて、非常に多くの開発者やユーザが参加しています。今後どうなっていくかということですが、もっとよくなっていくということは間違いないでしょう。
──最後に、日本のユーザにメッセージをお願いします。
オープンソースは非常にすばらしいものです。いろいろなフレームワークやアプリケーションが登場しています。『Go Go OpenSource!』。これからもオープンソースのプロダクトを積極的に使い、そして積極的に活動に参加してください。