2021年NI+C Advent Calendar 2021の16日目です
#はじめに
最近はミニマムなサイズのSpannerが選択できるようになりましたが、まだまだお高い+開発環境としてローカルにSpannerがほしいっていうニーズがあるかと思います。
ちょっと前まではコンテナベースでエミュレータがあったのですが、今はCLI(gcloudコマンドで完結)でできるようになったので流れをまとめたいと思います。
#確認環境
- Cloud shell
- gcloud コマンド導入済み
#準備
多分こちらのコマンドを打つと、Spannerのエミュレータの最新版が入るはず。
sudo apt-get install google-cloud-sdk-spanner-emulator
もし後続でうまく行かないことがあれば下記のコマンドで、各種コンポの最新化を実施してください。(このコマンドを打つとこれを実施してね、とapt-get コマンドが表示されます)
gcloud components update
流れとしては下記になります。
- エミュレータサービスの起動(Google CloudのSpannerサービスをローカルに起動する)
- Spanner APIのコール先の指定(ローカルに向ける)
- エミュレータにSpannerインスタンスを立てる
- 内製プログラムの実行
1. Spannerエミュレータサービスの起動
まず、ローカル(今回はCloud Shell)にエミュレータを下記コマンドで起動します。
gcloud emulators spanner start
こちらのコマンドを実施すると、サーバ(サービス)が起動するので、後続の作業は別プロンプト等を使用してください
2. Spanner APIのコール先の指定(ローカルに向ける)
通常gcloudコマンドを実施すると、本物のGoogle Cloudに命令がとどいてしまいます。今回は、gcloudコマンドをローカルのエミュレータに到達させてたいです。
そのため、Spannerに関するAPIのエンドポイントを下記コマンドにてローカルにひん曲げます。
gcloud config configurations create emulator
gcloud config set auth/disable_credentials true
gcloud config set project your-project-id
gcloud config set api_endpoint_overrides/spanner http://localhost:9020/
- 1行目の confifurations craete で専用のプロファイルを別途作成
- 4行目で SpannerのAPI エンドポイントをローカルホストの9020ポートでオーバライドしている感じです。
3. エミュレータにSpannerインスタンスを立てる
上記の手順までは、まだ、空のSpannerサービスがローカルにある状態です。
ここから、具体的にSpannerのインスタンスを立てることになります。
gcloud spanner instances create test-instance \
--config=emulator-config --description="Test Instance" --nodes=1
一旦サンプルを記載しますが、後続で影響があるポイントとしては、下記になります。
- create [instance_name]
- DB作成時や、コード実施時に影響。本気でやろうとしたときは環境変数化が吉
- --nodes= [n]
- 今回はパフォーマンス検証を目的にしていないので、言及しないですが、パフォーマンスも含めて挙動確認が必要ならnodesを増やしてみてください。(そもそも今回の検証はCloud shell上ですので、、、1で実施しています)
4.内製プログラムの実行
手順3までで、Spannerのインスタンスの作成ができました。
この後実施するのがDBの作成・・・となります。
今回は実行環境が比較的ライトに揃うPythonを使って確認します。
環境変数設定
サンプルのpythonコードのSpanner参照先を指定しています。
手順2で実施したのは、あくまでgcloudコマンドのAPIエンドポイントをオーバライドしましたが、この手順では、Pythonの実行向き先を変更している形になります。
export SPANNER_EMULATOR_HOST=localhost:9010
ソースコード取得及びpython実行環境用意
Gitに公開されているサンプルコードを取得し、pipにてライブラリを取得しています。
mkdir tmp_spanner_emu_test
cd tmp_spanner_emu_test
git clone https://github.com/googleapis/python-spanner
cd python-spanner/samples/samples
virtualenv env
source env/bin/activate
pip install -r requirements.txt
コード実行
下記コマンドを実行し、DBを作成するサンプルコードを実行します。
※もし、PJ IDがyour-project-id以外を向いていたら、再度手順2を実施してください
python snippets.py test-instance --database-id example-db create_database
- 第2引数で手順3で指定したインスタンス名を設定しています。
下記の戻り値があれば成功です。
Created database example-db on instance test-instance
#終わりに
いかがでしょうか。結構簡単にローカル環境にSpanner環境が構築できたと思います。
分散RDBで世界を変えてくれそうなSpannerさん。でも開発環境の用意が費用の関係でできないことも多々あるかと思います。
そういったときに上記の手順で、ローカル環境にエミュレータを構築し、開発を促進していければと思います。
追伸
gcloud上で "your-project-id"ってなにか特殊だったりするのかなぁ。