目次


Java 開発 2.0

容易な EC2

素早く CRUD Web アプリケーションを作成し、Amazon Elastic Compute Cloud 上で実行する

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: Java 開発 2.0

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:Java 開発 2.0

このシリーズの続きに乞うご期待。

Java 開発 2.0: EC2 も借りられます」で学んだように、Amazon の EC2 (Elastic Compute Cloud) は、仮想マシン (Linux®、OpenSolaris、さらには Windows® の仮想マシンまで) をホストする汎用インフラストラクチャー・サービスであり、どんなアプリケーションでも実行することができます。もちろん、このサービス上で、(この記事でこれから説明するように、Hibernate や Spring を使用する Web アプリケーションも含めて) 任意の Java アプリケーションを実行することができますが、そのためには、AMI (Amazon Machine Image) としても知られる仮想マシンすなわち「インスタンス」を作成するか、借りる必要があります。

Amazon の Web サービスを取り巻くコミュニティーはこの数年非常に活発であり、公開されている膨大な数の仮想マシンのカタログのなかから自分の要求に合うものを選択して使用することができます (「参考文献」を参照)。Linux には数多くの種類があることから、そのカタログにはさまざまな構成のソフトウェアや関連ツールが満載されていることが想像できると思います。この記事で求めている AMI は、以下の条件を満たす AMI です。

  • 既に Java (できれば最新のバージョン) がインストールされているもの
  • サーブレット・コンテナー (Tomcat など) が含まれるもの
  • 無料で使用できるデータベース (MySQL など) が含まれるもの

また、そうしたコンポーネントをインストールできる、(言うなれば) 白紙状態の仮想マシンを使うという選択肢もあります。しかし、時間をかけて探せば、ほぼどんな構成も見つかるとわかっているのは心強いものです。実際、ほとんどの場合、EC2 のプロビジョニングで最も困難な作業は、自分の好みにあった特定の仮想マシンを見つけることです。そして、望み通りの仮想マシンが見つかると、楽しいことが始まります。私は、私の要求を満たしてくれる仮想マシンを見つけることができたので、その使い方を説明することにします。この使い方は、前回の記事で説明した Eclipse の AWS プラグインを既にインストールしてあれば非常に簡単です。

Eclipse の AWS プラグインを利用すると、インスタンスを検索、起動、終了することができます。しかも、キー・ペアを適切に構成してあれば (Eclipse の AWS プラグインはこれを非常にうまく処理します)、ターミナル・ウィンドウから特定のイメージに ssh で接続し、さらに詳細な構成を行うことができます。

ただし前回の記事と同様、EC2 の詳細な説明を始めるためには、公開されている AMI の起動方法を詳しく説明する前に、簡単な Java アプリケーションを作成しておくのが得策です。Grails フレームワークを利用すると、アプリケーションで Spring と Hibernate を (さらにはその下位層にある永続ストアを) 活用することができます。

迅速さが重要

Java 開発 2.0 の基本的な特徴は、アプリケーションを構築するにあたり、借用したインフラストラクチャーを利用することに加え、徹底してオープンソースを活用することにあります。オープンソースのツールやフレームワーク、さらにはソリューションまで使用することで、企業は自分自身で大量のコードを作成する必要がなくなるため、ソフトウェア・アプリケーションを素早く組み立てることができます。開発を素早く、そして何と言っても非常に簡単に行えるようにするオープンソースのソリューションと言えば、Spring と Hibernate の 2 つが頭に浮かびます。

Java で開発を行っている全世界のほぼすべての現場では、Spring フレームワークを使用してアプリケーションを作成しています。Spring フレームワークは主に IoC (制御の反転) フレームワークとして知られていますが、今や Java で開発を行う上でまさに不可欠な要素となっています (Spring は AOP (Aspect-Oriented Programming: アスペクト指向プログラミング) フレームワークであり、OSGi コンテナーであり、Web フレームワークであり、さらに他の側面も持っています)。この Spring に引けをとらない Hibernate は、Java の ORM (Object-Relational Mapping) の世界では中心となるフレームワークです。一方 JDO (Java Data Object) も使われますが、その採用が広まる速さはとても Hibernate には及びません (JDO については連載の第 1 回で Google App Engine との関連で説明しました)。従って、現在と将来の Java 開発について考えてみると、おそらく Spring と Hibernate を組み合わせて使われる可能性が最も高いでしょう。(これは特定の作業を行うために両方のフレームワークが必要であるという意味ではありません。むしろ、ほとんどの場合はこの 2 つのフレームワークで実質的にあらゆるニーズに対応できる、ということを意味しています。)

