Java 開発 2.0: EC2 も借りられます

柔軟性と低コストの両方を兼ね備えた、効率的でスケーラブルなレンタル・インフラストラクチャー

連載「Java 開発 2.0」の今回の記事では、Andrew Glover が Amazon EC2 (Elastic Compute Cloud) 用にアプリケーションを開発してデプロイする方法を実際の手順に沿って紹介します。EC2 と Google App Engine との違いを学び、Eclipse プラグインと簡潔な Groovy 言語を利用して、単純な Web アプリケーションを EC2 で素早く稼働させる方法を学んでください。

Andrew Glover, Author and developer

Andrew GloverAndrew Glover は、ビヘイビア駆動開発、継続的インテグレーション、アジャイル・ソフトウェア開発に情熱を持つ開発者であるとともに、著者、講演者、起業家でもあります。詳細は彼のブログにアクセスしてください。



2009年 9月 29日

Standish Group の Chaos Report については、皆さんも耳にしたことがあるでしょう。これは、IT プロジェクトの成功と失敗について総体的に調査する年間レポートです。このレポートには大抵、悪いニュースが溢れています (明るいニュースばかりだとしたら、「Chaos Report」とは呼ばれていません)。2009年のレポートでは、全 IT プロジェクトの 44 パーセントが不調であったと報告しています。その理由はさまざまですが、理由の 1 つとして挙げられているのは、個々のプロジェクトでの予算オーバーです。プロジェクトが予算を超過してしまう理由は簡単に想像がつきます。例えばプログラマーの人件費は安くありません。さらに思い付くのは、インフラストラクチャーのコストです。

連載第 1 回目の記事 (「Google App Engine よ、こんにちは」) で説明したように、Java™ 開発 2.0 の重要な側面は、ソフトウェア製作会社は今や、コストの高い社内インフラストラクチャーを維持する以外の方法を選択できることです。数年前、賢明な企業のいくつかはハードウェア (そして関連ソフトウェア) の価格が低下して一般的な商品となったことを利用し、個々のマシンが壊れても全体としてのインフラストラクチャーが引き続き機能するように、多数の安価なマシンからなるシステムを構築しました。その結果、これらの賢明な企業 (Google と Amazon は、その一部の例です) は巨大なインフラストラクチャーを保有するようになり、そのインフラストラクチャーを文字通り誰にでも貸し出せるようになりました (それと同時に、自分たちのコア・ビジネスも円滑に行えるよになりました)。これにより、最近ではクラウド・コンピューティングの概念が現実になっています。もし今、IT プロジェクトの予算を組んでいるとしたら、ハードウェアを実際に購入するよりも Google や Amazon からインフラストラクチャーを借りたほうがコストを抑えられるかどうかを (そして企業の財布の中身も) 調べてみるべきです。

この連載について

Java 技術が初めて登場してから現在に至るまでに、Java 開発の様相は劇的に変化しました。成熟したオープンソースのフレームワーク、そしてサービスとして提供される信頼性の高いデプロイメント・インフラストラクチャーを利用できる (借りられる) おかげで、今では Java アプリケーションを短時間かつ低コストでアセンブルし、テスト、実行、保守することが可能になっています。この連載では Andrew Glover が、この新たな Java 開発パラダイムを可能にする多種多様な技術とツールを詳しく探ります。

EC2 の違い

Google と Amazon のそれぞれが貸し出しているインフラストラクチャーには明確な違いがあります。前回の記事で説明したとおり、Google App Engine は Java を使用して Web アプリケーションを開発するためのプラットフォームではありますが、Java の世界で使用できるものを何から何まで使えるわけではありません。その一例が、Hibernate です。Google App Engine では Hibernate を使用できないことから、代わりに Google の Big Table を使用するしかありません。しかしその引き換えとしてソリューションは無料でホストされ、思いのままにスケーリングが行われます (ただし、Google App Engine にデプロイした Web サイトが帯域幅またはスペースのしきい値に達すると、Google が料金を請求することを忘れないでください)。

