読者です 読者をやめる 読者になる 読者になる

GoogleAppEngineのBackendsについてメモ

Python GoogleAppEngine

仕事で使うことがあったけど、忘れそうなのでメモ。
AppEngineのバックエンドインスタンス(Backends)について。
Backends Python API Overview  |  Python  |  Google Cloud Platform
ここではdynamicインスタンス、フロントエンドと同じコードをデプロイする前提で書く。
試したのはpython27ランタイム。

コードの用意

dynamicの場合はwarmup同様、/_ah/startに最初にアクセスが来るので、初期化が必要な場合はこのパスで処理する。
Python2.7でも特に問題はなし。

backends.yamlの用意

動作モードやバックエンドインスタンスを動かす仮想マシンインスタンス数などを設定するため、まずはbackends.yamlを用意する。

backends.yaml
backends:
- name: mybackends
  class: B1
  options: dynamic
  instances: 2

mybackendsという名前(バージョン)で、B1インスタンス(デフォルトはB2)、dynamicで2インスタンスまで。

デプロイ

バックエンドへのコードのデプロイはappcfg.pyで行うが、backendsのコマンドを使う必要がある。

$ appcfg.py backends . update

deferredモジュールでバックエンドインスタンスにタスクを投げる

TaskQueueのラッパーであるgoogle.appengine.ext.deferredは、TaskQueueと同様にタスクを実行するアプリケーションのバージョンを指定できる。これにバックエンド名を指定することで、バックエンドにタスクを実行させることもできる。
mybackendsという名前のバックエンドにタスクを実行させる場合は、フロント側でこんな感じに書く。

import logging
from google.appengine.ext import webapp
from google.appengine.ext import deferred

def lazy_task(spam, egg):
    """バックエンドで実行されるタスク
    """
    logging.info("lazy - %s, %s" % (spam, egg))

class MyHandler(webapp.RequestHandler):
    def get(self):
        deferred.defer(lazy_task, "arg1", "arg2", _target='mybackends')

defer関数のキーワード引数で_targetにバックエンド名を指定する。
_targetにapp.yamlのversionを指定すると、指定したバージョンでタスクを実行することもできる。