スティルハウスの書庫の書庫

はてなダイアリーで書いてた「スティルハウスの書庫」を移転してきました。

GAE/Jはサーバ構築いらず、簡単デプロイ

(この記事は、日経BP社「ITpro」向けに書いたものを再掲しています)

ご都合.comの開発を通じてもっとも感銘を受けた点は、「サーバ環境の構築とデプロイの簡単さ」です。ここでは細かな手順の説明は省略しますが、GAE/Jによるシステム開発は以下の流れとなります。

  1. GAE/Jにサインアップする
  2. GAE/JのEclipseプラグインGoogle Plugin for Eclipse for App Engine development)をインストールする
  3. Eclipse上でGAE/JのAPIに基づくJavaアプリケーションを開発、テストする
  4. EclipseからGAE/Jへデプロイする

GAE/Jは、他のクラウドサービスや通常のサーバホスティングサービスとは異なり、「サーバ環境」ではなく「Webアプリの実行環境」を提供するサービスです。例えばアマゾンのクラウドサービス「Amazon EC2」は、おおざっぱに言えば「VPS(Virtual Private Server)」であり、利用者はEC2が提供する仮想サーバ上にログインし、ミドルウェアやアプリケーションのデプロイや設定を自ら実施する必要があります。これに対しGAE/Jは、TomcatJBossに相当するGoogle独自のアプリケーションサーバがすでに稼働している環境があり、そこに利用者のWebアプリをデプロイして利用します。

この形態には以下のような一長一短があります。

【メリット】

  • サーバ構築(OS、ミドルウェア、APサーバ、データベース、ネットワーク等のインストールや設定)が一切不要
  • 1クリックでデプロイできる

【デメリット】

  • Webアプリが独自の「サンドボックス」内部で動作するため、そのさまざまな制約を受ける

これらのうち、とりわけ「サーバ構築が一切不要」というメリットは、大幅な開発コスト削減をもたらします。いまどきのOSSベースのシステム開発では、OSやミドルウェア、APサーバ、DBといった個別のソフトウェアのインテグレーション作業に時間がかかるうえに、システム障害の原因となる大きなリスクとなります。GAE/Jでは、そうしたコストやリスクを回避できます。例えば今回、筆者はご都合.comの構築をほぼ5日(開発とドキュメント作成)で実施しましたが、もしいつも通りのサーバ構築をゼロから始めたならば、面倒なインストール作業やメモ作成、微調整などで、あと2日は余計に時間がかかったはずです。

GAE/Jが提供する実行環境では、おもに以下のようなAPIを利用できます。

名称 内容
Java Servlet / JSP サーブレットJSPの実行環境(GAE/J独自のサンドボックスによる制限を受ける)
Datastore Java API Bigtableによるデータストア機能を提供するJDOベースのAPI
Logging API java.util.loggingによるログ機能
Memcache Java API JCache APIベースの分散メモリキャッシュ機能
URL Fetch Java API 外部サーバへのhttp/httpsリクエスト送信機能
Mail Java API JavaMail APIベースのメール送信機能
Images Java API 独自APIによる画像処理機能
Google Accounts Java API 独自APIによるGoogleアカウントのシングルサインオン機能

GAE/Jが提供するおもなAPI

開発者は、GAE/JのEclipseプラグインGoogle Plugin for Eclipse for App Engine development」をインストールすることで、これらのAPIによるコーディングとビルド、テストをローカル環境で実施し、ボタンクリック1つでWebアプリをGAE/Jの実運用環境にデプロイできます。これはPHPRuby on RailsといったLL系システムと同じ程度のお手軽さで、ここ3年はRails一辺倒であった筆者も「この手軽さならまたJavaに戻りたい」と思うほどです。


EclipseによるGAE/J対応Webアプリの開発

ちなみに、ローカル環境と実際のGAE/J環境には微妙な振る舞いの差があり、たとえば今回Flexとサーバ間の接続に使用したミドルウェアAdobe BlazeDS」は実行環境でのみうまく動作せず、パッチ適用と再ビルドが必要でした。

また、GAE/Jには「独自のサンドボックスによる制限を受ける」というデメリットがあります。具体的には、以下のような制約が課せられます。

例えば、サーブレットが個々のリクエスト受信からレスポンス送出までには30秒という時間制限があり、それを超えるリクエストはHTTPステータス500番のエラーが発生して中断されます。また、レスポンスデータを段階的にストリーミング送信することはできませんので、例えばCometサーバのような疑似プッシュは実装できません。もっとも、いわゆる普通のWebアプリであれば、これらはそれほど大きな制約にならないと思われます。

ご都合.comの事例では、上述したBlazeDSに備わるサーブレットがデフォルトではJMX APIJava EEの管理用API)を用いる設定になっており、サンドボックスによる例外が発生していました。そこでJMXを使わない設定に変更し、サンドボックス内で問題なく動作させることができました。そのほか、サーバ機能の実装に際して特に不都合を感じた点はなく、特別なことさえしなければ“ごく普通のWebアプリプログラミング”が可能という印象を受けました。

以上、本稿では「ご都合.com」の開発事例を通じて、GAE/JによるWebアプリ開発の実際とそのポテンシャルを解説しました。筆者はとりわけ「Bigtableがあまりにも簡単に使える」こと、そして「サーバ構築が不要、ワンクリックでデプロイできる」という点に驚嘆しました。「クラウドコンピューティング」が、単なるbuzzwordではなく本物の「進化」であると実感できたことが、この連休中に得られた大きな“収穫”でした。