一方で Amazon の EC2 オファリングは、開発プラットフォームそのものというよりは、任意のアプリケーションを実行できる仮想マシンをホストする汎用インフラストラクチャー・サービスです (Linux®、OpenSolaris、または Windows® ベースの仮想マシンをホストすることが可能です)。EC2 は無料ではありませんが、Google App Engine に比べ、遙かに柔軟性に優れています。仮想マシンを作成するか、借りることができれば、Hibernate を使用するアプリケーションも含め、ありとあらゆる Java アプリケーションを実行することができます (Amazon とそのコミュニティーでは、構成済み仮想マシン (イメージ) の全カタログを用意しています)。Google App Engine と同じく、アプリケーションを世界規模にスケーリングするにしても、アプリケーションをデプロイする場所、そしてアプリケーションのスケーリング方法は主に Amazon が管理してくれるため、極めて効率的に行うことができます (Amazon では、いくつかの地理的地域のなかからデプロイ先を選べるようにもしています)。

Amazon ではこのプラットフォームのメリットを生かしたアプリケーションを簡単に作成できるように、Eclipse プラグインを用意しています。しかしこのプラグインでの作業は、Google App Engine プラグインを使用する場合とは対照的に、EC2 ならではの柔軟性があるために途端に複雑になりがちです。例えば、Amazon の EC2 Eclipse プラグインは、EC2 を利用する構成可能なクラスターに (データベースなしで) Apache Tomcat Web アプリケーションをデプロイするという使用ケースを大幅に簡易化していますが、この使用ケースの枠を超えるとなると (EC2 で MySQL のデプロイ済みインスタンスを使用したり、Amazon の SimpleDB を使用したりする場合など)、かなり手強い作業が必要になってきます。

この記事では、Amazon のインフラストラクチャーで Groovlet を使用する単純なアプリケーションを、Eclipse を使用して素早く簡単に作成する方法を紹介します。開発マシン以外にハードウェアは必要ありません。また、使用するソフトウェアのいずれに対しても、ライセンス料金を支払う必要はありません (Amazon のインフラストラクチャーでコードをホストするための、ほんのわずかな料金を支払えばよいだけです)。

EC2 の開始手順

EC2 はお手頃価格です

EC2 の「スモール・インスタンス (Small Instance)」(大量のスペースまたはメモリーを使用しない単純なアプリケーションを実行する場合に使用するイメージ) の使用料は、1 時間あたり 10 セントです。帯域幅コストは着信トラフィックと受信トラフィックを合わせ、1 ギガバイトあたり約 30 セントです。さらに、IP アドレスも「レンタル」することができます。その場合、1 時間につき 1 セントの料金がかかりますが、IP アドレスは約 2 日間使用することができます。この記事のアプリケーションをデプロイしてテストするためにかかったコストは、約 60 セントでした。このコストを大局的に比較するならば、今日、私がコーヒーのために支払った額は約 3.50 ドルです。

EC2 を使用するには、AWS (Amazon Web サービス) のアカウントを作成する必要があります。まだ Amazon カスタマーとして登録されていない場合には、クレジット・カード番号の入力が必要になります。EC2 は無料ではありません (ただし、登録は無料です)。登録すると同時に、アクセス・キー ID とシークレット・アクセス・キーが送られてきます。この 2 つは、EC2 をセキュアに操作するためには欠かせません。

Amazon では Eclipse で AWS プラグインを使用する上では、Eclipse 3.5 を使用することを推奨しています。これ以外のバージョンを使用する場合には、この最新の Eclipse バージョンにデフォルトで組み込まれているいくつかの前提条件をインストールしなければなりません。これから作成してデプロイするのは Web アプリケーションなので、Eclipse IDE for Java EE Developers を使用することをお薦めします。このパッケージには、Web アプリケーションの作成をサポートする、便利な Java EE パースペクティブが含まれています。

AWS プラグイン一式をインストールする

