GCP サービスのエミュレータを Docker で起動する

GCP の Bigtable や Spanner などを利用するアプリケーションの開発をするとき、 エミュレータを利用すると課金がされないので便利。

エミュレータは Google Cloud SDK のコンポーネントとして提供されているが Docker イメージも提供されている。

エミュレータの Docker イメージは GCR に公開されていてドキュメント では GCR からプルしているが、 Docker Hub でも公開されている。

1
$ docker image pull google/cloud-sdk:342.0.0-emulators

このエミュレータには Spanner, Bigtable, Datastore, Firestore, Pub/Sub のエミュレータが含まれている。 今回は Spanner と Bigtable を起動してみる。

使い方

Google Cloud SDK はインストール済みとする。

エミュレータ用の設定を作成する

エミュレータ用の設定を作っておく。

1
2
3
$ gcloud config configurations create emulator
Created [emulator].
Activated [emulator].

認証を無効にする。

1
2
$ gcloud config set auth/disable_credentials true
Updated property [auth/disable_credentials].

プロジェクトを設定する。

1
2
$ gcloud config set project $GOOGLE_CLOUD_PROJECT
Updated property [core/project].

gcloud で Spanner エミュレータを操作できるように Spanner エミュレータのエンドポイントを設定する。 指定するエンドポイントは後ほど Docker で起動する REST 用のエンドポイント。

1
2
$ gcloud config set api_endpoint_overrides/spanner http://localhost:9020/
Updated property [api_endpoint_overrides/spanner].

以降はこの設定が有効な状態で進める。 設定の切り替えは gcloud config configurations activate CONFIG_NAME で行う。 デフォルトの設定に戻すときは gcloud config configurations activate default とする。

Spanner エミュレータ

Spanner エミュレータを起動する。

1
2
$ docker container run -d -p 9010:9010 -p 9020:9020 --name spanner-emulator --rm \
  google/cloud-sdk:342.0.0-emulators gcloud beta emulators spanner start --host-port 0.0.0.0:9010

--host-port はデフォルトでは localhost:9010 になっているが、コンテナ外からアクセスするために 0.0.0.0:9010 を指定する。

エミュレータにインスタンスを作成する際は --config オプションに emulator-config を指定する。

1
$ gcloud spanner instances create test-instance --config=emulator-config --description="Test Instance" --nodes=1

データベースの作成は通常通りできる。

1
2
$ gcloud spanner databases create test-db  --instance=test-instance \
  --ddl='CREATE TABLE Sample (Id INT64 NOT NULL, Text STRING(255) NOT NULL) PRIMARY KEY (Id)'

エミュレータのエンドポイントを環境変数 SPANNER_EMULATOR_HOST でエクスポートする。

1
$ export SPANNER_EMULATOR_HOST=localhost:9010

環境変数 SPANNER_EMULATOR_HOST をエクスポートしておくと Spanner のクライアントである spanner-cli で接続できる。

1
spanner-cli --project=${GOOGLE_CLOUD_PROJECT} --instance=test-instance --database=test-db

Bigtable エミュレータ

Bigtable エミュレータもコンテナ外からアクセスするために --host-port 0.0.0.0:8086 を指定して起動する。

1
2
$ docker container run -d -p 8086:8086 --name bigtable-emulator --rm \
  google/cloud-sdk:342.0.0-emulators gcloud beta emulators bigtable start --host-port 0.0.0.0:8086

エミュレータのエンドポイントを環境変数 BIGTABLE_EMULATOR_HOST でエクスポートする。

1
$ export BIGTABLE_EMULATOR_HOST=localhost:8086

環境変数 BIGTABLE_EMULATOR_HOST をエクスポートしておくと Bigtable のクライアントである cbt で接続できる。

Bigtable エミュレータではインスタンスを作成する操作は不要で直接テーブルを作成できる。

1
$ cbt createtable my-table