クラウド仮想マシンの開発および管理を自動化する

Apache Maven を使用して IBM SmartCloud Enterprise のビルドとデプロイメントを自動化する方法を学ぶ

最近の傾向として、クラウド・アプリケーションおよびサービスの開発と運用との間には強力な連携が築かれるようになっています。具体的には、この傾向はアプリケーション・ライフサイクル・マネジメント (ALM) ツールとクラウド・コンピューティングをより緊密かつ効率的に統合する方向へと向かっています。この記事では、オープンソースの Apache Maven ビルド管理ツールを使用して、IBM SmartCloud Enterprise でのプロジェクトのビルドとデプロイメントを自動化する方法を紹介します。また、ビルドおよびデプロイメントのライフサイクルにクラウド上の仮想マシンの管理を統合する方法として、クラウドで J2EE アプリケーション・サーバーを実行する仮想マシンを検索し、見つからない場合には新しく仮想マシン作成する Apache Maven プラグインを開発します。さらに、クラウドでの開発およびデプロイメントのベスト・プラクティスを紹介し、これらのベスト・プラクティスを IBM Cloud API と Maven を使用して実装する方法を説明します。

Alex Amies (aamies@cn.ibm.com), Senior Software Engineer, IBM

Alex Amies photoAlex Amies は、中国の IBM GTS Development Lab に勤務するシニア・ソフトウェア・エンジニアです。彼は現在、アーキテクトとして IBM Smart Business Development and Test on the IBM Cloud の設計に携わっています。以前は、IBM 内の他のグループでクラウドおよびエキュリティー製品のアーキテクト、開発者として活躍していました。



Pan Xia Zou, Staff Software Engineer, IBM

Pan Xia Zou は、Staff Software Engineer です。現在、IBM SmartCloud Enterprise のビルドおよびデプロイメント自動化アーキテクトとして働いています。



Yi Shuai Wang, Advisory Architect, IBM

Yi Shuai Wang は、IBM の顧問アーキテクトであり、IBM SmartCloud Enterprise のビジネス・サポート・サービスの開発リーダーを務めています。



2011年 11月 25日

ビルドおよびデプロイメントの自動化は、あらゆる開発プロジェクトを円滑に進める上で重要です。その重要性は、プロジェクトが大きくなるにつれて、さらに増してきます。アプリケーション・ライフサイクル管理 (ALM) ツールでの最近の傾向として、開発と運用との間により強力な連携が築かれるようになっています。具体的には、ALM ツールとクラウドとの統合です。

物理リソースと比べてクラウドのリソースが優れている点として、クラウドの利用者は API を利用してオンデマンドでクラウドのリソースを作成できることが挙げられます。クラウド上では ALM ツールを実行することができます。逆に ALM ツールが何らかの方法でクラウドを利用することもできます。さらに、クラウド向けのアプリケーションを開発するために ALM ツールを使用することもできます。

IBM Rational Application Developer とこれに統合された開発ツールは、コードを開発するには理想的な環境です。ローカル・ビルドとユニット・テストを行うにも最適ですが、複数のメンバーからなるチームでアプリケーションを開発する場合には、再現可能なビルド・プロセスを作成することが重要になってきます。

ビルドおよびデプロイメントのライフサイクルには、以下をはじめとする多数のタスクが含まれるのが通常です。

  • コンパイル
  • パッケージ化
  • 検証
  • ユニット・テスト
  • ミドルウェア構成
  • デプロイメント

クラウド・コンピューティングでは、ソフトウェアがプリインストールされた仮想マシンを作成することによって、デプロイメントの自動化をさらに一歩進めることができます。

ビルドおよびデプロイメントを自動化できるオープンソースおよび商用のビルド・ツールは、例えば Ant、Maven、IBM Build Forge をはじめ多数あります。そのなかから、この記事ではオープソースのツールである Apache Maven に着目します。Apache Maven は、記事で焦点を当てるビルドおよびデプロイメントのフェーズを定義しているだけなく、拡張可能なフレームワークにもなります。さらに、Apache Maven には数々のベスト・プラクティスに対応するパターン、そしてさまざまなビルド・タスクに役立つプラグインも用意されています。

サンプル J2EE プロジェクト

IBM SmartCloud Enterprise のカタログには、IBM WebSphere Application Server 7.0 のインスタンスが含まれています。このインスタンスを使用すれば、ソフトウェアを一切インストールすることなく J2EE 環境を使用できるだけでなく、WebSphere Application Server が提供する、他の J2EE 環境にはない機能も利用することができます。

