中山 康弘(なかやまやすひろ)
株式会社DTS所属

 米Googleは2008年5月,Google App Engineというサービスを一般公開しました。このサービスを利用すると,PythonによるWebアプリケーションを手軽に公開して運用することができます。今回は,このGoogle App Engineでのアプリケーション作成にチャレンジしてみましょう。

本記事は,執筆時に公開されていたGoogle App Engineプレビュー版に基づいて記述しています。正式版とは異なる可能性があります。

Google App Engineとは

 Google App Engineは,2008年4月7日に米国で開催されたCampfire Oneというイベントで発表されたWebアプリケーション開発環境です。

(編集注:この時点で発表されたプレビュー版は,限られた数の開発者に対して無料でサービスを提供していました。そして5月28日から本格的にサービスを開始し,料金体系を発表しました。基本的に従量課金制ですが,500Mバイトまでのストレージ利用または月間500万ページ・ビューまでのWebアプリケーションの利用に関しては,無料でサービスを提供するようです)

 同種のサービスに,Amazon EC2があります。大きな違いとして,Amazonの場合は,あくまでLinuxサーバー・インフラの仮想環境を提供するものであり,開発者がアプリケーションの実行環境を用意しなければなりません。

 これに対して,Google App Engineは,PythonのランタイムやGoogleのAPIが用意されているため,開発者はプログラミングに専念できる環境になっています。利用者はアプリケーションを開発するだけで,あとはそれをアップロードすれば,Googleのインフラで自動的にスケーリングまで面倒を見てくれるというのが強みです。

Google App Engineの特徴

 Googleで,Pythonが広く使われていることはよく知られていますが,このGoogle App EngineでもPythonを利用できます。将来的には,他の言語をサポートすることも計画されています。

 さてGoogle App Engineのプレビュー版では,開発者は三つまでアプリケーションを作成することができ,一つのアプリケーションに割り当てられるリソースは最大で以下のようになっていました。一般的なアプリケーションを作成して試すには,十分なリソースと言えるでしょう。

  • 500MBのストレージ
  • 10GBの上/下帯域
  • 200万MHzのCPU
  • 65万回のHTTPリクエスト
  • 16万回のURLフェッチAPI呼び出し

 Google App Engineでは,アプリケーションはサンドボックスと呼ばれる実行環境で動きます。この環境では,標準ライブラリを含み最初からPythonを実行できます。また,Googleユーザーアカウント,データストア(Datastore)アクセス,URLフェッチ,Emailサービスに関するAPIが提供されています。逆に,これ以外の方法を使用した外部アクセスはできません。

 アプリケーションへのアクセスも,標準ポートで待ち受けるHTTP/HTTPSしか使用できません。使用できるPythonのバージョンは2.5.2のみで,C言語での拡張などはサポートされず,利用できる標準ライブラリにも一部制限があります。サンドボックスでは,Python標準ライブラリやとGoogleのライブラリ,そしてアプリケーション・ディレクトリからPythonモジュールをインポートできます。

APIの利用方法

 Google App Engineで利用できる代表的なAPIに関して,簡単なサンプルを使って説明しましょう。

◆ユーザーAPI

 ユーザーAPIを利用すれば,Googleアカウントでユーザーを認証できます。ユーザーのニックネーム,Emailアドレスを取得することも可能です。サインインしているユーザー名を取得する,単純なサンプル・コードを以下に記述します。

from google.appengine.api import users

user = users.get_current_user()
if user:
  print "Hello, %s!" % user.nickname()
リスト1●サインインしているユーザー名を取得するサンプル

 ユーザーAPIの詳細は,Google App Engineのページ「The Users API」に記述されています。

◆データストア

 Google App Engineでは,Python向けのデータストアAPIが提供されています。バックエンドには,MySQLやPostgreSQLに代表されるようなRDBMSではなく,GoogleのBigTableが採用されています。このデータストアAPIにより,SQLライクな問い合わせ言語「GQL」でデータの永続化を行うことができます。モデルを定義するには,以下のようにします。

from google.appengine.ext import db

class Diary(db.model):
  title = db.StringProperty()
  author = db.UserProperty()
  content = db.StringProperty(multiline=True)
  date = db.DateTimeProperty(auto_now_add=True)
リスト2●データストアAPIを使ってモデルを定義するサンプル

 作成したこのモデルに対して,GQLでCRUD(Create,Read,Update,Delete)操作ができます。

diary_today = db.GqlQuery("SELECT * FROM Diary where diary.author = :1",
                           users.get_current_user())
リスト3●GQLでデータアクセスするサンプル

 データストアAPIの詳細に関しては,「The Datastore API」にあります。

◆URLフェッチ

 URLフェッチAPIを利用して,外部のURLにアクセスし,その情報を取得したり,情報を送信したりできます。前回紹介したスクレイピングのようなこともできます。大ざっぱなコードは以下の通りです。

from google.appengine.api import urlfetch

result = urlfetch.fetch(url)
if result.status_code == 200:
    doSomething(result.content)
リスト4●URLフェッチを使ったサンプル

 HTTPおよびHTTPS経由で外部から情報を取得します。五つのHTTPメソッド(GET/POST/HEAD/PUT/DELETE)をサポートしています。レスポンスとして返ってきた情報の処理,例外の捕捉も可能です。

 このようにGoogle App Engineでの開発は,Google環境に特化した開発手法を用いる必要があります。その見返りとして,アプリケーションのスケーラビリティやインフラ・アーキテクチャの設計など,運用に関することをGoogleに任せるわけです。