一方 Groovy は、基本的に Java 開発を極めて容易なものにする開発プラットフォームです (「参考文献」を参照)。Groovy は大量の構文を必要としないという特徴を持った、単なる Java 言語にすぎませんが、Groovy を使うことで、ソリューションを素早く作成することに集中することができ、同じ問題を解決するために単純な Java コードを大量に作成する必要がなくなります。(こうした特徴を持つのは Groovy のみではありません。JVM 上で実行する他の多くの言語も、まったく同じ問題に対応することができます。) 私の場合、Groovy は、単に私のツール・セットの中にある 1 つの JAR ファイルにすぎません。

つまり、アプリケーションを素早く作成することを考える場合には、私は Groovy と Spring、そして Hibernate を考えます。そして Web アプリケーションの場合、この 3 つのすべてを非常にうまく組み合わせられる特定のフレームワークが Grails です。Grails は Spring の上に構築されていると同時に、Groovy をベースにしています。また GORM (Grails Object Relational Mapping)、つまり Grails による ORM 実装では、Hibernate をベースに使用しています。

この記事は基本的に Grails に関する記事ではありません。(Grails をマスターしたい方は、Scott Davis による連載記事「Grails をマスターする」を読むことをお勧めします。) とは言え、Grails を使うと、単純な Web アプリケーションを驚くほど容易に作成することができるので、次のセクションではその方法を説明しましょう。

Grials の基本

Grails の使い方は簡単です。これから説明する内容に従っていくと、(Spring と Hibernate を介して) データベースを利用する基本的な Web アプリケーションが即座に出来上がります。まず、Grails をダウンロードしたら (「参考文献」を参照)、そのファイルを解凍し、環境を構成します。環境の構成としては、GRAILS_HOME 環境変数が Grails のインストール・ディレクトリーを参照するように設定します。次に GRAILS_HOME/bin をパスに追加します。また JAVA_HOME 環境変数が設定されていることも確認します。

今度は (オペレーティング・システムに応じて) コンソール・ウィンドウまたはシェルを開き、コマンド・プロンプトから以下の内容を入力します。

grails create-app mytri

驚くことではありませんが、これによって mytri という名前の Grails Web アプリケーションが作成されます。このアプリケーションは、この連載の初めの頃に Google App Engine を利用して作成する方法を説明した、トライアスロンのイベントに関する情報を収集するアプリケーションという一般的なテーマなテーマに沿っています。

次に、新たに作成した Web アプリケーションのディレクトリーにカレント・ディレクトリーを変更し (cd mytri/)、以下の内容を入力します。

grails create-domain-class Triathlon

すると、Grails から数行の情報が出力され、その最後が次のように終わっているはずです。

Created DomainClass for Triathlon
Created Tests for Triathlon

今度はカレント・ディレクトリーを grails-app/domain に変更します。このディレクトリーを見ると、Triathlon.groovy という適切な名前のファイルがあります。このファイルを適当なエディターで開きます。この連載のこれまでの記事と同様、ファイルの内容に関する説明にはあまり時間をかけないことにします。つまり、とりあえず非常に単純にしておきます (後でいくらでも装飾することができます)。さまざまな関係を無視し、トライアスロンのいくつかのプロパティーのみに焦点を絞ります。

  • 日付
  • 種類 (スプリント・ディスタンス、ハーフ・アイアンマンなど)
  • 名前
  • 場所

では、リスト 1 のコードを Triathlon.groovy ファイルに追加します。

リスト 1. トライアスロンを表現する単純なドメイン・オブジェクト
class Triathlon {
 static constraints = {
  classification(inList:["Sprint", "Olympic", "1/2 Iron Man", "Iron Man"] )
 }

 String name
 String location
 Date eventDate
 String classification
}

このオブジェクトの constraints セクションによって、classification の種類が 4 つのうちのいずれか 1 つと指定されていることに注意してください。このファイルを保存して閉じます。

次に、このプロジェクトのホーム・ディレクトリー (mytri) に戻り、以下の内容を入力します。