サーバーとして WebSphere Application Server を要求すると、WebSphere Application Server 管理コンソール用のユーザー名とパスワードの入力が促されます。ここで入力したユーザー名とパスワードは後で必要になるので、書き留めておいてください。また、以下の図に示されているように、プロファイルを選択する必要もあります。

図 1. WebSphere イメージ・プロビジョニング・ウィザードの追加パラメーター画面
WebSphere イメージ・プロビジョニング・ウィザードの追加パラメーター画面

WebSphere プロファイルは、ランタイム環境を定義しますが、定義する対象には、サーバーが構成情報を決定して保管する際に処理されるすべてのファイルが含まれます。プロファイルには、「Development profile (開発プロファイル)」を選択してください。開発プロファイルを選択すると、後で説明する IBM Rational Software Architect を使って WebSphere Application Server を管理しやすくなります。

プロビジョニングされたインスタンスの起動が完了すると、ほどなくして WebSphere Application Server が起動されます。管理コンソールを表示するには、URL https://host:9043/ibm/console/logon.jsp にアクセスします。

WebSphere Application Server の管理は、サーバー自体を起動または停止する場合を除き、すべて Web 管理コンソールから行うことができます。WebSphere Application Server 内で実行可能な J2EE アプリケーションを作成するには、IBM Rational Application Developer、Eclipse、またはその他多くの IDE を使用することができます。Eclipse を使用する場合は、J2EE 開発者用ツールとしても知られる J2EE Standard Tools を使用してください。あるいは、IBM Cloud カタログに含まれる IBM Rational Application Developer イメージを使用して、事前ビルドされた環境を利用することもできます。

試しに、Rational Application Developer または Rational Software Architect で J2EE アプリケーションを作成してみます。まず、Eclipse の「EAR Application Project (EAR アプリケーション・プロジェクト)」ウィザードを使用して、新しいエンタープライズ・アプリケーションの作成を始めます。

図 2. Eclipse の EAR アプリケーション・プロジェクト・ウィザード
Eclipse の EAR アプリケーション・プロジェクト・ウィザード

プロジェクトには CloudAPIClientEAR という名前を付け、上図のとおりに指定して「Finish (完了)」ボタンをクリックします。次に、動的 Web プロジェクトを作成します。この動的 Web プロジェクトには CloudAPIClientWeb という名前を付け、下図のように指定して CloudAPIClientEAR プロジェクトに追加します。

図 3. Eclipse の動的 Web プロジェクト・ウィザード
Eclipse の動的 Web プロジェクト・ウィザード

今度は、このアプリケーションをテストするための HTML ファイルとサーブレットを作成します。Web コンテンツ・ディレクトリーに index.html という名前のファイルを追加し、このファイルに一例として「My web application」というテキストを含めます。さらに、以下の TestServlet クラスのコードからなるサーブレットを追加します。

リスト 1. サーブレットの追加
package com.ibm.cloud.examples.servlet;

import java.io.IOException;
import java.io.Writer;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TestServlet
 */
public class TestServlet extends HttpServlet {
     private static final long serialVersionUID = 1L;

     protected void doGet(HttpServletRequest request, HttpServletResponse response) 
       throws ServletException, IOException {
          Writer writer = response.getWriter();
          writer.write("My web application");
     }
}

Rational Software Architect または Eclipse を使用している場合には、Web アプリケーションのアーカイブ・ファイルである web.xml がすでに自動的に構成されているはずです。そうでない場合は、アーカイブ・ファイルを以下のような内容にします。

リスト 2. Web アプリケーション・アーカイブ・ファイルの内容
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.5" 
 xmlns="http://java.sun.com/xml/ns/javaee" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
     <display-name>CloudAPIClientWeb</display-name>
     <servlet>
          <display-name>TestServlet</display-name>
          <servlet-name>TestServlet</servlet-name>
          <servlet-class>com.ibm.cloud.examples.servlet.TestServlet</servlet-class>
     </servlet>
     <servlet-mapping>
          <servlet-name>TestServlet</servlet-name>
          <url-pattern>/TestServlet</url-pattern>
     </servlet-mapping>
     <welcome-file-list>
          <welcome-file>index.html</welcome-file>
     </welcome-file-list>
</web-app>

次に、このファイルをエクスポートします。それには EAR プロジェクトを右クリックして「Export to EAR (EAR にエクスポート)」を選択します。ファイル名には CloudAPIClientEAR.ear を指定します。

図 4. Rational Software Architect の EAR エクスポート・ウィザード
Rational Software Architect の EAR エクスポート・ウィザード

