はじめに
前回までで,WSGIアプリケーションの仕様,アプリケーションの作成,ミドルウェアの利用などの,WSGIの基本的な部分の説明が終わりました。
今回は,作成したWSGIアプリケーションを実行するプラットフォームとして,Google App Engine(GAE) を取り上げます。
Google App Engineとは
Google App Engineとは,Googleが提供しているWebアプリケーションのプラットフォームです。基本的に無料でGoogleのスケーラブルなWebアプリケーションインフラで,自作のWebアプリケーションを動作させることができます。アプリケーションはアカウントごとに10個まで利用できます。アプリケーションごとに利用可能なストレージ容量, CPU 処理時間,データ転送量などのサーバリソースの制限はありますが,月500万ページビュー規模までは利用できる程度の制限ということなので,個人が利用するには十分だと思います。具体的な制限事項はGAEのFAQに詳しく記載されているので,必要な方は参照してください。
この記事を執筆している2008年8月現在,GAEでサポートしている言語はPythonのみです。今後Perlをサポートする予定があるようですが,具体的な時期は発表されていません。
アプリケーションの管理には, Webベースのインターフェースが用意されていて,その画面からアクセスログ,データベースに保存されたデータの確認・変更,クオータの使用量の確認などができます。現在は管理画面からアプリケーションを削除する機能がないため,10個の制限いっぱいまでアプリケーションを作ろうとしている方は,今回のサンプルをアップロードしてみるのは控えた方が良いかもしれません。
GAEで動作させるWebアプリケーションは,GAEサーバ側からCGIとして呼び出されます。そこで,wsgiref.handlers.CGIHandlerを使用して,CGIからWSGIアプリケーションを呼び出すようにすることで,GAEサーバ上でWSGIアプリケーションを動作させることができます。
今回は使用していませんが,GAEにはwebappという専用のフレームワークが用意されています。webappには, URLマッピング, Djangoというフレームワークで使われているテンプレートエンジンへのラッパ, Googleのユーザ認証を利用するためのユーティリティなどが存在します。
webappも,Webサーバとの接続にWSGIを使用するため,webappでアプリケーションを作成する際も,既存のミドルウェアを組み合わせて作成することができます。
GAE SDKでの開発
今回は,実際にGAEのサーバでアプリケーションを動作させる前の段階として,ローカルで開発するためのSDKを使用してアプリケーションを動作させてみます。
今回使用するサンプルプログラムは,sample.zip(ZIPで圧縮してあります)にあります。今回のサンプルは,前回同様Hello, worldとMessageBoardです。基本的にソースコード自体はほとんど変わりません。変更したのは,メッセージの保存にGAEで提供されるデータベースを使用していることと,実行方法をWSGIサーバからCGIハンドラに変更した程度です。そのため,見た目の動作はまったく同じです。
今回は,実際にGAE上でサンプルを動かしています。以下のURLでアクセスできますので,実際にアクセスして前回までのサンプルと比較してみてください。
- Hello, World サンプル
- MessageBoardサンプル
SDKのダウンロードとサンプルの実行
実際のサーバで開発を行う前に,ローカルで開発を行うためのSDKを使用してサンプルを動作させることができます。
まず,GAEのダウンロードページにアクセスして,ご使用のプラットフォームに合ったSDKをダウンロード,インストールしてください。
そして,インストール先のディレクトリに移動し,
図2
$ ./dev_appserver.py ${サンプルのディレクトリ}
とコマンドを入力すると,サンプルが実行できます。
実行後に http://localhost:8080/helloとhttp://localhost:8080/messageにアクセスすると,前回と同様にページが表示されます。
それでは,前回から追加された部分のースの中身を見ていきましょう。
メッセージボード移植
サンプルプログラムの中身で,前回から追加されたものは,
app.yaml
appmain.py
model.py
です。
app.yamlは,アプリケーションを動作させるために必要な設定ファイルです。
appmain.pyは,アプリケーションのエントリポイントで,この中でミドルウェアやアプリケーションの設定を行い,処理しています。
model.pyは,書き込みデータをDBに保存するための設定と,入出力のための関数を定義しています。
appmain.pyは,今まで使用していたwsgiref.simple_server.make_serverをwsgiref.handlers.CGIHandlerに変更しただけですので,説明は割愛します。

