Vagrantで手軽に構築してオープンPaaS「Cloud Foundry」を理解する:DevOps時代のJavaプログラマのためのオープンクラウド入門(2)(4/4 ページ)
オープンなクラウドで重要性を増すJava。DevOps時代のJavaプログラマはアプリケーション開発者(Dev)もデプロイや運用(Ops)面におけるクラウド/インフラ技術への幅広い理解が必要となる。本連載では、さまざまなオープンクラウド技術を紹介していく。今回は、オープンソースのPaaSである「Cloud Foundry」を紹介。また、環境構築が手軽にできる「Vagrant」を使ってローカルにCloud Foundryの開発用稼働環境を用意してみよう。
JavaによるWebアプリ開発
Cloud Foundryは、ヴイエムウェアが主に開発を推進していることと、その傘下にはSpringSourceがいることから、JavaでWebアプリを開発するときは、Springアプリへのサポートが充実していると考えられます。もちろん、単純なServlet/JSPアプリもサポートされています。そこで、JavaのWebアプリもCloud Foundryで動かしてみましょう。
STSを簡単に紹介しますが、Springアプリは今回は作成しませんので、すでにEclipseやNetBeansなどの環境があるようなら、そちらを使ってもいいでしょう。Mavenを使った開発環境があれば大丈夫です。
STSのインストール
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アプリ作成
JavaのWebアプリをCloud Foundryで稼働させるにはWARファイルを用意してcf pushするだけなので、単純なServlet/JSPアプリを作成してみます。Mavenプロジェクトで作成するのが簡単なのでやってみましょう。
- STSのメニューで[File]→[New]→[Maven project]をクリック
- New Maven Projectダイアログで[Next]をクリック
- [Group Id]が「org.apache.maven.archetypes」かつ[Artifact Id]が「maven-archetype-webapp」の行をクリックしてから[Next]をクリック
- [Group Id]に「example」、[Artifact Id]に「hello-sample」、[Package]に「example.hello_sample」を入力して[Finish]をクリック
これで「hello-sample」プロジェクトが作成されます。このプロジェクトの配下にある「src/main/webapp/index.jsp」をダブルクリックするとエディタに表示されるので、次のようにHello World!の文字列をCloud Foundryに直します。
<html>
<body>
<h2>Cloud Foundry!</h2>
</body>
</html>
[Ctrl]+[S]キーでファイルを保存したら、次のようにしてWARファイルを生成します。
- hello-sampleプロジェクトを右クリック
- 表示されるメニューから[Run]→[Maven build]をクリック
- 表示されるダイアログの[Goals]に「package」と入力
- [Run]をクリック
これでSTSのコンソールビューにMavenの実行結果が出力されます。出力の最後の方で「[INFO] BUILD SUCCESS」という行があればビルドは成功です。「target」フォルダに「hello-sample.war」が出来上がっています。失敗した場合はエラーメッセージを確認して対応をします。
なお、[Goals]へ「package」を入力するのは最初だけで2回目からは[Run]→[Maven build]とするだけでWARファイルが生成されます。
Cloud FoundryへのJava Webアプリデプロイ
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で用意した環境にデプロイするには
さて、ここで、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から利用する
最後にCloud FoundryをJavaから利用する方法を説明をしましょう。
「API and Libraries」を見ると、Cloud Foundryが提供するAPIはREST APIであると説明があります。また、Javaからアクセスするためのライブラリが「vcap-java-client」という名前で提供されています。Ruby用にも「cfoundry」という名前のgemが提供されているようです。簡単なJavaプログラムを作って動作させてみましょう。
- STSのメニューで[File]→[New]→[Maven project]をクリック
- New Maven Projectダイアログで[Next]をクリック
- [Group Id]が「org.apache.maven.archetypes」かつ[Artifact Id]が「maven-archetype-quickstart」の行をクリックしてから[Next]をクリック
- [Group Id]に「example」、[Artifact Id]に「jcf-sample」、[Package]に「example.jcf_sample」を入力して[Finish]をクリック
出来上がった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.
関連記事
ポール・マリッツ氏がEMC Worldで語ったこと:Pivotalが目指す「企業が生き残るための新世代アプリプラットフォーム」って何?
EMCとヴイエムウェアが4月に設立した、企業のための次世代アプリケーション開発環境を提供する企業、Pivotal。CEOに就任したポール・マリッツ氏が、5月7日にEMCのイベント「EMC World」で、この新会社について説明した。Pivotalはどういったアプリケーションを想定しているのか、具体的にはどのような製品を提供しようとしているのだろうか。
VMwareとEMCが新組織「Pivotal Initiative」を設立。PaaSとビッグデータに焦点
EMCとVMwareは、GreenplumやvFabric、Cloud Foundryなどのプロダクトを横断し、ビッグデータ市場を狙った新組織を立ち上げた。
CloudFoundryで始めるPaaS構築入門(1):Cloud Foundryで始めるPaaS構築入門
「Cloud Foundry」というオープンソースパッケージを用いて、Platform as a Service(PaaS)のためのインフラストラクチャを構築する方法について解説します。
ユカイ、ツーカイ、カイハツ環境!(25):Java開発者が知らないと損するPaaSクラウド8選
Google App Engine、RUN@cloud、mCloud、Windows Azure、AWS、Cloud Foundry、OpenShift、Herokuなど紹介し傾向を分析