以下の手順に従って、エンタープライズ・アプリケーションの EAR ファイルを追加します。

  1. ブラウザーで WebSphere 管理コンソールにアクセスします。
  2. 「Applications (アプリケーション)」 > 「New Application (新規アプリケーション)」 > 「New Enterprise Application (新規エンタープライズ・アプリケーション)」の順にナビゲートし、「Upload from Local file system (ローカル・ファイル・システムからアップロード)」を選択します。EAR ファイルをアップロードして、「Next (次へ)」をクリックします。
  3. Fast Path (ファスト・パス)」オプションを選択します。
  4. アプリケーションをインストールする任意のディレクトリーを選択します。
  5. 「Map Modules to Servers (モジュールからサーバーへのマップ)」パネルで、「CloudAPIClientWeb」を選択します。
  6. 変更内容を保存します。
  7. 「Applications (アプリケーション)」 > 「Applications Types (アプリケーション・タイプ)」 > 「WebSphere enterprise applications (WebSphere エンタープライズ・アプリケーション)」に進みます。アプリケーションを起動します。

URL http://host:9080/CloudAPIClientWeb/ にナビゲートして、HTML ページを表示します。この HTML ページには、前の手順でページに追加した「My web application」というテキストが表示されるはずです。サーブレットを確認するには、URL として「http://host:9080/CloudAPIClientWeb/TestServlet」を入力します。すると、TestServlet コードの Writer から出力されたテキストが表示されます。

このようなデプロイメント方法を何度も繰り返し行うとしたら面倒です。そこで、デプロイメントにかかる時間を大幅に節約するために使用できるのが、Eclipse または IBM Rational Application Developer のリモート・デプロイメント機能です。リモート・デプロイメント機能は、J2EE アプリケーションを自動的にサーバーにパブリッシュするため、WebSphere 管理コンソールのすべての画面の指示に従う必要はありません。「New Server (新規サーバー)」ウィザードで、ホスト名 (または IP アドレス)、管理ユーザー ID、パスワードを指定すれば、リモート・サーバーを追加することができます。

次のセクションでは、ビルドの自動化を促進するために、Apache Maven をセットアップして使用する方法を説明します。


Maven によるビルドの自動化

Apache Maven をセットアップするには、このプロジェクトの Web サイトから Maven をダウンロードし、環境変数を以下のように定義します。

リスト 3. Maven の環境変数の定義
set M2_HOME=D:\opt\apache-maven-3.0.3
set JAVA_HOME=D:\Program Files\IBM\SDP\jdk
set PATH=%JAVA_HOME%;%PATH%;%M2_HOME%\bin

Linux の場合に行うタスクも、これと同様です。以下のコマンドを実行して、Maven が使用可能であることを確認します。

リスト 4. Maven が使用可能であることを確認するためのコマンド
>mvn --version
Apache Maven 3.0.3 (r1075438; 2011-03-01 01:31:09+0800)
Maven home: D:\opt\apache-maven-3.0.3
Java version: 1.6.0, vendor: IBM Corporation
Java home: D:\Program Files\IBM\SDP\jdk\jre
Default locale: en_US, platform encoding: GB18030
OS name: "windows xp", version: "5.1 build 2600 service pack 3", 
 arch: "x86", family: "windows"

リスト 4 には、このコマンドを実行した後に表示される情報も示されています。

Maven には、アーキタイプ (archetype) と呼ばれるプロジェクトのテンプレートがあり、アーキタイプには標準のプロジェクト構造が組み込まれています。このアーキタイプを利用すると、プロジェクトを生成することができます。このことは知っておくと便利です。前のセクションで、独自のプロジェクトを IDE で作成して、Web アプリケーションとエンタープライズ・アプリケーションを作成するところまでは完了しています。これから、Maven でこのプロジェクトに取り組む方法をたどりながら、Maven についてもう少し詳しく説明します。

Maven では、依存関係 (JAR にパッケージ化された Java ライブラリーなど) に少なくとも groupIdartifactId、version、および scope を組み込みます。依存関係を処理するために、Maven はローカル・リポジトリーを調べます。ローカル・リポジトリーに依存関係が存在しない場合には、その依存関係を外部リポジトリーからローカル・リポジトリーにダウンロードします。デフォルトの外部リポジトリーは、http://repo1.maven.org/maven2/ に設定されていますが、独自のリモート・リポジトリーを設定することもできます。その場合、クラウドはリポジトリーを設定する絶好の場所になるはずです。

例えば、サード・パーティー JAR ファイルへの依存関係がある場合、その依存関係を pom.xml に追加するには以下のようなスタンザを使用します。

リスト 5. サード・パーティー JAR ファイルへの依存関係を指定するために pom.xml に追加するスタンザ
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.12</version>
  <scope>compile</scope>
</dependency>

