japan.internet.com
デベロッパー2009年7月14日 10:00
文字サイズ文字サイズ小文字サイズ中文字サイズ大

Axis2でクラウド用のWebサービスクライアントを作成する

この記事のURLhttp://japan.internet.com/developer/20090714/26.html
著者:Deepal Jayasinghe
海外internet.com発の記事

はじめに

 クラウドコンピューティングは今やIT界の流行語であり、誰もがクラウド用のアプリケーションを開発しています。Amazonのようなクラウドアプリケーションでよく見られるクールな特徴の1つは、クラウド内のインスタンスを構成、実行、監視するためのWebサービスAPIのサポートです。さまざまな理由から、Amazon EC2は最もよく使用される商用クラウドの1つになっているので、今回の記事ではAmazonのようなクラウドアプリケーション用のWebサービスクライアントを作成する方法についてお話しします。他のクラウドアプリケーション用のクライアントの作成もほとんど同じです。ほとんどのクラウドアプリケーションは、同じAPIセットとセキュリティ要件を備えています。

 Axis2は、サービス呼び出しのサーバ側とクライアント側のどちらにも使用できます。これまでの記事で、サーバ側でのAxis2のさまざまな使用方法について説明しました。Axis2のもう1つの重要な側面は、他のWebサービスを呼び出すためのクライアントとして使用する方法です。Axis2を使用してクライアントを作成する方法には、大きく分けて、手作業で作成する方法と、ツールを使用してリモートサービスを呼び出すクライアントスタブを生成する方法の2種類のアプローチがあります。

手作りのクライアントにするか自動生成のクライアントにするか

 第一のアプローチでは、メッセージのシリアル化とシリアル化解除やサービスの呼び出しなど、すべての処理のコードを自分で作成し、いくつかの手順を踏んでサービスを呼び出す必要があります。しかし、最も重要なのは、クライアントを自分で作成すると、コードの効率を最善にできることです。特定の使用状況に合わせて、コードを最適化できます。

 一方、第二のアプローチでは、Axis2ツールを使用してクライアント側スタブを生成し、サービスを呼び出します。この方法を使えば、メッセージのシリアル化とシリアル化解除や、システムの設定や、サービスの呼び出しなどについて思い煩う必要はありません。生成されるコードがすべてを自動的に処理してくれます。つまり、コード生成のアプローチは便利で時間の節約になり、何よりもエラーの数を減らすことができます。

 この記事では、Axis2コード生成ツールを使用してクライアント側コードを生成し、コードをセットアップしてリモートサービスを呼び出す方法を説明します。具体的には、Amazon EC2のクラウドAPIを呼び出すためのAxis2クライアントを作成します。

Axis2のセットアップ

 リモートサービス用のAxis2クライアントスタブを作成する最初のステップは、Axis2のクライアント側のセットアップです。そのためには、Axis2のバイナリディストリビューションをダウンロードする必要があります。Axis2のバイナリディストリビューションはAxis2の公式Webサイトからダウンロードできます。zipファイルをダウンロードして解凍します。これでAmazon EC2 WebサービスAPI用のスタブを生成する準備ができます。EC2のWSDLは、http://ec2.amazonaws.com/doc/2009-03-01/AmazonEC2.wsdlにあります。

 WSDLを使用したことがないと難しそうですが、ありがたいことに、WSDLを理解しなくてもAxis2クライアントは生成できます。これがコード生成ツールを使用することのメリットの1つで、複雑さが軽減されます。ツールがWSDLを処理し、コードを自動的に生成してくれます。さっそく、EC2 WSDL用のクライアントスタブを生成してみましょう。

 最初に、解凍したAxis2ディストリビューションのbinディレクトリに移動します。ここには、シェルスクリプトとWindowsバッチファイルがいくつかあります。OSプラットフォームに応じて、シェルスクリプトまたはバッチファイルを使用してください。コードを生成するときは、コード生成ツールにいくつかのオプションを渡すことができますが、ここではすべてのオプションについては説明しません。コードを生成するには次のコマンドを実行します。

Linuxの場合
./wsdl2java.sh -uri http://ec2.amazonaws.com/doc/2009-03-01/AmazonEC2.wsdl  -o out 
Windowsの場合
wsdl2java.bat -uri http://ec2.amazonaws.com/doc/2009-03-01/AmazonEC2.wsdl  -o out 
 「out」という名前のディレクトリがbinディレクトリの内部に作成され、その中にコードが作成されます。outディレクトリを見てみると、大きいファイルが作成されていることが分かります。このファイルを開いたり、読んだりしないでください。このファイルは読むには複雑すぎますし、そもそも読んだり編集したりする必要はありません。この1つのクラスの中に、シリアル化とシリアル化解除およびサービス呼び出しのコードがすべて入っています。

 次に、他のコード生成パラメータを使用して、別の方法でコードを生成してみます。何をするかと言うと、データバインディング(シリアル化とシリアル化解除)のコードを別のクラスとして生成します。そのためには次のコマンドを実行します。違いに注意してください。

