連載
» 2013年07月31日 18時00分 公開

Vagrantで手軽に構築してオープンPaaS「Cloud Foundry」を理解するDevOps時代のJavaプログラマのためのオープンクラウド入門(2)(4/4 ページ)

[小山博史,SSS(G)/ガリレオ]
前のページへ 1|2|3|4       

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プロジェクトで作成するのが簡単なのでやってみましょう。

  1. STSのメニューで[File]→[New]→[Maven project]をクリック
  2. New Maven Projectダイアログで[Next]をクリック
  3. [Group Id]が「org.apache.maven.archetypes」かつ[Artifact Id]が「maven-archetype-webapp」の行をクリックしてから[Next]をクリック
  4. [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ファイルを生成します。

  1. hello-sampleプロジェクトを右クリック
  2. 表示されるメニューから[Run]→[Maven build]をクリック
  3. 表示されるダイアログの[Goals]に「package」と入力
  4. [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」という文字が表示されることが分かります。

図6 http://hello-sample-user001-org.cfapps.ioの実行結果

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プログラムを作って動作させてみましょう。

  1. STSのメニューで[File]→[New]→[Maven project]をクリック
  2. New Maven Projectダイアログで[Next]をクリック
  3. [Group Id]が「org.apache.maven.archetypes」かつ[Artifact Id]が「maven-archetype-quickstart」の行をクリックしてから[Next]をクリック
  4. [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の時代を感じませんか。皆さんもいろいろと調べて楽しんでみてください。

前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。