上記の例は、log4j ライブラリーへの依存関係を示しています。

ライセンス上の理由により、J2EE および関連するライブラリーは自動的に使用可能にはならないので、該当する Web サイトにアクセスし、使用条件に同意した上で JAR ファイルをダウンロードする必要があります。JAR ファイルをダウンロードしたら、以下のコマンドを実行します。

リスト 6. サード・パーティーの依存関係のインストール
> mvn install:install-file -Dfile=/opt/apache-tomcat70/lib/servlet-api.jar 
  -DgroupId=javax -DartifactId=servlet-api -Dversion=3.0 -Dpackaging=jar

上記の例でインストールしているのは、J2EE Web プロジェクトをコンパイルするために必要なサーブレット API です。標準のプロジェクト構造を持つ Web アプリケーションを作成するには、以下のコマンドを実行します。

リスト 7. 標準タイプのプロジェクト構造を持つ Web アプリケーションの作成
> mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes 
  -DarchetypeArtifactId=maven-archetype-webapp 
  -DgroupId=com.iotdata -DartifactId=my-webapp

Maven は、pom.xml ファイルを含むプロジェクト・ツリーを my-webapp ディレクトリーに作成しますが、ここでは代わりに、前のセクションで作成したプロジェクトを使用します。Web アプリケーション・プロジェクトの最上位ディレクトリーに下記の pom.xml ファイルを追加してください。

リスト 8. Web アプリケーション・プロジェクトの最上位ディレクトリーに追加する pom.xml ファイル
<project xmlns="http://maven.apache.org/POM/4.0.0" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.iotdata</groupId>
  <artifactId>CloudAPIClientWeb</artifactId>
  <packaging>war</packaging>
  <version>1.0</version>
  <name>IoT Data Cloud API Client Web</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>javax</groupId>
      <artifactId>servlet-api</artifactId>
      <version>3.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>${pom.artifactId}</finalName>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
          <warSourceDirectory>WebContent</warSourceDirectory>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

パッケージ・タイプが WAR パッケージとなっている点に注意してください。この pom.xml ファイルは、WAR パッケージを作成する Maven WAR プラグインを使用します。サンプル・プロジェクトのディレクトリー構造は標準の構造とは多少異なるため、sourceDirectory タグが追加されています。これは、build 要素のプロパティーです。上記では、前述のサーブレット API への依存関係が使用されています。scopeprovided に設定されているため、Web アプリケーションにはサーブレット API JAR をコピーしません。

これをビルドするには、カレント・ディレクトリーを my-webapp に変更して、以下のコマンドを実行します。

リスト 9. ビルドの開始
> mvn package

コマンドの出力は、target ディレクトリー内の CloudAPIClientWeb.war ファイルで確認することができます。この WAR ファイルをアプリケーション・サーバーにデプロイして、ブラウザーで http://host:8080/CloudAPIClientWeb にアクセスすると、「Hello World!」というテキストを示すページが表示されるはずです。

同じ 1 つの Maven ファイル構造内で複数のプロジェクトを管理するには、複数の pom.xml ファイルを使用します。これが必要になるのは、1 つのエンタープライズ・アプリケーションの中に Web アプリケーションが組み込まれることになる場合です。

CloudAPIClientEAR ディレクトリーと CloudAPIClientWeb ディレクトリーの上位ディレクトリーに、リスト 10 に記載するような pom.xml ファイルを作成します。

リスト 10. 追加のプロジェクトを管理するために作成した、追加の pom.xml ファイル
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.iotdata</groupId>
  <version>1.0</version>
  <artifactId>app</artifactId>
  <packaging>pom</packaging>
  <modules>
    <module>CloudAPIClientWeb</module>
    <module>CloudAPIClientEAR</module>
  </modules>
</project>

上記のファイルは、CloudAPIClientWeb プロジェクトと CloudAPIClientEAR プロジェクトのそれぞれを対象にモジュールを定義しています。

リスト 11 に、CloudAPIClientEAR プロジェクト用に作成した pom.xml ファイルを示します。