Amazon の AWS プラグインをインストールするには、他のあらゆる Eclipse プラグインと同じく、最初に 「Help (ヘルプ)」 > 「Install New Software (新規ソフトウェアのインストール)」の順に選択し、最新バージョンのプラグインを取得して Eclipse を構成する必要があります。インストール・ダイアログが開いたら、「Work with (作業対象)」テキスト・ボックスに http://aws.amazon.com/eclipse と入力し、「Add (追加)」をクリックします。するとテキスト・ボックスの下のセクションに使用可能なプラグインのリストが表示されるので (図 1 を参照)、「AWS Toolkit for Eclipse」を選択して「Next (次へ)」をクリックしていきます。使用条件の条項に同意して「Finish (完了)」をクリックすると、Eclipse がプラグインをインストールします。プラグインのインストール後、大抵は Eclipse も再起動する必要があります。

図 1. AWS プラグインのダウンロード
AWS プラグインのダウンロード

この Eclipse プラグインでは、Web アプリケーションにターゲット・ランタイムを関連付けることができます。この記事では Tomcat 6 を使用するので、作業を進める前に Tomcat 6 をダウンロードしてインストールしてください。Web アプリケーションを EC2 にデプロイして、そこで一連の Tomcat サーバーを実行するとしても、コードをローカルでテスト、実行すればコストがかかりません。


Groovy による Web アプリケーションの作成

EC2 を構成する方法を説明する前に、単純な Web アプリケーションを作成しておきます。ここで使用する言語は、迅速に開発できることで私のお気に入りとなっている Groovy です。「Google App Engine よ、こんにちは」で実際に示したように、Groovy は基本的には Java 言語ですが、大量の構文は使いません (「参考文献」を参照)。例えば典型的な Hello World サーブレットを Java 言語で作成すると、約 6 行から 10 行のコードになります (import 文などをカウントするかによって行数は異なります)。同じ Hello World サーブレットを Groovy で作成すれば (つまり、Groovlet を作成すれば)、コードの行数をどのようにカウントするかに関わらず、コードが少なくなることは請け合います。実際、Groovy で作成できる最も単純なサーブレットは、わずか 1 行のコードでしかありません。

Eclipse Java EE パースペクティブの「Project Explorer (プロジェクト・エクスプローラー)」の中で右クリックし、「New (新規)」 > 「Dynamic Web Project (動的 Web プロジェクト)」の順に選択してください。動的プロジェクトを作成した経験がないとしても、心配には及びません。Eclipse では、HTML ページを使用する静的 Web プロジェクトと、サーブレットなどのサーバー・サイドのリソースを使用する動的 Web プロジェクトとを区別しています。

動的 Web プロジェクトを選択すると、プロジェクトの各種詳細 (ターゲット・ランタイムや Servlet のバージョンなど) を構成するためのダイアログが表示されます。ターゲット・ランタイムには必ず Tomcat 6 を選択してください (Tomcat 6 がインストールされている場所を Eclipse に対して指定しなければならない場合もあります)。構成オプションについては、デフォルトのままで構いません。

ソース・ファイルを配置する場所は選択することができますが、私は普段、src ディレクトリーのままにしています。最後に、コンテキスト・ルートを Eclipse に対して指定します。コンテキスト・ルートとは、Web アプリケーションの URI のなかで使用する名前です。ここでは単純な名前を指定してください。また、静的ファイルと Groovlet を配置する Web コンテンツ・フォルダーの名前も指定します。

これで「Finish (完了)」をクリックすれば、準備は完了です。

Groovy の依存関係を組み込む

Groovy を使用するには、2 つの変更が必要です。まず、groovy-all JAR (この記事を執筆している時点でのバージョンは、1.6.4 でした) をプロジェクトのクラスパスに追加します。次に、WEB-INF ディレクトリー内にある web.xml ファイルを更新します。web.xml ファイルは基本的に、Web リクエストを Groovlet にマッピングするためのファイルです (前回の記事で説明した手順に従っていれば、この作業は行っているはずです)。この web.xml ファイルは、リスト 1 のような内容になります。

