golang-migrateを使ってspannerのDBマイグレーションをする

アプリケーション

概要

spannerのDBマイグレーションで、golang-migrateを使ったのでメモ。

使い方

dockerで使う想定。 dockerではなくバイナリで実行していたが、ホストマシンのopensslのバージョンに依存して動作しない可能性あるようなので、コンテナ実行が無難だと思う。

MIGRATE_VERSION='v4.14.1'

docker run -v /migrations:/migrations -v ~/.config/gcloud/:/root/.config/gcloud --network host migrate/migrate:${MIGRATE_VERSION} -path=/migrations/ -database spanner://projects/<PROJECT ID>/instances/<INSTANCE>/databases/<DATABASE>?x-clean-statements=True <COMMAND>

COMMANDには、up、down、versionなど指定する。 cf. github.com - golang/migrrate/migrate/tree/aster/cmd/migrate#usage

ワンライナーで実行コマンドを書いたので見づらいと思うが、特に難しいとこはないと思う。

マウントしているやつは以下2つ。

-v /migrations:/migrations -v ~/.config/gcloud/:/root/.config/gcloud

/migrationsにはマイグレーション対象のsqlファイルを用意している。それをコンテナの/migrationsにマウント。

~/.config/gcloud/:/root/.config/gcloud はgcloudの認証を通すため。 credentialファイルをマウントして、環境変数GOOGLE_APPLICATION_CREDENTIALSをセットする形でも認証を通せるが、この方が楽なので・・

直近のgolang-migrateのバージョンではspannerの接続情報にはクエリパラメータが必要。

spanner://projects/<PROJECT ID>/instances/<INSTANCE>/databases/<DATABASE>?x-clean-statements=True

経緯はこのへん。