リスト 11. CloudAPIClientEAR プロジェクト用に作成した pom.xml ファイル
<project xmlns="http://maven.apache.org/POM/4.0.0" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
       http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.iotdata</groupId>
    <artifactId>app</artifactId>
    <version>1.0</version>
  </parent>
  <groupId>com.iotdata</groupId>
  <artifactId>CloudAPIClientEAR</artifactId>
  <packaging>ear</packaging>
  <version>1.0</version>
  <name>IoT Data Cloud API Client EAR</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
     <groupId>com.iotdata</groupId>
     <artifactId>CloudAPIClientWeb</artifactId>
     <version>1.0</version>
     <type>war</type>
    </dependency>
  </dependencies>
  <build>
    <finalName>${pom.artifactId}</finalName>
    <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-ear-plugin</artifactId>
       <version>2.4</version>
       <configuration>
         <earSourceDirectory>
          ${basedir}
         </earSourceDirectory>
         <modules>
           <webModule>
            <groupId>com.iotdata</groupId>
            <artifactId>CloudAPIClientWeb</artifactId>
            <bundleFileName>
              CloudAPIClientWeb.war
            </bundleFileName>
           </webModule>
          </modules>
       </configuration>
      </plugin>
    </plugins>
  </build>
</project>

この pom.xml ファイルは、最上位の pom.xml を参照する親を定義します。これと同様のスタンザは、CloudAPIClientWeb プロジェクトの pom.xml にも追加する必要があります。リスト 11 では、パッケージの値は ear になっており、Maven の ear プラグインを使用します。Web モデルの定義は、前の CloudAPIClientWeb プロジェクトと同じです。

以下のコマンドを実行し、target ディレクトリーの中身を削除してからプロジェクト全体を再ビルドします。

リスト 12. target ディレクトリーの中身の削除とプロジェクト全体の再ビルド
> mvn clean install

CloudAPIClientEAR がビルドされ、CloudAPIClientWeb アプリケーションから war ファイルが組み込まれます。

再現可能なビルドを作成する方法は、以上のとおりです。テスト環境および本番環境では、開発者の IDE でアプリケーション・サーバーに接続することはできないため、ビルドが再現可能であることが重要な点となります。

次のセクションでは、サーバーの作成およびデプロイメントを自動化できるようにするための Maven プラグインを生成する方法を説明します。


サーバーの作成およびデプロイメントを自動化する Maven プラグイン

Maven によるビルドの自動化」のセクションでは、Maven を使用して J2EE アプリケーションをビルドする方法を説明しました。Maven は、プラグイン・メカニズムによって拡張可能なフレームワークです。

このセクションでは、クラウドの仮想マシンを IBM SmartCloud API を使用して検索し、見つからない場合には仮想マシンを作成する Maven プラグインの作成方法を紹介します。

  1. まず、プラグインが仮想マシン・インスタンスを検索します。
  2. 仮想マシン・インスタンスが見つかった場合、その仮想マシンを J2EE アプリケーションのプロビジョニングに使用することができます。
  3. 見つからない場合は、新しい仮想マシンが作成されます。

まず始めに、コマンドラインに以下の内容を入力することで、サンプル Maven プラグイン・プロジェクトを生成します。

リスト 13. Maven プラグイン・プロジェクトの生成
>mvn archetype:generate -DarchetypeArtifactId=maven-archetype-mojo 
 -DgroupId=com.ibm.cloud.enterprise.example 
 -DartifactId=sce-maven-plugin -DinteractiveMode=false

上記のコマンドによって、MOJO (Maven Old Java Object) タイプのプラグイン・プロジェクトのディレクトリー・ツリーが作成されます。

プロジェクトを IDE にインポートし、Maven のコア・ライブラリーとプラグイン・ライブラリーを IDE ビルド・パスに追加します。Maven プラグインは、通常は AbstractMojo クラスを継承して Mojo インターフェースを実装します。SCEMojo クラスとして、以下のソース・コードを追加してください。

リスト 14. SCEMojo クラスのソース・コードの追加
package com.ibm.cloud.enterprise.example;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;

import com.ibm.cloud.api.rest.client.DeveloperCloud;
import com.ibm.cloud.api.rest.client.DeveloperCloudClient;
import com.ibm.cloud.api.rest.client.bean.Address;
import com.ibm.cloud.api.rest.client.bean.Instance;
import com.ibm.cloud.api.rest.client.bean.Volume;
import com.ibm.cloud.api.rest.client.exception.*;

/**
 * @goal create_instance
 */
public class SCEMojo extends AbstractMojo {
     
     private DeveloperCloudClient client = DeveloperCloud.getClient();
     private Log log = getLog();
     
     /**
     * The user name for the cloud account
     * @parameter expression="${create_instance.user_name}"
     */
    private String user_name;
     
     /**
     * The password for the cloud account
     * @parameter expression="${create_instance.password}"
     */
    private String password;
     
     /**
     * The name of the server to lookup or create
     * @parameter expression="${create_instance.name}" default-value="app_server"
     */
    private String name;
     
     /**
     * The data center to create the server in
     * @parameter expression="${create_instance.data_center}"
     */
    private String data_center;
     
    /**
     * The image ID to create the server with
     * @parameter expression="${create_instance.image_id}"
     */
    private String image_id;
    
