LoginSignup
1
0

More than 1 year has passed since last update.

GAEのデプロイされたversionで接続先DBを変更する

Last updated at Posted at 2018-06-10

環境ごとにバージョンを検知して違う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の書き換えの下りはいらないですね。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0