リスト 1. Groovlet をサポートする web.xml ファイル
<servlet>
 <servlet-name>GroovyServlet</servlet-name>
 <servlet-class>groovy.servlet.GroovyServlet</servlet-class>
</servlet>
<servlet-mapping>
 <servlet-name>GroovyServlet</servlet-name>
 <url-pattern>*.groovy</url-pattern>
</servlet-mapping>

これで、Groovy でコードを作成する準備が整いました。


早速コードの作成に取り掛かります!

最も単純な Groovlet は、println を使用して文字通り Hello World と出力する 1 行のコードです。この記事では 1999年頃の装いを施し、ありきたりの Hello World を HTML で味付けします。Groovy はビルダーの概念をサポートします。ビルダーとは、階層型データ構造を定義するための論理メカニズムのことです (「参考文献」を参照)。Groovy のビルダーでは、XML や HTML などのマークアップ言語を楽々と真似できるだけでなく、Swing のようなフレームワークで GUI を模倣することさえ可能です。HTML そのものを扱うことなく (タグを扱う必要がありません!)、HTML マークアップを簡単に作成することができます。最も簡単に作成できる HTML 風の Groovlet は、Groovy の MarkupBuilder を利用します。Groovlet の場合、このビルダーは html 変数という形ですでに用意されています。一例として、リスト 2 に HTML を使用する単純な Hello World Groovlet を記載します。

リスト 2. 非常に簡潔な Groovlet
html.html {
  head {
      title("Hello from EC2")
  }
  body {
    p("Hello from EC2!")
  }
}

たったこれだけのコードです。この数行のコードによって生成される整形式 HTML は、<head> 要素の後に <title> 要素、そして単純なパラグラフが含まれる <body> 要素が続くという、実に単純な造りとなります。EC2Groovlet.groovy というファイルを新規に作成し、そこにリスト 2 のコードを入力してください。このファイルも Web コンテンツ・ディレクトリーに保存します。

XML を作成するのも同じように簡単です。ビューとコントローラーを混ぜ合わせたくないとしても、問題ありません。必要に合わせて GSP (GroovyServer Page) または JSP (JavaServer Page) を使用すればよいだけのことです。目的とする方向に関わらず、Groovy によってサーブレットをいとも簡単に作成できるようになることがわかっていただけたでしょうか。今度は、EC2 が簡単にサーブレットを使用できるようにしている仕組みを見ていきます。

その前に最後のステップとして、プロジェクトのコンテキスト・ルートに単純な index.html ファイルを作成します。このファイルは後々重宝することになります。Eclipse で EC2 を起動したときに Eclipse が表示する URL はコンテキスト・ルートだからです。index.html ファイルが見つからないと、Tomcat からエラー・ページを受け取ることになります。index.html には、Groovlet への相対リンクを作成してください。

一例として、リスト 3 に私が作成した index.html を記載します。

リスト 3. Groovlet を指す単純な index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Insert any old title here!</title>
 </head>
 <body>
  <p><a href="EC2Groovlet.groovy">Groovy is slick!</a></p>
 </body>
</html>

この簡単な作業は、これで終わりです。ここからは、EC2 に取り掛かります。


EC2 を構成する

Eclipse プラグインを使用すれば、至って簡単に EC2 を構成することができます。まずは、Amazon EC2 パースペクティブを開いてクレデンシャルを入力してください。次に「Window (ウィンドウ)」 > 「Show View ビュー」 > 「Others (その他)」の順に開いていき、最後に「Servers (サーバー)」を選択します。サーバーは 1 つ以上定義しなければなりません。ここでは 2 つのサーバーを定義します。1 つは無料でテストするためのローカル・サーバー、もう 1 つは Amazon のインフラストラクチャーにあるサーバーです。「Server (サーバー)」コンソールの中で右クリックし、「New (新規)」 > 「Server (サーバー)」の順に選択し、それぞれのサーバーを定義します。

