Spring Roo Cloud Foundryにアプリをデプロイ

 Cloud Foundryに申し込んで使えるようになったので、Spring Roo in Actionの11章を参考にRooのアプリケーションをデプロイしてみました。

 まずはroo shellからCloud Foundryを走査するためのAddonをインストールします。インストールの間自動的に認証されるよう、下記コマンドを実行します。

roo> pgp automatic trust
Automatic PGP key trusting enabled (this is potentially unsafe); disable by typing 'pgp automatic trust' again

そして下記コマンドでAddonをインストールします。

roo> addon install bundle --bundleSymbolicName org.springframework.roo.addon.cloud.foundry;1.1.5.RELEASE
Target resource(s):
-------------------
   Spring Roo - Addon - Cloud Foundry (1.1.5.RELEASE)

Required resource(s):
---------------------
   Spring Beans (3.0.5.RELEASE)
   jcl-over-slf4j (1.6.1)
   slf4j-nop (1.6.1)
   Spring AOP (3.0.5.RELEASE)
   Servlet Specification API (2.5.0)
   Spring Core (3.0.5.RELEASE)
   Jackson JSON processor (1.6.2)
   Data mapper for Jackson JSON processor (1.6.2)
   Spring Context (3.0.5.RELEASE)
   Spring Roo - Wrapping - aopalliance (1.0.0.0010)
   Spring Web (3.0.5.RELEASE)
   slf4j-api (1.6.1)
   Spring Roo - Wrapping - Cloud Foundry API (0.0.1.0010)

Optional resource(s):
---------------------
   Spring Expression Language (3.0.5.RELEASE)
   Spring ASM (3.0.5.RELEASE)

Deploying...done.

Successfully installed add-on: Spring Roo - Addon - Cloud Foundry [version: 1.1.5.RELEASE]
[Hint] Please consider rating this add-on with the following command:
[Hint] addon feedback bundle --bundleSymbolicName org.springframework.roo.addon.cloud.foundry --rating ... --comment "..
."

Roo in Actionの例では "addon install bundle --bundleSymbolicName org.springframework.roo.addon.cloud.foundry" という感じにバージョン番号を指定していないのですが、これだと最新のバージョンがインストールされます。今回のケースではSpring Rooのバージョンが1.1.5なので、Addonのインストールでもバージョンを1.1.5に指定しないとこの時点の最新である1.2.0.RC1がインストールされてしまい、うまくいきません。

インストールが終了したら自動認証をOFFに戻します。

roo> pgp automatic trust
Automatic PGP key trusting disabled (this is the safest option)

Addonをインストールしたことでcloud foundryコマンドが使用できるようになっています。まずはCloud Foundryにログインします。

roo> cloud foundry login --email xxxxxxxxxx@xxxxx.xxx --password xxxxxxxxxx
Credentials saved.
Logged in successfully with email address 'xxxxxxxxxx@xxxxx.xxx'

Cloud Foundryの環境についての情報を表示するには下記コマンドを実行します。

roo> cloud foundry info


VMware's Cloud Application Platform
For support visit http://support.cloudfoundry.com


Target:     http://api.cloudfoundry.com (0.999)


User:     hiroaki.akanuma@gmail.com
Usage:     Memory (128MB of 2048MB total)
     Services (0 of 16 total)
     Apps (1 of 20 total)

現在デプロイされているアプリケーションのリストは下記コマンドで確認できます。

roo> cloud foundry list apps

=================================== Applications ===================================

Name             Status      Instances     Services     URLs
----             ------      ---------     --------     ----
akanumahello     STARTED     1                          akanumahello.cloudfoundry.com

上記の出力では akanumahello というアプリケーションがすでにデプロイされていることが分かります。

また、現在使用可能なサービスのリストは下記コマンドで確認できます。

roo> cloud foundry list services

======================= System Services ========================

Service        Version     Description
-------        -------     -----------
mysql          5.1         MySQL database service
postgresql     9.0         PostgreSQL database service (vFabric)
mongodb        1.8         MongoDB NoSQL store
redis          2.2         Redis key-value store service
rabbitmq       2.4         RabbitMQ messaging service


There are currently no provisioned services.

ではアプリケーションをデプロイしてみます。cloud foundry deploy コマンドでデプロイすることができます。

