Google Cloud Datastore Emulatorを使う

Google Cloud Datastore Emulatorを使うことでクラウド上のDatastoreを使わずにローカルでDatastoreを建てて開発することができるようになります.
Firebase Datastoreも実質これなので使ってみました.

環境

 1$ gcloud version
 2Google Cloud SDK 212.0.0
 3beta 2018.07.16
 4bq 2.0.34
 5cloud-datastore-emulator 2.0.1
 6core 2018.08.13
 7gsutil 4.33
 8kubectl
 9$ firebase -V
104.1.0

環境構築

前提パッケージのjreを入れておきます.

1$ sudo apt install openjdk-8-jre

Google Cloud Datastore Emulatorをインストールします.

1$ gcloud components install cloud-datastore-emulator

使い方

gcloudでデフォルトプロジェクトを指定していない場合は``--project```でプロジェクトを指定しておきます.

 1$ gcloud beta emulators datastore start --project hoge
 2Executing: /Google/Cloud SDK/google-cloud-sdk/platform/cloud-datastore-emulator/cloud_datastore_emulator create --project_id=hoge ~/.config/gcloud/emulators/datastore
 3[datastore] Aug 17, 2018 7:03:38 PM com.google.cloud.datastore.emulator.CloudDatastore$CreateAction$1 apply
 4[datastore] INFO: Provided project_id to Cloud Datastore emulator create command, which is no longer necessary.
 5[datastore] Created new Cloud Datastore project in '~/.config/gcloud/emulators/datastore'.
 6Executing: /Google/Cloud SDK/google-cloud-sdk/platform/cloud-datastore-emulator/cloud_datastore_emulator start --host=localhost --port=8081 --store_on_disk=True --consistency=0.9 --allow_remote_shutdown ~/.config/gcloud/emulators/datastore
 7[datastore] Aug 17, 2018 7:03:39 PM com.google.cloud.datastore.emulator.CloudDatastore$FakeDatastoreAction$8 apply
 8[datastore] INFO: Provided --allow_remote_shutdown to start command which is no longer necessary.
 9[datastore] Aug 17, 2018 7:03:40 PM com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub <init>
10[datastore] INFO: Local Datastore initialized:
11[datastore]     Type: High Replication
12[datastore]     Storage: ~/.config/gcloud/emulators/datastore/WEB-INF/appengine-generated/local_db.bin
13[datastore] Aug 17, 2018 7:03:40 PM com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub load
14[datastore] INFO: The backing store, ~/.config/gcloud/emulators/datastore/WEB-INF/appengine-generated/local_db.bin, does not exist. It will be created.
15[datastore] Aug 17, 2018 7:03:40 PM io.gapi.emulators.netty.NettyUtil applyJava7LongHostnameWorkaround
16[datastore] INFO: Applied Java 7 long hostname workaround.
17[datastore] API endpoint: http://localhost:8081
18[datastore] If you are using a library that supports the DATASTORE_EMULATOR_HOST environment variable, run:
19[datastore]
20[datastore]   export DATASTORE_EMULATOR_HOST=localhost:8081
21[datastore]
22[datastore] Dev App Server is now running.

ログにもある通り環境変数を設定するとエミュレータ環境を見るようになります.
自動で環境変数を生成してくれるコマンドがあるので使います.

1$ $(gcloud beta emulators datastore env-init)

あとは普通にdatastoreに接続するとエミュレータ環境にアクセスすれば良いです
ただjsonとか使ってると環境変数を見ないので注意します

 1from google.cloud import datastore
 2
 3# こちらだとクラウド側にアクセスしてしまう
 4# clinet = datastore.Client.from_service_account_json("/path/to/json", project="hoge")
 5client = datastore.Client()
 6key = client.key("sample")
 7
 8entity = datastore.Entity(key=key)
 9entity["created"] = datetime.now()
10entity["name"] = "taro"
11client.put(entity)