    /**
     * The name of the SSH key to create the server with
     * @parameter expression="${create_instance.key_name}"
     */
    private String key_name;

    /**
     * The name of the WebSphere administrative user
     * @parameter expression="${create_instance.was_admin_user}"
     */
    private String was_admin_user;
    
     /**
     * The name of the WebSphere administrative user password
     * @parameter expression="${create_instance.was_admin_password}"
     */
    private String was_admin_password;
    
}

上記のコードには、この後の作業で追加するメソッドのインポートがすでに組み込まれています。クラス・レベルの JavaDoc には @goal タグを設定します。これは必須のタグで、ビルドのゴールが create_instance であることを示します。プライベート・フィールドである user_namepasswordnamedata_centerimage_idkey_namewas_admin_user、および was_admin_password は、プラグインのユーザーによって渡されるパラメーターです。これらのパラメーターについて、以下で説明します。

  • user_name: クラウド・アカウントのユーザー名
  • password: クラウド・アカウントのパスワード
  • name: 検索または作成するサーバーの名前 (デフォルト値は "app_server")
  • data_center: サーバーが作成されるデータ・センター
  • image_id: サーバーを作成するために使用するイメージの ID
  • key_name: サーバーを作成するために使用する SSH 鍵の名前
  • was_admin_user: WebSphere 管理ユーザーのユーザー名
  • was_admin_password: WebSphere 管理ユーザーのパスワード

Mojo インターフェースを実装するクラスは execute メソッドを実装する必要があるので、以下の execute メソッドを追加してください。

リスト 15. 追加する execute メソッド
public void execute() throws MojoExecutionException {
     try {
              log.info("Logging onto cloud with user name " + user_name);
              client.setRemoteCredentials(user_name, password);
              log.info("Looking for a server with name " + name);
          List<Instance> instances = client.describeInstances();
              log.info("Found " + instances.size() + " instances");
              boolean found = false;
              for (Instance instance: instances) {
                   if ((instance.getStatus() == Instance.Status.ACTIVE) &&
                        instance.getName().equals(name)) {
                        log.info("Found a server with name " + name);
                        found = true;
                   }
              }
              if (!found) {
                   log.info("No server with name " + name + " found");
                   createInstance();
              }
     } catch (Exception e) {
              log.warn(e);
          throw new MojoExecutionException(e.getMessage());
     }
}

このメソッドは、まずユーザーのクレデンシャルを設定し、それからこのユーザーが所有する仮想マシンのリストを取得します。そして取得した仮想マシンのリストを繰り返し処理し、ユーザーによって提供されたパラメーターと同じ名前を持つアクティブなインスタンスを探します。

一致する仮想マシンが見つかった場合、これでタスクは完了です。見つからなければ、createInstance() メソッドを SCEMojo クラスに追加することによって、仮想マシンを作成します。

リスト 16. VM を作成するために SCEMojo クラスに追加する createInstance()
private void createInstance() throws InsufficientResourcesException, 
              InvalidConfigurationException, PaymentRequiredException, 
              UnauthorizedUserException, UnknownErrorException, IOException {
     Address address = null;
     Volume volume = null;
     Address[] secondaryAddresses = new Address[0];
     Map parameters = new HashMap<String,Object>();
     parameters.put("WASAdminUser", was_admin_user);
     parameters.put("WASAdminPassword", was_admin_password);
     List<Instance> newInstances = client.createInstance(
               name, // Name of instance
               data_center, // Data center ID
               image_id, // Image ID
               "COP32.1/2048/60", // Instance type
               key_name, // Key
               address, // Address
               volume, // Volume
               parameters, // Options
               null, // VLAN ID
               secondaryAddresses, // Seconday IP addresses
               true); // Minimum ephemeral
     Instance instance = newInstances.get(0);
     log.info("ID: " + instance.getID());
}

このメソッドは、ユーザーが提供したパラメーターを使って仮想マシンを作成し、そのインスタンス ID をログに書き込みます。

リスト 17 に示されているように、今度はプラグイン用の pom.xml ファイルを作成します。

リスト 17. プラグイン用に作成する pom.xml ファイル
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
 http://maven.apache.org/xsd/maven-4.0.0.xsd" 
 xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.ibm.cloud.enterprise</groupId>
  <artifactId>sce-maven-plugin</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>maven-plugin</packaging>
  <name>sce-maven-plugin Maven Mojo</name>
  <url>http://ibm.com/cloud/enterprise</url>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-plugin-api</artifactId>
      <version>2.0</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>commons-httpclient</groupId>
      <artifactId>commons-httpclient</artifactId>
      <version>3.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>1.3</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>2.3</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.ibm.cloud.enterprise</groupId>
      <artifactId>DeveloperCloud_API_Client</artifactId>
      <version>1.4.1</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