Linuxの場合
./wsdl2java.sh -uri http://ec2.amazonaws.com/doc/2009-03-01/AmazonEC2.wsdl  -o out_unpack -u
Windowsの場合
wsdl2java.bat -uri http://ec2.amazonaws.com/doc/2009-03-01/AmazonEC2.wsdl  -o out_ unpack  -u

オプションの説明

 次に、コードを生成するときに使用するオプションの一部について説明します。

  • -uri:名前が示すように、WSDLドキュメントの場所を指定します。リモートURLでも、ローカルファイルのパスでもかまいません。
  • -o:コードを出力する場所を指定します。Axis2ツールはこの場所にコードを生成します。
  • -u:コードを解凍します。データバインディングのコードとサービス呼び出しのコードが異なるクラスに生成されます。
 これで、Amazon EC2用のクライアント側スタブが生成されました。次に、スタブを使用するコードを作成します。実際には、他のWebサービス用のクライアントの作成とEC2の場合でそれほど大きな違いはないので、スタブの使い方がわかっていれば、簡単に生成されたスタブを使用して目的の処理を行うことができます。

スタブの呼び出し

 先に説明したように、これまでに生成したEC2用のスタブと普通のスタブの使い方は、1つの例外を除いて同じです。違うのは、Amazon EC2の場合はセキュリティを使用する必要があり、そのためにEC2用のセキュリティ要件をセットアップする必要があることです。基本的には、公開鍵と証明書を設定する必要があります。さらに、Axis2でのセキュリティの実装には足りない機能がいくつかあるので、若干の追加コードを作成する必要があります。ただし、記事が分かりにくくなるので、それについてここでは説明しません。必要なライブラリはこの記事の最後の「参考資料」セクションに示してあります。それをダウンロードしてクラスパスに追加すれば、クライアント用のユーティリティを使用できるようになります。

セキュリティハンドラの作成

 Amazon EC2を使用するにはWSセキュリティを使用する必要があり、Axis2でWSセキュリティを使用するにはユーザーー名とパスワードの提供および処理を行う特別なハンドラを作成する必要があります。このハンドラは簡単に作成できます。セキュリティハンドラで使用する必要があるのは、次のようなコードだけです。

import org.apache.ws.security.WSPasswordCallback;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.callback.CallbackHandler;
import java.io.IOException;

public class SecurityHandler implements CallbackHandler {
    public static String password;

        public void handle(Callback[] callbacks) throws IOException,
                UnsupportedCallbackException {
            for (Callback callback : callbacks) {
                WSPasswordCallback pwcb = (WSPasswordCallback) callback;
                pwcb.setPassword(password);
            }
        }

}
 セキュリティハンドラと他のセキュリティ関連コードの作成が済めば、スタブを呼び出すコードを作成するための準備は完了です。

公開鍵と証明書のセットアップ

 クライアント作成の次のステップは、公開鍵と証明書のセットアップです。そのためには、まずEC2アカウントが必要です。持っていない場合は、アカウントを作成し、EC2ツールを使用して公開鍵と証明書を生成します。これら2つの鍵の作成については、最後の「参考資料」セクションを参照ください。

クライアントの作成

 くどいようですが、Amazon EC2を使用するにはWSセキュリティを使用する必要があり、クライアントに必要なセキュリティをセットアップする必要があります。そのために行わなければならない重要なことの1つは、必要なモジュールをクラスパスに追加することです。この例では、Axis2のセキュリティモジュールをクラスパスに置く必要があります。そうしないと、これから作成するコードは動きません。そこで、Axis2のセキュリティモジュール(Apache Rampart)をダウンロードして、それをクラスパスに配置します。

 スタブのインスタンスを作成するにはいくつかの方法があり、どれを使用しても呼び出しに対する直接的な影響はありません。ここでは、次に示すように、クライアントのコンストラクタの内部で、スタブのインスタンスを作成します。

ConfigurationContext configCtx = 
       ConfigurationContextFactory.createConfigurationContextFromFileSystem(null, null);

Create an instance of the stub.

              stub = new AmazonEC2Stub(configCtx);
 最初に構成コンテキストを作成します。大抵の場合、これは必要ありません。ただし、状況によってはAxis2のカスタム構成ファイルと独自のリポジトリを使用してConfigurationContextを作成する必要があり、その場合にはこのステップが必要です。

 次に、必要なパラメータを初期化します。例えば、キーストアに格納したり、セキュリティハンドラを設定したりします。必要なコードを次に示します。前に説明したように、この処理には付属するutils.jarを使用します。このライブラリファイルには、必要なメソッドとクラスがすべて含まれています。

