LoginSignup
12

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-08-09

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12