環境ごとにバージョンを検知して違うDBに接続したい
GoogleAppEngineにはプロジェクト、サービス、バージョンという概念があります。
CircleCIなどのCIツールで、異なるバージョンのコードを異なるバージョンとしてデプロイして、サブドメインを切って(自動で生成)接続先ごとに、本番環境、ステージング環境、テスト環境。。。等に振り分けて、サブドメインごとに違うDBに接続したいと思いました。
問題
google.golang.org/appengine
ライブラリには、appengine.VersionID()
というメソッドが用意してあるので、それが使えるのではないかと思いました(最初はね)。
ところが、このメソッドはcontext.Context()
を引数に取るので、今回のケースでは使えません。というのも、dbに接続するのはinit()
の中であり、その時点ではまだcontextを引っ張ってくることができないからです。
解決策
やれやれ困ったなどうしようかと思ってググったら解決している人がいました。
解決策?
init.go
の中で、app.yamlに記述してある version: hogehoge
を参照すればバージョンわかるくね!ということだったのでなるほど!確かに。そうすることにしました。
CircleCIでブランチごとに自動でデプロイ先のバージョンを切り替えていたのですが。。。。
deploy-test: &deploy-test
run:
name: Test Deployment
command: |
appcfg.py --oauth2_access_token $(gcloud auth print-access-token) -V バージョン名 update ./app/app.yaml
こうすると、app.yamlに記述されたversionは変更されることなく(デフォルトはv1)、バージョン名
というバージョンにデプロイされます。これだと、結局、コードを走らせた時に検知することができないので、app.yamlを.config.yamlの前後の行で書き換えてデプロイすることにしました
deploy-test: &deploy-test
run:
name: Test Deployment
command: |
sed -i -e s/v1/バージョン名/ app/app.yaml
appcfg.py --oauth2_access_token $(gcloud auth print-access-token) -V バージョン名 update ./app/app.yaml
sed -i -e s/バージョン名/v1/ app/app.yaml
rm -rf app/app.yaml-e
一件落着。
もっといい方法あったら教えてください。。。
追記
そもそも、app.yamlにバージョン指定を毎回書くのは推奨ではないそう。
The recommended approach is to remove the version element from your app.yaml file and instead, use a command-line flag to specify your version ID:
なので、app.yamlの書き換えの下りはいらないですね。