ec2PrivateKey = EC2Utils.pem2der(ec2PrivateKey);
ec2Cert = EC2Utils.pem2der(ec2Cert);
File jks = new File(EC2_JKS);
if (jks.exists()) {
     jks.delete();
}
SecurityHandler.password = EC2_KS_PASSWORD;
EC2Utils.doImport(EC2_JKS, ec2PrivateKey, ec2Cert, EC2_USER, EC2_KS_PASSWORD);
 クライアントのセットアップに必要なことはすべて済んだので、Amazon EC2を呼び出すコードの作成に取り掛かりましょう。スタブの中の1つのメソッド(RunInstances)についてだけ説明します。1つのメソッドの使い方が分かれば、他のメソッドも同様の手順で使用できます。

 Amazonには複数のインスタンスタイプがあるので、それに対応するためのコードを作成する必要があります。次に示すコードがそれです。

if (instanceType == null) {
    instanceType = InstanceType.SMALL;
}
 EC2でインスタンスを開始するには、必要な要求パラメータを渡す必要があります。次に示すコードセグメントでは、この処理を行っています。コードは非常に簡単なので、逐一説明するほどのこともありません。

RunInstances req = new RunInstances();
RunInstancesType params = new RunInstancesType();
params.setInstanceType(instanceType.getType());
params.setImageId(amiID);
params.setKeyName(keyName);
params.setMaxCount(numberOfInstances);
params.setMinCount(numberOfInstances);

if (groupName == null) {
    groupName = "default";
}
GroupSetType gst = new GroupSetType();
GroupItemType git = new GroupItemType();
git.setGroupId(groupName);
gst.setItem(new GroupItemType[]{git});
params.setGroupSet(gst);

req.setRunInstances(params);
 呼び出しごとにセキュリティパラメータを構成する必要があり、次に示すのがそのコードです。このコードでは、メソッドの正しいセキュリティポリシーをセットアップしています。

enableSecurity("RunInstances");
 必要なものはすべてそろったので、サービスを呼び出しましょう。サービスを呼び出すには次のようなコードを使います。

RunInstancesResponse respone = stub.RunInstances(req);
 そして応答を処理します。

RunInstancesResponseType resType = respone.getRunInstancesResponse();
RunningInstancesSetType instances = resType.getInstancesSet();
RunningInstancesItemType[] items = instances.getItem();
ArrayList instanceIds = new ArrayList();
for (int i = 0; i < items.length; i++) {
    RunningInstancesItemType item = items[i];
    instanceIds.add(item.getInstanceId());
    System.out.println("InstanceID " + item.getInstanceId());
}
 RunInstancesを呼び出す完全なクライアントについては、下記の「参考資料」セクションを参照ください。このコードを実行すると、EC2のインスタンスが自動的に開始します。前に説明したように、Amazon EC2のアカウントを作成し、さらに鍵ファイルとAmazon Machine Image(AMI)を作成する必要があります。これらがない場合は、この記事の説明に従って進めるのは難しいかもしれません。ただし、考え方は同じなので、他のサービスを呼び出す場合も同じ手順を使用できます。

 クライアントを実行するには、公開鍵の場所、証明書の場所、そしてAMIの名前を渡す必要があります。下記の「参考資料」セクションでサンプルのクライアントを紹介しているので、それを編集して実行してください。

まとめ

 この記事では、Axis2ツールを使用してクライアント側コードを生成し、生成されたクライアントを使用してサービスを呼び出す方法を説明しました。近頃最もよく使用されているクラウドAPIの1つはAmazon EC2なので、サービスの生成と呼び出しにはAmazon EC2のWSDLを使用しました。さらに、Axis2のクライアント側セキュリティと、その使用方法を説明しました。クライアントを完成させれば、スタブの他のメソッドを使用できます。

参考資料

  1. utils.jar
  2. AWSClient.java
  3. SecurityHandler.java
  4. Amazon Elastic Compute Cloud

著者紹介

Deepal Jayasinghe(Deepal Jayasinghe)
japan.internet.comのウエブサイトの内容は全て、国際法、日本国内法の定める著作権法並びに商標法の規定によって保護されており、その知的財産権、著作権、商標の所有者はインターネットコム株式会社、インターネットコム株式会社の関連会社または第三者にあたる権利者となっています。
本サイトの全てのコンテンツ、テキスト、グラフィック、写真、表、グラフ、音声、動画などに関して、その一部または全部を、japan.internet.comの許諾なしに、変更、複製、再出版、アップロード、掲示、転送、配布、さらには、社内LAN、メーリングリストなどにおいて共有することはできません。
ただし、コンテンツの著作権又は所有権情報を変更あるいは削除せず、利用者自身の個人的かつ非商業的な利用目的に限ってのみ、本サイトのコンテンツをプリント、ダウンロードすることは認められています。

Copyright 2012 internet.com K.K. (Japan) All Rights Reserved.