Python
GAE
AppEngine
datastore

Datastoreに外部からアクセスする方法

More than 1 year has passed since last update.

GAE/pyな環境でDatastoreにアクセスしていますが、GCEやローカル環境からアクセスしたくなることもあります。

方法は2つくらいあると思います。

  • GAEのRemote API (remote_api_shell.py)
  • Google Cloud Datastore API (gcloud-python)

他にもアプローチはありそうですが。。

  • Google Cloud Datastore RPC APIのラッパーライブラリ
  • GAEのTask Queue

など。

Remote APIを使う

Accessing App Engine with Remote API
標準の機能としてRemote APIがあります。
gcloud sdkでpython sdkを入れる?とremote_api_shell.pyにパスが通っていると思います。
さらにGAEのapp.yamlに

app.yaml
application: PROJECT_ID
version: 1
runtime: python27
api_version: 1

## ここを追加
builtins:
- remote_api: on

のようにbuiltinsのremote_apiを有効にします。

その状態でdeployが完了すると、

$ remote_api_shell.py PROJECT_ID

とすることでローカルのpython環境からリモートのdatastoreなどに直接触れると思います。
ローカル環境でgoogle.appengine.ext.ndbがimportできる環境だと、ndbのモデルもimportしてAppEngine上と同じようにアクセスできて便利です。

from google.appengine.ext import ndb

class MyModel(ndb.Model):
    number = ndb.IntegerProperty(default=42)
    text = ndb.StringProperty()

# GAE上で取得するようにリモートのデータを取得できる。
models = MyModel.query().fetch()

ただし、注意点として、かなり遅いです。
原因を調べようとしてGAEのログを見ると、
スクリーンショット 2016-08-09 17.57.32.png

のように、/_ah/remote_apiあてにhttpリクエストが発生しています。おそらくquery単位でhttpリクエストをたくさんしているためにオーバーヘッドが大きくなって処理が重いのかな、と思います。

Cloud Datastore APIを使う。

今年になってリリースされたGoogle Cloud Datastore APIを使うとパフォーマンスの問題は解決しそうです。
Google Cloud Datastore API 新ベータでパフォーマンスが大幅アップ

こちらの記事を見ながらやると分かりやすいです。
Getting started with the Google Cloud Datastore API

gcloudコマンドが有効な状況で

$ pip install gcloud

とするとgcloud-pythonがインストールできます。

gcloudのauthが有効ならpythonのスクリプトやコンソールからdatastore関連のライブラリをimportして使うことができます。

from gcloud import datastore

client = datastore.Client(PROJECT_ID)
# こうするとqueryでiteratorが取得できる。
task = cli.query(kind='Task').fetch()

使い方はチュートリアルや以下のgithubページを確認してください。
gcloud-python

まずremote apiに比べてパフォーマンスがいいです。
また、datastoreにセッションを貼ったままなのか、iteratorも遅延fetchでcursorがそこに来るたびに通信して取得しているようです。
そのため、Remote APIのようにたくさんの情報を取得しようとすると固まったり、することが少ないです。

注意点

注意点としてはまだbeta版なので仕様などは色々変更になる可能性があります。
また、gcloudの認証が通っている環境である必要があります。
さらに、ndbのようなORMapperがないので、ちょっと編集などがしづらく、GAEのコードに影響を与える可能性もあります。

とはいえ、GCE環境からアクセスするときなどには都合がいいので、これからは是非こちらのAPIを使うべきでしょう。
正式リリースではndb等が使えるようになるかもしれません。

Google Cloud Datastore RPC APIのラッパーライブラリ

Datastore RPC APIのpythonラッパーライブラリが公式に用意されています。
GoogleCloudPlatform/google-cloud-datastore :googledatastore

一応、RPC APIのアップデートに追従してメンテは細々とされているようです。

ただ、authenticate credentialが必要だったり、interfaceがすこし古い感じなので、あまりお勧めはできなさそうです。

Task Queue

Push Queueなどを上手く使えば外部トリガーでDatastoreの情報の書き換えなどはできます。
ただ、あらかじめtaskを用意しておいたり、taskの時間制限等があるので、アクセスできている、という感じではないです。