上記の pom.xml ファイルでは、パッケージ・タイプとして maven-plugin を指定しています。このファイルでは maven-plugin-api への依存関係と、IBM SmartCloud Enterprise Java API およびその従属ライブラリーへの依存関係として、Apache Commons の HttpClient、Logging、Codec、および Lang などへの依存関係を定義します。これらの Apache ライブラリーは、Maven が自動的に Maven 中央リポジトリーからダウンロードしてくれます。

続いて、SmartCloud API ライブラリーをローカル・リポジトリーにダウンロードしてインストールします。

リスト 18. ローカル・リポジトリーへの SmartCloud API ライブラリーのダウンロード
mvn install:install-file -Dfile=/opt/sce/DeveloperCloud_API_Client_1.4.1.jar 
 -DgroupId=com.ibm.cloud.enterprise 
 -DartifactId=DeveloperCloud_API_Client 
 -Dversion=1.4.1 -Dpackaging=jar

インストールされたファイルのパラメーターは、ローカル環境に合わせて調整する必要があります。

次に、プラグインをビルドしてローカル・リポジトリーにインストールします。

リスト 19. プラグインのビルドとローカル・リポジトリーへのインストール
>mvn package
>mvn install

これで、プラグインはプロジェクトに使用できる状態になりました。Maven の generate コマンドを使って、cloud-app プロジェクトを生成してください。

リスト 20. Maven の generate コマンドによるプロジェクトの生成
mvn archetype:generate -DgroupId=com.ibm.cloud.enterprise 
 -DartifactId=cloud-app 
 -DarchetypeArtifactId=maven-archetype-quickstart 
 -DinteractiveMode=false

新しく生成されたプロジェクトを IDE にインポートします。生成された pom.xml に変更を加え、依存関係およびプラグインの構成に関するスタンザを追加します。

リスト 21. 依存関係およびプラグインの構成に関するスタンザを追加した pom.xml
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
 http://maven.apache.org/xsd/maven-4.0.0.xsd" 
 xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.ibm.cloud.enterprise</groupId>
  <artifactId>cloud-app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>cloud-app</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.ibm.cloud.enterprise</groupId>
      <artifactId>sce-maven-plugin</artifactId>
      <version>1.0-SNAPSHOT</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>com.ibm.cloud.enterprise</groupId>
        <artifactId>sce-maven-plugin</artifactId>
        <version>1.0-SNAPSHOT</version>
        <configuration>
          <user_name>a.user@example.com</user_name>
          <password>****</password>
          <name>was</name>
          <data_center>101</data_center>
          <image_id>20015399</image_id>
          <key_name>july26</key_name>
          <was_admin_user>wasadmin</was_admin_user>
          <was_admin_password>***</was_admin_password>
        </configuration>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>create_instance</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

configuration セクション内で使用されているパラメーターに注目してください。

いよいよ、プラグインを試してみます。まずは、インスタンスの有無をチェックします。それには、以下の Maven ゴールを指定してプラグインを呼び出します。

リスト 22. プラグインの呼び出し
>mvn com.ibm.cloud.enterprise:sce-maven-plugin:1.0-SNAPSHOT:create_instance

指定した名前の仮想マシンがまだ存在しない場合、出力は以下のような内容になります。

リスト 23. 指定の名前の仮想マシンが存在しない場合の出力
[info] Logging onto cloud with user name a.user@example.com
[info] Looking for a server with name was
[info] Found 4 instances
[info] No server with name was found
[info] ID: 112332
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] 
...

指定した名前の仮想マシンが存在する場合、出力は以下のような内容になります。

リスト 24. 指定の名前の仮想マシンが存在する場合の出力
...
[INFO] --- sce-maven-plugin:1.0-SNAPSHOT:create_instance (default-cli) @ cloud-a
pp ---
[info] Logging onto cloud with user name aamies@cn.ibm.com
[info] Looking for a server with name was
[info] Found 5 instances
[info] Found a server with name was
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ----------------------------------------------------------------------
...

サーバーを作成するためにリスト 22 のコマンドを実行したばかりである場合、サーバーの作成には時間がかかることを忘れないでください。

ここまで説明してきたプロセスによって、開発およびデプロイメントのライフサイクルにクラウドがいかに適合するかが十分明らかになりましたが、あと少しステップを追加することで、このプロセスをライフサイクルの中でさらに有用なものにすることができます。

