ビルドおよびデプロイメントの自動化は、あらゆる開発プロジェクトを円滑に進める上で重要です。その重要性は、プロジェクトが大きくなるにつれて、さらに増してきます。アプリケーション・ライフサイクル管理 (ALM) ツールでの最近の傾向として、開発と運用との間により強力な連携が築かれるようになっています。具体的には、ALM ツールとクラウドとの統合です。
物理リソースと比べてクラウドのリソースが優れている点として、クラウドの利用者は API を利用してオンデマンドでクラウドのリソースを作成できることが挙げられます。クラウド上では ALM ツールを実行することができます。逆に ALM ツールが何らかの方法でクラウドを利用することもできます。さらに、クラウド向けのアプリケーションを開発するために ALM ツールを使用することもできます。
IBM Rational Application Developer とこれに統合された開発ツールは、コードを開発するには理想的な環境です。ローカル・ビルドとユニット・テストを行うにも最適ですが、複数のメンバーからなるチームでアプリケーションを開発する場合には、再現可能なビルド・プロセスを作成することが重要になってきます。
ビルドおよびデプロイメントのライフサイクルには、以下をはじめとする多数のタスクが含まれるのが通常です。
- コンパイル
- パッケージ化
- 検証
- ユニット・テスト
- ミドルウェア構成
- デプロイメント
クラウド・コンピューティングでは、ソフトウェアがプリインストールされた仮想マシンを作成することによって、デプロイメントの自動化をさらに一歩進めることができます。
ビルドおよびデプロイメントを自動化できるオープンソースおよび商用のビルド・ツールは、例えば Ant、Maven、IBM Build Forge をはじめ多数あります。そのなかから、この記事ではオープソースのツールである Apache Maven に着目します。Apache Maven は、記事で焦点を当てるビルドおよびデプロイメントのフェーズを定義しているだけなく、拡張可能なフレームワークにもなります。さらに、Apache Maven には数々のベスト・プラクティスに対応するパターン、そしてさまざまなビルド・タスクに役立つプラグインも用意されています。
IBM SmartCloud Enterprise のカタログには、IBM WebSphere Application Server 7.0 のインスタンスが含まれています。このインスタンスを使用すれば、ソフトウェアを一切インストールすることなく J2EE 環境を使用できるだけでなく、WebSphere Application Server が提供する、他の J2EE 環境にはない機能も利用することができます。
サーバーとして WebSphere Application Server を要求すると、WebSphere Application Server 管理コンソール用のユーザー名とパスワードの入力が促されます。ここで入力したユーザー名とパスワードは後で必要になるので、書き留めておいてください。また、以下の図に示されているように、プロファイルを選択する必要もあります。
図 1. 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 アプリケーション・プロジェクト・ウィザード
プロジェクトには CloudAPIClientEAR という名前を付け、上図のとおりに指定して「Finish (完了)」ボタンをクリックします。次に、動的 Web プロジェクトを作成します。この動的 Web プロジェクトには CloudAPIClientWeb という名前を付け、下図のように指定して CloudAPIClientEAR プロジェクトに追加します。
図 3. 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 エクスポート・ウィザード
以下の手順に従って、エンタープライズ・アプリケーションの EAR ファイルを追加します。
- ブラウザーで WebSphere 管理コンソールにアクセスします。
- 「Applications (アプリケーション)」 > 「New Application (新規アプリケーション)」 > 「New Enterprise Application (新規エンタープライズ・アプリケーション)」の順にナビゲートし、「Upload from Local file system (ローカル・ファイル・システムからアップロード)」を選択します。EAR ファイルをアップロードして、「Next (次へ)」をクリックします。
- 「Fast Path (ファスト・パス)」オプションを選択します。
- アプリケーションをインストールする任意のディレクトリーを選択します。
- 「Map Modules to Servers (モジュールからサーバーへのマップ)」パネルで、「CloudAPIClientWeb」を選択します。
- 変更内容を保存します。
- 「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 をセットアップして使用する方法を説明します。
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 ライブラリーなど) に少なくとも
groupId、artifactId、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 への依存関係が使用されています。scope は
provided に設定されているため、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 プラグインの作成方法を紹介します。
- まず、プラグインが仮想マシン・インスタンスを検索します。
- 仮想マシン・インスタンスが見つかった場合、その仮想マシンを J2EE アプリケーションのプロビジョニングに使用することができます。
- 見つからない場合は、新しい仮想マシンが作成されます。
まず始めに、コマンドラインに以下の内容を入力することで、サンプル 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_name、password、name、data_center、image_id、key_name、was_admin_user、および was_admin_password は、プラグインのユーザーによって渡されるパラメーターです。これらのパラメーターについて、以下で説明します。
user_name: クラウド・アカウントのユーザー名password: クラウド・アカウントのパスワードname: 検索または作成するサーバーの名前 (デフォルト値は "app_server")data_center: サーバーが作成されるデータ・センターimage_id: サーバーを作成するために使用するイメージの IDkey_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 クラスターの要素のプロビジョニングを自動化することができます。その方法は、以下のとおりです。
- 基本 WebSphere Application Server イメージを出発点に、プロファイル管理ツールを使用してプロファイルをカスタマイズし、管理コンソールを使用してアプリケーション・サーバーをカスタマイズします。
- 仮想マシンをIBM Cloud のユーザー・インターフェースまたは REST API を使用してインスタンスに保存します。
- IBM Cloud REST API を使用して新しい仮想マシンをプロビジョニングします。
- wsadmin ツールを使用して、新規仮想マシンをクラスターに参加させ、すべてのノードでアプリケーションのデプロイメント (J2EE アプリケーションのデプロイメントを含む) を同期させます。
この記事では、IBM Cloud で使用できるサンプル J2EE プロジェクトを紹介しました。このサンプル・プロジェクトのように、WebSphere Application Server イメージを使用すれば、ソフトウェアを追加でインストールすることなく、J2EE 環境を使用できるようになります。記事では、環境に Apache Maven をセットアップして、ビルドの自動化を導入する手順を概説し、その中で、Maven を使用して J2EE アプリケーションをビルドする方法を説明しました。次に、IBM SmartCloud API を使用してクラウドの仮想マシンを検索、あるいは作成する Maven プラグインの作成方法を紹介しました。最後におまけとして、同様のタスクを行う必要がある場合にそのタスクに取り掛かれるように、IBM Cloud にプライベートな Maven リポジトリーを作成する方法、そしてクラウド API プロジェクト・テンプレートを作成する方法を概説しました。
あとは、読者の皆さんがこの記事で説明した方法を試してみるだけです。
学ぶために
- プロジェクト・オブジェクト・モデル
(POM) の概念をベースとしたソフトウェア・プロジェクト総合管理ツール、Apache Maven にアクセスしてください。Maven
は、主要な情報からプロジェクトのビルド、レポート作成、文書化を管理できます。
- developerWorks には Maven ライブラリーに関する優れた記事が揃っています。
- 「Introduction to Apache Maven 2」
- 「Eclipse で Maven を生かす」
- 「今まで知らなかった 5 つの事項: Apache Maven」
- 「When Maven encounters Eclipse」
- IBM Cloud でさまざまなタスクを実行する方法を学ぶために、以下のリソースをご覧ください。
- 「IBM Cloud リリース 1.2 を使うためのヒント: Windows インスタンスとの間でのファイルのアップロードとダウンロード」
- 「IBM Cloud リリース 1.2 を使うためのヒント: Windows Server 2008 R2 に IIS Web サーバーをインストールする」
- 「Linux のコマンド・ラインを使用して IBM Cloud にインスタンスを作成する」
- 「Create an IBM Cloud instance with the Windows command line」
- 「Extend your corporate network with the IBM Cloud」
- 「IBM Cloud での高可用性アプリケーション」
- 「カスタム・インスタンスのクラウド・イメージをオンザフライでパラメーター化する」
- 「Windows-targeted approaches to IBM Cloud provisioning」
- 「IBM SmartCloud Enterprise についてのヒント: Rapid Deployment Service を使用して製品をデプロイする」
- 「IBM SmartCloud Enterprise tip: Integrate your authentication policy using a proxy」
- 「IBM SmartCloud Enterprise についてのヒント: Linux Logical Volume Manager を構成する」
- 「IBM SmartCloud Enterprise についてのヒント: 複雑なトポロジーをデプロイする: IBM Cloud でデプロイメント・ユーティリティー・ツールを使用する」
- 「IBM SmartCloud Enterprise についてのヒント: 別々の VLAN にまたがる: パブリック VLAN とプライベート VLAN にまたがるインスタンスをプロビジョニングし、構成する」
- 「IBM SmartCloud Enterprise についてのヒント: Android 機器からセキュアにアクセスする」
- developerWorks
のクラウド開発者向けリソースで、クラウド開発プロジェクトを作成しているアプリケーションおよびサービス開発者たちの知識と経験を調べて共有してください。
- IBM SmartCloud
Enterprise にアクセスする方法を調べてください。
製品や技術を入手するために
- 無料の
IBM SmartCloud Enterprise 試用版にサインアップしてください。この試用版にサインアップできるのは 2011年 10月
28日までです。試用期間は 2011年 11月で終了します。このオファーの有効期限が過ぎていたら、IBM Cloud
にアクセスして他のオファーを調べてください。
- IBM SmartCloud Enterprise
に用意された製品イメージを調べてください。
議論するために
- developerWorks
のクラウド・コンピューティング・グループの一員になってください。
- developerWorks でクラウドに関する優れたブログのすべてを読んでください。
- 専門家のネットワークであるとともに、互いにつながりを持ち、共有、協力するためのコミュニティー・ツールが集められている
developerWorks
コミュニティーに加わってください。

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