すっきりわかるGoogle App Engine for Javaクラウドプログラミング


オープンソース徹底活用 Slim3 on Google App Engine for Java
今年の夏は暑かったせいか、このブログをホストしているサーバが時々ハングしていた。
ので、なんとなく思い立ってGoogle App Engineに移行した。

ほぼ静的htmlしか公開していないサイトなので、静的ファイルのみのアプリケーションをGAEでホストするというゴージャス仕様。

短時間でなんとかしたいなと考え、まずは以下のように。

  • MTはperlで書かれているけど、これをGAE上で動くようにするのは道のりが遠いので、コメント/トラックバックの機能は閉じることにする。
    • MTの管理画面で両者を無効にして、サイト全体を再構築。
  • GAEアプリケーションのwar/ディレクトリ配下に公開する静的ファイルを全部置く。
  • デプロイする。
GAEのアカウントとったりアプリケーション登録したりと、こまごまやることはあったけど、静的ファイルを公開するだけならこれでおしまい。

・・・なのだけどハマったことがいくつか。

  • 静的ファイル数の制限が3000個。
    • cgiやライブラリを除くMTのファイル(画像やテーマなど)もまとめてデプロイしようとしたのだけど、ファイル数制限を超えてデプロイできなかった。使ってないファイルを調べてちまちま削除した。
  • ファイル数が多かったのでデプロイに妙に時間がかかった。
    • ftpやscpでアップロードするのとは状況が違い、単純にファイルとして格納されるわけではないそうで。自分ところではデプロイ開始から50分かかってしまった。

毎回デプロイに一時間近くかかってはこまるよなぁ、と。
ということで現在は以下のように変更。

  • 対象となる静的ファイルを、pathのハッシュを基準にいくつかのzipアーカイブに分割して保存。(現在は16分割している)
  • すべてのURLを受け付けるサーブレットを作成。
  • リクエストされたパスからハッシュ値をとって格納zipアーカイブを決定。
  • zipアーカイブから指定されたパスのリソースを取り出して応答。
  • 静的コンテンツ1つ1つを、毎アクセスごとにzipから読み込んではさすがに無駄があるので、キャッシュAPIを使う。
てなことをしたら、デプロイも数十秒で収まるようになった。

アプリケーションが自分でOpenするファイルは、リソースファイルとしてデプロイしておく必要がある。

ここのサイト用アプリは次のようなディレクトリ構成になっていて、

gae-static-content/
  src/
    サーブレットなどのソース
  war/
    static-contents/
      passing-static-0.zip
      passing-static-1.zip
      passing-static-2.zip
      passing-static-4.zip以下 -f.zipの16分割。
    WEB-INF/
      classes/
      lib/
      appengine-web.xml
      logging.properties
      web.xml

war/static-contens/*.zipをリソースファイルとしてデプロイするために、appengine-web.xmlに以下のように指定している。デフォルトではstatic-fileとリソースファイルの両方としてデプロイされるそうなので、静的ファイルからは除外、とした。

	<static-files>
<exclude path="/static-contents/*" />
</static-files>

MTで記事編集→
再構築してhtml生成→
静的ファイルのpathに応じて分割アーカイブ→
アプリケーションとしてデプロイ

てな流れ。分割アーカイブはperlで書いたスクリプトで一括処理。

処理と作業の単純化のため、pathのハッシュ基準にzip分割しているのだけど、ファイルサイズを考慮していないのでそれぞれのアーカイブがGAEのファイルサイズ制限にひっかかってしまう可能性がある。が、今のところ最も大きいzipでも3MBなので、まあいいかと思っている。


環境:
 Windows 7
  JDK6u20
  Eclipse 3.6
 App Engine SDK 1.3.7