Edited at

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

More than 3 years have 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の時間制限等があるので、アクセスできている、という感じではないです。