grails generate-all Triathlon

このコマンドによって、おなじみの MVC (Model-View-Controller) のビューとコントローラーが作成されます。Triathlon オブジェクトはモデルです。

ここまで来たら大きく息をしてください。これで終わりなのです。これで、データベースの中でトライアスロンの大会に関するデータの作成、更新、削除、読み取りを行う簡単な Web アプリケーションを作成することができました。すごいと思いませんか。このアプリケーションを実行するためには、以下の内容を入力します。

grails run-app

ブラウザーを開き、http://localhost:8080/mytri にアクセスします。ドメイン・オブジェクトへの CRUD (作成、読み取り、更新、削除) 操作をサポートする、いくつかの汎用インターフェースが Grails によって生成されていることがわかります。

例えば、この mytri アプリケーションがロードされると (図 1)、generate-all コマンドを実行した際に Grails によって作成された TriathlonController オブジェクトに対応するリンクが表示されているはずです。

図 1. Grails アプリケーションのデフォルトのホームページ
Grails アプリケーションのホームページ
Grails アプリケーションのホームページ

TriathlonController リンクをクリックすると、アプリケーションで使用しているデータ・ストアが空であることがわかります。しかし次に New Triathlon リンクをクリックすると、トライアスロンの大会に関するデータを作成するためのスマートなフォームが表示されます (図 2)。

図 2. トライアスロンの大会に関するデータを作成するためのフォーム
Grails によるデータ作成フォーム
Grails によるデータ作成フォーム

このフォームにデータを入力し、そして Create リンクをクリックすると、トライアスロンの大会のリストに戻ります。なんと、新たに作成したオブジェクトがリストの中に表示されています (図 3)。

図 3. 作成に成功したトライアスロンの大会のリスト
Grails によるトライアスロンの大会のリスト
Grails によるトライアスロンの大会のリスト

Grails は背後で、HSQL というメモリー内データベースを使っています。しかしここでは、Grails が使用しているスキーマをエクスポートし、そのスキーマを使って MySQL の中でデータベース・テーブルを作成できるようにします。

HSQL 以外のデータベースとやり取りするように Grails を構成する方法は極めて簡単です。mytri/grails-app/conf ディレクトリーにある DataSource.groovy ファイルを適当なエディターで開きます。このファイルの dataSource セクションに以下の行を追加します。

dialect=org.hibernate.dialect.MySQLDialect.class

この行は Hibernate の MySQL の方言を使うように Grails に指示しています。特に、MySQL 用の有効な DDL (Data Definition Language) ファイルを生成するように Grails に指示する必要があります。そこで次に、このプロジェクトのホーム・ディレクトリーにいることを確認してから、コンソールから以下の内容を入力します。

grails schema-export

このプロセスによって、sql.ddl というファイルが生成されます。このファイルには、MySQL の内部に適切なテーブルを作成するために実行する必要があるステートメントが含まれています (このステップを後ほど実行します)。最後に、DataSource.groovy ファイルから MySQL の方言の行を削除します。後ほどこの行は、別の場所に追加します。

Amazon インスタンスをプロビジョニングする

ここまでのところで、既にたくさんのことをしましたが、まだ EC2 には触れてさえいません。ただしそれは、良いことなのです。EC2 や EC2 と同様のサービスの良いところは、単純であり、即座に起動されることです。そこで Eclipse を開き (まだ AWS プラグインのインストールと構成を行っていなければ、AWS プラグインをインストールして構成します。手順の説明が必要な場合には先月の記事を参照してください。)、「Amazon EC2 Management」パースペクティブを開きます。そこから、「EC2 AMIs」ビューをクリックすると、ID とマニフェストを含む暗号のようなリストが表示され、またテキスト・ボックスがビュー上部の右端に表示されます (図 4)。

図 4. AMI のリスト
たくさんの AMI があります
たくさんの AMI があります

このあまり目立たないテキスト・ボックスに ami-aa5abac3 と入力します。これが Java Web Apps in a Box に用意されている便利な AMI の ID です。図 5 は、その結果を示しています。

図 5. この記事に必要な AMI
AMI が 1 つだけあります
AMI が 1 つだけあります

