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に
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のログを見ると、
のように、/_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の時間制限等があるので、アクセスできている、という感じではないです。