Select the server type (サーバーのタイプの選択)」テキスト・ボックスには「local (ローカル)」と入力します。いくつかの選択肢が表示されるので (図 2 を参照)、そのなかから「Tomcat v6.0 Server (Tomcat v6.0 サーバー)」を選択します (「EC2 の開始手順」の説明にしたがって、Tomcat をダウンロードし、Eclipse でランタイム構成を正しく構成済みであることが前提となります)。「Next (次へ)」をクリックすると、使用可能なリソース (つまり、プロジェクト) をこのインスタンスに追加するための選択肢が表示されます。作成したプロジェクトを選択し、「Add (追加)」ボタンをクリックします。「Finish (完了)」をクリックすれば、準備は完了です。これで、自動的に Web プロジェクトを Tomcat のローカル・インスタンスに公開できるようになりました。

図 2. ローカル・サーバーの定義
ローカル・サーバーの定義

「Servers (サーバー)」コンソールで、ローカルの Tomcat インスタンスを選択し、右クリックして「Start (開始)」を選択します。Tomcat が起動すると、前の手順で作成したコード (簡潔な Groovlet) を Eclipse がデプロイします。お好みのブラウザーを立ち上げて、localhost:8080/<ご使用の環境のコンテキスト名>/EC2Groovlet.groovy にアクセスしてください。Groovy のビルダーによって HTML 化された見事な Hello World が表示されるはずです。次は、Amazon のインフラストラクチャーを試してみます。


AWS でのデプロイメントとテスト

そろそろ、この Web アプリケーションを EC2 にデプロイしないものかと読者の皆さんがやきもきしていることを願います。嬉しいことに、EC2 にデプロイする作業は、ローカルにデプロイする場合と同じくらいに簡単です。まずは「Servers (サーバー)」コンソールに戻り、右クリックして「New (新規)」 > 「Servers (サーバー)」の順に選択します。表示されたダイアログで「ec2」と入力すると、「Amazon EC2 Tomcat v6.0 Cluster」という選択肢が表示されるので (図 3 を参照)、この選択肢を選択して「Next (次へ)」をクリックします。

図 3. EC2 サーバーの定義
EC2 サーバーの定義

次のダイアログ (図 4 を参照) では、クラスターで利用するインスタンスの数を選択することができます。とりあえずは「1」のままにしておいてください。この数は後でいつでも増やすことができます。「Server AMI」では、「Custom (カスタム)」を選択することもできますが、ここでは「default (デフォルト)」を使用します。あえて言うなら、別の AMI を選択すると、データベースなどの他のパッケージを追加する機会が豊富に与えられることになります。「Instance Type (インスタンス・タイプ)」には「Small」を選択してください。インスタンスも、必要に応じて大きくすることができます (ただし、大きくした分、支払う料金も増えることをお忘れなく)。

図 4. EC2 の設定
EC2 の設定

Amazon ではセキュリティーに真剣に取り組んでいると表明したとおり、次の 2 つの選択肢 (図 4 を参照) は Tomcat クラスターのセキュリティーに関連するものです。ここではデフォルトの状態を作成しておくだけにとどめ、「Key Pair」領域で右クリックし、「New Key Pair」を選択します。そして新しいキー・ペアの名前を定義し、EC2 への登録プロセスでインストールしたキー・ペアを選択します。

次の「Security Group」ボックスでは、グループを作成することができます (ここではグループを作成するだけですが、別のビューでは作成したグループを実際に利用することができます)。セキュリティー・グループを作成するには、「Security Group」ボックス内で右クリックし、新しいグループを追加して任意の名前を指定します。デフォルト設定では誰でもポート 8080 にアクセスできるようになっていますが、今のところ、これで問題ありません。

