Cloud Foundryは、ヴイエムウェアが主に開発を推進していることと、その傘下にはSpringSourceがいることから、JavaでWebアプリを開発するときは、Springアプリへのサポートが充実していると考えられます。もちろん、単純なServlet/JSPアプリもサポートされています。そこで、JavaのWebアプリもCloud Foundryで動かしてみましょう。
STSを簡単に紹介しますが、Springアプリは今回は作成しませんので、すでにEclipseやNetBeansなどの環境があるようなら、そちらを使ってもいいでしょう。Mavenを使った開発環境があれば大丈夫です。
STSはEclipseベースの開発環境でSpringアプリを開発するための機能が強化されています。これを使ってみます。
なお、EclipseベースであることからOracle JDKが必要です。本稿の読者はすでにPCへインストールしてあるでしょうから、JDKのインストールの説明については省略します。
STSからはCloud Foundryのプラグインも簡単にインストールできますが、2013年7月22日に確認したところ、Cloud Foundry v2のAPIに対応をしていませんでした。アナウンスによると近々対応版をリリースするということなので、それまではインストールせずに待った方がいいでしょう。プラグインがあればSTSからのデプロイなどが簡単にできますが、cfコマンドツールから同じことはできます。
STSのインストーラは「Tool Suites Download | SpringSource.org」から入手します。ここでは「spring-tool-suite-3.3.0.RELEASE-e4.3-win32-x86_64-installer.exe」をダウンロードしました。インストーラを起動したらウィザードに従って「C:\applications\springsource\sts-3.3.0.RELEASE」へインストールしましょう。
インストールができたら、Windowsのスタートメニューから「すべてのプログラム」を指定して[SpringSource]→[Spring Tool Suite 3.3.0.RELEASE]をクリックすると、STSが起動します。ワークスペースは好きなフォルダを指定します。ここでは「C:\workspace\sts」としたとします。
なお、STSはメニューが英語です。日本語メニューにしたい場合は「Pleiades - Eclipse プラグイン日本語化プラグイン | MergeDoc Project」からSTS 3.3.0に対応するEclipse 4.3用のPleiadesをダウンロードしてインストールします。ここでは英語メニューのまま説明をしますが、日本語メニューに慣れている場合は対応すると良いでしょう。
JavaのWebアプリをCloud Foundryで稼働させるにはWARファイルを用意してcf pushするだけなので、単純なServlet/JSPアプリを作成してみます。Mavenプロジェクトで作成するのが簡単なのでやってみましょう。
これで「hello-sample」プロジェクトが作成されます。このプロジェクトの配下にある「src/main/webapp/index.jsp」をダブルクリックするとエディタに表示されるので、次のようにHello World!の文字列をCloud Foundryに直します。
<html> <body> <h2>Cloud Foundry!</h2> </body> </html>
[Ctrl]+[S]キーでファイルを保存したら、次のようにしてWARファイルを生成します。
これでSTSのコンソールビューにMavenの実行結果が出力されます。出力の最後の方で「[INFO] BUILD SUCCESS」という行があればビルドは成功です。「target」フォルダに「hello-sample.war」が出来上がっています。失敗した場合はエラーメッセージを確認して対応をします。
なお、[Goals]へ「package」を入力するのは最初だけで2回目からは[Run]→[Maven build]とするだけでWARファイルが生成されます。
WARファイルができたらコマンドプロンプトを起動してカレントを「hello-sample」プロジェクトのフォルダにしてからcf pushをします。ワークスペースを「C:\workspace\sts」とした場合は、この配下に「hello-sample」フォルダができていますから、次のようにコマンドを入力します。
> cd C:\workspace\sts\hello-sample > cf login > cf push --path target/hello-sample.war Name> hello-sample-user001-org Instances> 1 (略) Memory Limit> 256M (略) Subdomain> hello-sample-user001-org (略) Domain> cfapps.io (略) Create services for application?> n (略) Save configuration?> y
「--path」を使ってWARファイルのパスを指定している点にも注意してください。今回「manifest.yml」を用意しませんでしたがWARファイルをpushするときはコマンドラインで内容を指定できます。例を参考に値を指定しましょう。
また、今回は使いませんが、データベースを使うWebアプリの場合は、あらかじめサービスを利用できるようにしておいて「Create services for application?」に対して「y」と入力して利用するサービスを使えるように設定することになります。「Save configuration?」で「y」と指定するとmanifest.ymlが生成されて、次回のcf pushからこれが使われるようになります。
なお、デプロイ時のメッセージからOpenJDK 1.7やApache Tomcat7といったソフトウェアが自動で使われるように設定されることが分かります。デプロイが成功すると「Push successful!」というメッセージと一緒にアクセス用URLが表示されるので、そこへアクセスをします。ここの例では「http://hello-sample-user001-org.cfapps.io」となります。Webブラウザからアクセスすると「Cloud Foundry」という文字が表示されることが分かります。
さて、ここで、Vagrantで用意した環境に、このWebアプリをデプロイするにはどうすればいいのでしょうか?
すでに説明しましたが、Vargrantの仮想マシンでは共有フォルダ機能を使って、ホストマシンにあるファイルを利用できるようになっていて、Windows 7の「C:\workspace\vagrant\cf-vagrant-installer」がcf-vagrantマシンの/vagrantに対応しています。ここへ「target」ディレクトリをコピーして、cf pushをすることで、ローカルで用意したCloud Foundry環境でこのWebアプリを稼働できます。
その際はmanifest.ymlの内容をVagrantで構築した環境に合わせる必要がある点に注意しましょう。少なくともdomainは変更する必要があります。
ホストマシンのWebブラウザを使ってWebアプリの表示をしたい場合は、サンプルについて動作確認したのと同様にして、ホスト名をhostsファイルへ追加してアクセスします。
最後にCloud FoundryをJavaから利用する方法を説明をしましょう。
「API and Libraries」を見ると、Cloud Foundryが提供するAPIはREST APIであると説明があります。また、Javaからアクセスするためのライブラリが「vcap-java-client」という名前で提供されています。Ruby用にも「cfoundry」という名前のgemが提供されているようです。簡単なJavaプログラムを作って動作させてみましょう。
出来上がったjcf-sampleプロジェクトのpom.xmlを編集します。<url>要素の下にrepositories要素を追加し、<dependencies>要素の中にcloudfoundry-client-libの<dependency>要素を追加しています。保存するとプロジェクトのMaven Dependenciesにcloudfoundry-client-lib関係のJARファイルが追加されます。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" (略) <url>http://maven.apache.org</url> <repositories> <repository> <id>spring-milestone</id> <name>Spring Portfolio Milestone Repository</name> <url>http://maven.springframework.org/milestone</url> </repository> </repositories> <properties> (略) <dependencies> <dependency> <groupId>org.cloudfoundry</groupId> <artifactId>cloudfoundry-client-lib</artifactId> <version>0.8.5</version> </dependency> <dependency> <groupId>junit</groupId> (略) </project>
Javaプログラムは「src/main/java/example/jcf_sample/App.java」を次のように編集します。簡単に説明をするとCloudFoundryClientクラスを使ってログインをしてからCloudSpaceクラス、CloudApplicationクラス、CloudServiceクラスを使って情報を取得し、最後にログアウトをしています。プログラムが書けたら、先ほどのWebアプリと同様にしてMaven buildでpackageを指定し、jarファイルを生成します。ここではSTSから簡単に実行して確認できるように、「target」「user」「password」をプログラム中で指定しています。自分が使っている値に変更してから実行するようにしてください。
package example.jcf_sample; import java.net.URI; import java.net.URL; import org.cloudfoundry.client.lib.CloudCredentials; import org.cloudfoundry.client.lib.CloudFoundryClient; import org.cloudfoundry.client.lib.domain.CloudApplication; import org.cloudfoundry.client.lib.domain.CloudService; import org.cloudfoundry.client.lib.domain.CloudSpace; public class App { public static void main(String[] args) { String target = "https://api.run.pivotal.io"; String user = "user001@example.jp"; String password = "secret"; URL url = null; try { url = new URI(target).toURL(); } catch (Exception e) { e.printStackTrace(); } CloudCredentials credentials = new CloudCredentials(user, password); CloudFoundryClient client = null; try { client = new CloudFoundryClient(credentials, url); client.login(); System.out.println("\nSpaces:"); for (CloudSpace space : client.getSpaces()) { System.out.println("\t" + space.getName() + ":" + space.getOrganization().getName()); } System.out.println("\nApplications:"); for (CloudApplication app : client.getApplications()) { System.out.println("\t" + app.getName()); } System.out.println("\nServices"); for (CloudService service : client.getServices()) { System.out.println("\t" + service.getName() + ":" + service.getLabel()); } } finally { if (client != null) { client.logout(); } } } }
プログラムを実行するにはjcf-sampleプロジェクトを右クリックしてメニューで[Run As]→[Java Application]をクリックします。実行結果は環境の状態によって変わりますが、STSのコンソールへ出力され、次のようになります。「Spaces」には「development」「staging」「production」があり、各値はorgsで指定した値が出力されています。「Applications」にはデプロイしたアプリの一覧が出力されています。「Services」は追加していないので何も出力されません。
Spaces: development:user001-org staging:user001-org production:user001-org Applications: a1-user001-org hello-sample-user001-org Services
以上、簡単ですが、Cloud Foundryについて解説しました。2013年6月にv2が使えるようになってCloud Foundryのドキュメントもv1のころとは変わりました。v1の情報なのかv2の情報なのか分かりにくいところもありますが、今回紹介した情報からv2に関しての情報へはアプローチできるはずです。
また、開発環境の構築に当たってはVagrantのようなソフトウェアも注目を浴びてきています。内部的には「Chef」が使われていて、知っている人はどういう処理をしているのか参考になるはずです。こういったソフトウェアを使ってみると、通常のアプリ開発とは違った楽しみがあります。
運用を簡単にするために開発されたツールが、開発環境構築を簡単に実現するためにも利用されるといったあたりに、DevOpsの時代を感じませんか。皆さんもいろいろと調べて楽しんでみてください。
Copyright © ITmedia, Inc. All Rights Reserved.