はじめに
クラウドコンピューティングは今や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プラットフォームに応じて、シェルスクリプトまたはバッチファイルを使用してください。コードを生成するときは、コード生成ツールにいくつかのオプションを渡すことができますが、ここではすべてのオプションについては説明しません。コードを生成するには次のコマンドを実行します。
./wsdl2java.sh -uri http://ec2.amazonaws.com/doc/2009-03-01/AmazonEC2.wsdl -o out
wsdl2java.bat -uri http://ec2.amazonaws.com/doc/2009-03-01/AmazonEC2.wsdl -o out
「out
」という名前のディレクトリがbin
ディレクトリの内部に作成され、その中にコードが作成されます。out
ディレクトリを見てみると、大きいファイルが作成されていることが分かります。このファイルを開いたり、読んだりしないでください。このファイルは読むには複雑すぎますし、そもそも読んだり編集したりする必要はありません。この1つのクラスの中に、シリアル化とシリアル化解除およびサービス呼び出しのコードがすべて入っています。
次に、他のコード生成パラメータを使用して、別の方法でコードを生成してみます。何をするかと言うと、データバインディング(シリアル化とシリアル化解除)のコードを別のクラスとして生成します。そのためには次のコマンドを実行します。違いに注意してください。
./wsdl2java.sh -uri http://ec2.amazonaws.com/doc/2009-03-01/AmazonEC2.wsdl -o out_unpack -u
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); } } }
セキュリティハンドラと他のセキュリティ関連コードの作成が済めば、スタブを呼び出すコードを作成するための準備は完了です。