図 5 を見るとわかるように、ami-aa5abac3 という AMI が見つかり、そのマニフェストには tomcat と mysql という単語が含まれています。なかなか順調です。次に、この AMI を選択して右クリックし、「launch (起動)」を選択します。すると、AMI の起動方法を構成できる新しいダイアログが表示されます。AMI を起動する際には、キー・ペアとセキュリティー・グループを選択する必要があります (これは「Java 開発 2.0: EC2 も借りられます」の場合と同じです)。この画面を図 6 に示します。

図 6. AMI の起動オプションを構成する
AMI の起動オプションを構成する
AMI の起動オプションを構成する

Finish (完了)」ボタンをクリックすると、ご想像のとおり、インターネットのどこかに AMI が起動されます。Eclipse の「EC2 Instances」ビュー (図 7) を見ると、このインスタンスが起動待ちになっていることがわかります。

図 7. Eclipse の「EC2 Instances」ビュー
Eclipse の「EC2 Instances」ビュー
Eclipse の「EC2 Instances」ビュー

まもなく AMI の状態は、起動中から実行中に変わります。これには少し時間がかかる場合がありますが、我慢して待ちます。インスタンスが実行中になると、この AMI の公開 DNS が Eclipse の「EC2 Instances」ビューに表示されていることがわかります。これは、後でこの Web アプリケーションまでナビゲートする際に便利です。

MySQL を詳細に構成するために、ターミナル・セッションが必要です。インスタンスを選択して右クリックし、「Open Shell」を選択します。使われているローカル・マシンのオペレーティング・システムによっては、SSH をサポートするシェルを見つける必要があるかもしれません。(Windows の場合には Putty を使用することができます。「参考文献」を参照)。

MySQL と Grails を構成する

Eclipse の中で開いているシェル (新たに起動した AMI を参照しているシェル) の中で、以下のコマンドを使って MySQL にログインします。

mysql -u root --password=root

次に、この Grails インスタンス用に新しいユーザーを作成します。

mysql> CREATE USER 'grails'@'localhost' IDENTIFIED BY 'groovy';

そして、下記のユーザー権限をデータベースに設定します。

mysql> GRANT ALL ON *.* to 'grails'@'localhost';

次に、データベース (データベースの世界での見方によっては、スキーマ) を作成します。

mysql> create database mytri;

テーブルを作成するためには、その新たに作成されたデータベースを使い始める必要があります。

mysql> use mytri;

最後に、sql.ddl ファイルの最後の行を (改行を入れずに) 実行します。

mysql> create table triathlon (
   id bigint not null auto_increment, version bigint not null, classification varchar(12) 
   not null, event_date datetime not null, location varchar(255) not null, 
   name varchar(255) not null, primary key (id));

これで MySQL データベースが使えるようになりました。あとは Grails の構成を完成させ、Grails を使えばよいだけです。

MySQL を使用するように Grails を構成する

MySQL の JDBC ドライバーをダウンロードし (「参考文献」)、mytri/lib ディレクトリーに配置します。次に DataSource.groovy ファイルを開き、production セクションを更新します (リスト 2)。

リスト 2. MySQL のドライバーと MySQL の方言の構成を DataSource.groovy に追加する
production {
 dataSource {
  driverClassName = "com.mysql.jdbc.Driver"
  username = "grails"
  password = "groovy"   
  dialect=org.hibernate.dialect.MySQLDialect.class
  url = "jdbc:mysql://localhost/mytri"
 }
}

この変更によって Grails の production インスタンスは、同じマシン (localhost) 上で実行されている MySQL データベースを参照するようになります。当然のことですが、この localhost のインスタンスはインターネットのどこかで実行されている AMI です。

Tomcat の管理インターフェースを使って Grails アプリケーションをデプロイする

Grails アプリケーションは (他のすべての Java Web アプリケーションと同様)、WAR ファイルとしてデプロイされます。そのため、皆さんのコンピューターのシェルに戻り (このシェルは Grails の作業用に使用しているシェルのことであり、EC2 インスタンスを参照しているシェルのことではありません)、以下の内容を入力します。

grails -Dgrails.env=prod war mytri.war

すると、mytri.war という適切な名前の付いたファイルが作成されます。ここから先は、Tomcat の管理インターフェースを使用して、このアプリケーションを新たに起動された AMI にロードすればよいだけです。ここで、ターゲットの AMI に mytri.war を scp で送信することもできます。どちらを選ぶかは皆さん次第です。ここでは Tomcat のインターフェースを使うことにしますが、それは Tomcat が既に実行されており、ベースにあるファイルシステム上で AMI のパスを見つける必要がないからです。