roo> cloud foundry deploy --appName cftest --path CREATE
~~中略~~
Operation could not be completed: 400 Bad Request

上記のように 400 Bad Request となってしまった場合は、--appName で指定したアプリケーション名がすでに使われているということなので、アプリケーション名を変更して再度デプロイします。

roo> cloud foundry deploy --appName cftestaka --path CREATE
~~中略~~
The application 'cftestaka' was successfully pushed

上記のように successfully pushed と出力されればデプロイ成功です。アプリケーションの一覧を確認してみます。

roo> cloud foundry list apps

=================================== Applications ===================================

Name             Status      Instances     Services     URLs
----             ------      ---------     --------     ----
akanumahello     STARTED     1                          akanumahello.cloudfoundry.com
cftestaka        STOPPED     1                          cftestaka.cloudfoundry.com

cftestakaというアプリケーションが一覧に追加されています。StatusがSTOPPEDになっていてまだ起動はしていないので、下記コマンドでアプリケーションを起動します。

roo> cloud foundry start app --appName cftestaka
The application 'cftestaka' was successfully started
roo> cloud foundry list apps

=================================== Applications ===================================

Name             Status      Instances     Services     URLs
----             ------      ---------     --------     ----
akanumahello     STARTED     1                          akanumahello.cloudfoundry.com
cftestaka        STARTED     1                          cftestaka.cloudfoundry.com

Status が STARTED に変わり、アプリケーションが起動されました。http://cftestaka.cloudfoundry.com/ にアクセスしてトップページが表示されれば起動に成功しています。

稼働中のアプリケーションの統計情報については下記コマンドで確認できます。

roo> cloud foundry view app stats --appName cftestaka

============================== App. Stats ==============================

Instance     CPU (Cores)     Memory (limit)     Disk (limit)      Uptime
--------     -----------     --------------     ------------      ------
0            8.0 (4)         239.09M (256M)     28.0M (2048M)     0d:

さて、アプリケーションは起動しましたが、まだDBが使えるようになっていないので、Entityを操作するための画面に遷移しようとするとエラーになってしまいます。

まずはDBをサービスとして作成します。

roo> cloud foundry create service --serviceName cftesakadb --serviceType postgresql
The service 'cftesakadb' was successfully created

サービスの一覧を確認すると、= Provisioned Services = の部分にサービスが追加になっています。

roo> cloud foundry list services

======================= System Services ========================

Service        Version     Description
-------        -------     -----------
mysql          5.1         MySQL database service
postgresql     9.0         PostgreSQL database service (vFabric)
mongodb        1.8         MongoDB NoSQL store
redis          2.2         Redis key-value store service
rabbitmq       2.4         RabbitMQ messaging service



= Provisioned Services =

Name           Service
----           -------
cftesakadb     postgresql

次に、作成したサービスをアプリケーションに紐付けます。

roo> cloud foundry bind service --serviceName cftesakadb --appName cftestaka
The service 'cftesakadb' was successfully bound to the application 'cftestaka'
roo>

そしてアプリケーションを再起動します。

roo> cloud foundry restart app --appName cftestaka
The application 'cftestaka' was successfully restarted

これでアプリケーションがDBを使えるようになり、EntityのCRUD画面も動作するようになります。

アプリケーションのログを確認するには下記コマンドを実行します。

roo> cloud foundry view logs --appName cftestaka --instance 0

長いので出力は省略しますが、stderr.logとstdout.logが閲覧できます。

それと現在のメモリの割当量は下記コマンドで確認できます。

roo> cloud foundry view app memory --appName cftestaka

= Application Memory =

Name          Memory
----          ------
cftestaka     256MB

現在は256MBのメモリが割り当てられています。この割当量を変更するには下記のようにコマンドを実行します。

roo> cloud foundry update app memory --appName cftestaka --memSize 512MB

= Application Memory =

Name          Memory
----          ------
cftestaka     512MB

メモリ量が512MBに変更されました。

RooとCloud Foundryの組み合わせなら簡単なCRUDアプリの公開はとてもスピーディーに行うことができそうです。まだCloud Foundryはベータ版なので、正式版になったときに料金体系などがどうなるかは気になりますが、Roo + Cloud Foundryで何か公開できるようなサービスでも作れないかなぁと思っています。