前述のとおり、サーバーの作成には時間がかかります。サーバーの作成が完了するのを待機するにはポーリング・メカニズムが必要ですが、それにはさらに別の問題があります。ポーリング・メカニズムによって、アプリケーション・サーバーが稼働状態になったことを判断するわけですが、仮想マシンのプロビジョニングが完了してオペレーティング・システムが起動した後でないと、サーバーは稼働状態になりません。この問題は、WebSphere wasadmin API を使用して解決することができます。この API を使用すれば、WebSphere Application Server が稼働中のアクティブなサーバーを確認できた時点で、WebSphere Application Server に J2EE アプリケーションをデプロイすることができます。WebSphere Application Server が必要なくなったら、削除しても構いません。このステップをライフサイクルのクリーニング・フェーズ、もしくは他のどこかに追加することをお勧めします。


次のステップ

さらに、以下のタスクが必要になることも考えられます。

  • IBM Cloud にプライベートな Maven リポジトリーを作成するタスク: 企業では通常、リリースされていないソフトウェアや、プロプライエタリー・ソフトウェア、購入した商用のソフトウェアなどについては、公開リポジトリーに保管されているリリース済みのオープンソース・ソフトウェアとは別に分けておく必要があるため、このタスクは重要です。プライベートな Maven リポジトリーを作成することで、企業内およびビジネス・パートナーとのソフトウェアの共有が単純化され、ソフトウェアが関係者以外から隔離されることになります。
  • クラウド API プロジェクトのテンプレートを作成するタスク: ベスト・プラクティスを標準化し、重複した作業を取り除くプロジェクト・テンプレートによって、クラウド・プロジェクトを複数作成する場合の作業が単純化されます。

J2EE アプリケーション・サーバーには、パフォーマンスおよび可用性の目標を達成するのに役立つ数々の機能があります。主な機能の 1 つは、アプリケーション・サーバーをクラスタリングして負荷を分散できることです。クラスターは、作業負荷を分散するために 1 つのグループとして機能するアプリケーション・サーバー・ノードまたは個々のアプリケーション・サーバーの集まりです。仮想マシンを動的に作成できるクラウド・コンピューティングでは、仮想マシンがクラスター内のノードとしての役割を果たすことができます。

WebSphere Application Server は、大規模なクラスターを管理するのに最適な J2EE プラットフォームです。WebSphere 管理コンソールで実行できるステップはすべて、wsadmin ツールとコマンドによってスクリプトにすることができます。これには、JMX (Java Management eXtensions) および Jython スクリプトを使用した Java プログラムも含まれます。WebSphere ネットワーク・デプロイメント・モデルについてのこの知識を、イメージの作成およびカスタマイズ方法の知識、そして IBM SmartCloud Enterprise の REST API について学んだ知識と組み合わせれば、WebSphere クラスターの要素のプロビジョニングを自動化することができます。その方法は、以下のとおりです。

  1. 基本 WebSphere Application Server イメージを出発点に、プロファイル管理ツールを使用してプロファイルをカスタマイズし、管理コンソールを使用してアプリケーション・サーバーをカスタマイズします。
  2. 仮想マシンをIBM Cloud のユーザー・インターフェースまたは REST API を使用してインスタンスに保存します。
  3. IBM Cloud REST API を使用して新しい仮想マシンをプロビジョニングします。
  4. wsadmin ツールを使用して、新規仮想マシンをクラスターに参加させ、すべてのノードでアプリケーションのデプロイメント (J2EE アプリケーションのデプロイメントを含む) を同期させます。

まとめ

この記事では、IBM Cloud で使用できるサンプル J2EE プロジェクトを紹介しました。このサンプル・プロジェクトのように、WebSphere Application Server イメージを使用すれば、ソフトウェアを追加でインストールすることなく、J2EE 環境を使用できるようになります。記事では、環境に Apache Maven をセットアップして、ビルドの自動化を導入する手順を概説し、その中で、Maven を使用して J2EE アプリケーションをビルドする方法を説明しました。次に、IBM SmartCloud API を使用してクラウドの仮想マシンを検索、あるいは作成する Maven プラグインの作成方法を紹介しました。最後におまけとして、同様のタスクを行う必要がある場合にそのタスクに取り掛かれるように、IBM Cloud にプライベートな Maven リポジトリーを作成する方法、そしてクラウド API プロジェクト・テンプレートを作成する方法を概説しました。

あとは、読者の皆さんがこの記事で説明した方法を試してみるだけです。

参考文献

学ぶために

製品や技術を入手するために

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cloud computing, Java technology, Open source
ArticleID=775778
ArticleTitle=クラウド仮想マシンの開発および管理を自動化する
publish-date=11252011