Tomcat の管理インターフェースを構成する

Tomcat の管理インターフェースを使用する前に、このインターフェースを EC2 イメージ上で適切に動作するようにしなければなりません。というのも、AMI のデフォルトの構成は、(セキュリティー上の理由から) このインターフェースを使って下記を行うことを禁止しているからです。

  1. AMI インスタンスを参照するシェル・セッションに戻り、/usr/local/tomcat-6.0.20/conf ディレクトリーにある tomcat-users.xml ファイルを探すこと。
  2. このファイルを開き、manager という新しいロールを追加すること。
  3. 新しいユーザーを作成して (あるいは既存のユーザーを利用して)、このユーザーに manager ロールを持たせること。
  4. Tomcat を再起動すること。インスタンスの再起動方法としては、Eclipse のコンソールからインスタンスを再起動するか、あるいは単純に /usr/local/tomcat-6.0.20/bin ディレクトリーで停止スクリプトを実行してから起動スクリプトを実行するかのいずれかです。このどちらを実行するかは皆さん次第です。

Eclipse の「EC2 Instances」ビューに戻り、インスタンスを右クリックし、「Copy Public DNS Name」を選択します。次に、この公開 DNS の名前をブラウザーのアドレス・ボックスに貼り付けます。すると Tomcat の愛らしいウェルカム画面が表示されます。もし表示されない場合には、ネットワークの応答には少し時間がかかる場合があるため、数分待ってから再度試みます。

ページがロードされたら、左側にあるメニューの「Tomcat Manager」リンクをクリックします。するとユーザー名とパスワードを入力するように促されるので、先ほど構成したユーザー名とパスワードを入力します。管理インターフェースがロードされたら、「WAR file to deploy (WAR ファイルの配備)」のところまで下にスクロールし、「Browse (参照)」ボタンをクリックして mytri.war を見つけます。最後に、「Deploy (配備)」ボタンをクリックします。このファイルは大きな WAR ファイルなので、少し時間がかかっても心配する必要はありません。

アップロードが完了すると、「Applications (アプリケーション)」セクションに mytri アプリケーションが表示されていることがわかります。mytri アプリケーションのリンクをクリックします。すると、どこかで見たような画面が表示されます。この画面は図 2 とほとんど同じなのです。この画面から、新しいトライアスロンの大会を作成できるはずです。ただし今回は、インターネットのどこかにある EC2 インスタンス上の MySQL の中にトライアスロンの大会が作成されます。簡単だと思いませんか。

すべてが適切に動作していると満足できたら、AMI を終了させることを忘れないでください。Amazon は (少額ながら) 時間で課金していることを忘れてはいけません。Eclipse の「EC2 Instances」ビューで、終了させる AMI インスタンスを右クリックし、表示されるメニューから AMI を終了させます。AMI が終了すると、すべてが消去されます。つまり、例えば再度トライアスロンを操作したい場合には、再度 MySQL データベースをセットアップする必要があります。(Amazon の Elastic Block Storage という別のサービスでは、AMI インスタンスの終了時にも一時データが消去されないようにすることで、こうしたデータを長期間保持できるようにしています。)

まとめ

今回の記事でも改めてわかるように、EC2 は Java 開発 2.0 の両方の側面を兼ね備えています。つまり、MySQL、Tomcat、(背後で Spring とHibernate を使用する) Grails などのオープンソース・パッケージを、レンタル・インフラストラクチャー上でフルに利用することができ、そのコストはハードウェア・リソースを独自に取得するよりもはるかに安価です。しかも EC2 はセットアップが非常に簡単な上に、独自のハードウェアを使って同じコストで行う場合に比べると、はるかにスケーラブルです。実際、この記事では大したことをしなかったと感じたら、まさにそれがポイントなのです。

来月はドキュメント指向データベースの CouchDB について説明します。CouchDB は、例えば MySQL とは明らかに異なります。なぜ一部の人達が CouchDB を未来のデータベースと呼ぶのか、次回の記事でその理由がわかります。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Java technology, Cloud computing
ArticleID=448379
ArticleTitle=Java 開発 2.0: 容易な EC2
publish-date=10272009