Help us understand the problem. What is going on with this article?

本番のCloud Datastoreのデータを、ローカル環境にインポートする

Google App Engine(GAE)で動作しているアプリケーションがあります。
DBとしてCloud Datastoreを利用しており、開発環境を一新するにあたって、本番のデータをローカルでもそのまま使おうと思いました。

以前 https://noboru.hatenablog.jp/entry/20130212/1360679541 を書いていましたが、いろんなものがバージョンアップされていたので、最新の方法でやってみようと思います。

前提

Cloud Datastoreにデータが溜まっていること。
ローカルでは、 dev_appserver.py を利用していること。
gcloud などのツールが設定済みで、対象のプロジェクトに接続可能なこと。

データのエクスポート

公式: https://cloud.google.com/datastore/docs/export-import-entities?hl=ja#starting_managed_export_and_import_operations

まずは、Cloud Datastoreの情報をエクスポートします。
エクスポート先として、Cloud Storageを指定する必要があるので、バケットを作成しておきます。
(今回は、いつの間にかあったものを利用しました。GAEの環境と同時に作成された?)

バケット名: my-android-server.appspot.com
保存先フォルダ: datastore

gcloud datastore export --namespaces="(default)" gs://my-android-server.appspot.com/datastore

これにより、Cloud Storageの対象のフォルダに、
1つの datastore.overall_export_metadata ファイルと、
default_namespace フォルダに含まれる大量の output-0 のようなバイナリファイルができます。

image.png

データをローカルにダウンロード

公式: https://cloud.google.com/storage/docs/gsutil/commands/cp

次のインポートでは、ローカルのデータを利用するため、一旦ローカルにデータを持ってきておきます。
大量にファイルがあるのですが、Webのダッシュボードからは一括でダウンロードする手段が見あたらなかったので、 gsutil を利用してダウンロードします。

gsutil cp -r gs://my-android-server.appspot.com/datastore .

これにより、カレントディレクトリに datastore ディレクトリが作成され、配下のファイルもダウンロードされます。

ローカルサーバの起動

公式: https://cloud.google.com/appengine/docs/standard/python/tools/using-local-server

Google App Engineのローカル開発環境を立ち上げるため、 dev_appserver.py を起動します。

dev_appserver.py app.yaml --datastore_path=`pwd`/database/db.datastore -A my-android-server --support_datastore_emulator True

この際に、 --datastore_path を指定しておくことで、ファイル位置を指定しておきます。(削除など
また、 -A でAPP_IDを指定しておかないと、次のcurlで指定するPROJECT_IDがうまく指定できないようです。

起動時のログで、下記のようにCloud Datastore emulatorのアドレスが表示されます。

INFO 2019-03-09 04:51:02,232 datastore_emulator.py:155] Starting Cloud Datastore emulator at: http://localhost:16895

ローカルのDatastoreにデータをインポート

公式: https://cloud.google.com/datastore/docs/tools/emulator-export-import

https://cloud.google.com/datastore/docs/reference/admin/rest/v1/projects/import
これと同じものが実装されているようです。

curl -X POST "localhost:16895/v1/projects/my-android-server:import" -H 'Content-Type: application/json' -d '{"inputUrl":"datastore/datastore.overall_export_metadata"}'

ポートは、起動時に表示されていたCloud Datastore emulatorのポートを指定します。
inputUrl の指定は、相対パスで良いようです。
PROJECT_ID として、サーバ起動時に -A として渡していた APP_ID を指定します。

レスポンスとして、下記のような結果が返ります。

{
  "name": "projects/my-android-server/operations/72cc047a2c254d85b703adb6ed5ac35f",
  "metadata": {
    "@type": "type.googleapis.com/google.datastore.admin.v1.ImportEntitiesMetadata",
    "common": {
      "startTime": "2019-03-09T05:01:28.442Z",
      "endTime": "2019-03-09T05:01:37.128Z",
      "operationType": "IMPORT_ENTITIES",
      "state": "SUCCESSFUL"
    },
    "entityFilter": {
    },
    "inputUrl": "datastore/datastore.overall_export_metadata"
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.protobuf.Empty"
  }
}

(ちなみに、 PROJECT_ID の指定が間違っていても "state": "SUCCESSFUL" となりますが、次の確認の部分で表示されない状態になります。)

確認

http://localhost:8000/datastore をブラウザで開いて、本番と同じデータが表示されれば成功です。

image.png

参考

https://qiita.com/aql/items/9754b23a7d23544b1c10

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away