最後に、Amazon ではユーザーが IP アドレスを構成することができます。EC2 を使用することにした場合は、このオプションが功を奏します。なぜなら、Web アプリケーションに提供されるデフォルト URI はかなり長く、覚えにくいからです。今回は EC2 が提供するアドレスをそのまま使いますが、ご心配なく。いつでもカスタム・ドメイン名を構成して、Amazon が提供する IP アドレスにマッピングすることができます。

Next (次へ)」ボタンをクリックすると、プロジェクト (および Groovlet) が EC2 サーバーに関連付けられます。次は、いよいよデプロイメントに取り掛かります。

前と同じく、新しく定義した Amazon EC2 サーバーを右クリックして起動してください (図 5 を参照)。

図 5. サーバーの起動と停止
サーバーの起動と停止

この例ではリモートで事が行われるため、サーバーが起動するまでには通常よりも多少時間がかかるかもしれません。サーバーが実行中になったら「Project Explorer (プロジェクト・エクスプローラー)」で Web プロジェクトを選択し、「Run as (実行)」 > 「Run on Server (サーバーで実行)」の順に選択します。次に、すでに起動されている Amazon Tomcat クラスターを選択し、「Finish (完了)」をクリックします。すると Eclipse に、コンテキスト・ルートにデフォルト設定された組み込みブラウザーが立ち上がります。このコンテキスト・ルートには、Groovlet へのリンクを設定した index.html ファイルが定義されています。

ブラウザーのアドレス・バーに示されている URL に注目してください。ご覧のように、図 6 には私の URL が示されています。この URL はいつでも、より論理的なものにマッピングすることができます。Groovlet へのリンクをクリックして、Groovy の威力をもう一度確認してください。今度はその威力は、ロケーションがまったくわからないサーバーからもたらされています。

図 6. EC2 で発揮された Groovy の威力
EC2 で発揮された Groovy の威力

リンクを何回かクリックして、Amazon のインフラストラクチャーで実行するのも、ローカル・マシンで実行する場合と同じくらいに簡単だと納得できたら、必ずサーバーを停止してください。サーバーを実行したままにすると、その分の料金が請求されます。サーバーを停止する手順は、論理的には起動する手順と同じで、「Server (サーバー)」コンソールでインスタンスを右クリックし、「Stop (停止)」を選択すればよいだけです。


EC2 は Java 開発 2.0 です

Java 開発 2.0 では、Java 開発を行う上での重要な方向性を示す次の 2 点が色濃く反映されます。

  • オープンソースのツールとフレームワークをアプリケーションの構築全体にわたってフルに活用すること
  • アプリケーションそのものの実行を含め、ソフトウェアのライフサイクルを管理するためにあらゆるレベルで必要なアプリケーション・インフラストラクチャーを貸与 (あるいは借用) すること

この記事を読んでおわかりのように、EC2 を使用することで、上記に挙げた Java 開発 2.0 の側面が両方とも実現されることになります。ハードウェアを実際に購入するよりも遙かに低コストで済むレンタル・インフラストラクチャーで、任意のソフトウェア・パッケージをフルに利用することができます (前述のとおり、実行可能なアプリケーションであれば、どのようなアプリケーションでも Amazon の仮想マシンで実行することができます)。その上、EC2 はセットアップするにも極めて効率的で、同じコストでも、独自にスケーリングする場合より遙かに大きくアプリケーションをスケーリングすることができます。

連載「Java 開発 2.0」の次回の記事では、Tomcat だけでなく MySQL の実行もサポートする仮想マシン (すなわち AMI) をプロビジョニングすることによって、EC2 をさらに詳しく探っていきます。Spring と Hibernate (現在出回っている Java オープンソース・フレームワークのなかで、ほぼ間違いなく最もよく使われている 2 つ) の両方をサポートする Java Web アプリケーションをデプロイする方法を学ぶとともに、再度、Java 開発 2.0 の基本的な側面が実際にどのように機能するのかを確かめてください。

参考文献

学ぶために

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

議論するために

コメント

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=Java technology, Cloud computing
ArticleID=438828
ArticleTitle=Java 開発 2.0: EC2 も借りられます
publish-date=09292009