GAE/Goで開発をしている際、GCPプロジェクトを本番用と開発用を作り、それぞれ別のapp.yamlを用いてデプロイしたい状況になった。
もう少し詳しく書くと、app.yamlファイルからincludeするyamlファイルを環境によって切り替えたくなった。なので、app.yamlを2つ用意してデプロイ時にapp.yamlを切り替えるという方法をとった。
プロジェクト構成
まず、プロジェクト内で本番用のディレクトリ(prod)と開発用のディレクトリ(dev)を作成する。
その中に
prod
|- main.go
|- app.yaml
|- prod.yaml
|- firebase_config.json
dev
|- main.go
|- app.yaml
|- dev.yaml
|- firebase_config.json
Makefile
こんな感じで
main.go ⇨ 最初に実行されるファイル app.yaml ⇨ デプロイに関する設定を記述しているファイル prod(dev).yaml ⇨ app.yamlからincludeされるファイル firebase_config.json ⇨ prod(dev).yamlから読み込まれるfirebaseの設定ファイルなど
を置く。
また、プロジェクトのルートに
Makefile
を置く。
app.yaml
app.yamlはこんな感じ
runtime: go
api_version: go1.9
env: standard
threadsafe: true
instance_class: F1
includes:
- prod.yaml
handlers:
- url: /.*
script: _go_app
secure: always
redirect_http_response_code: 301
それぞれの環境にあったyamlファイル(上記の場合はprod.yaml)をincludeする。
prod(dev).yaml
prod(dev).yamlはこんな感じ。
env_variables:
SECRET_PROJECT_ID: #プロジェクトID
CREDENTIALS: #firebaseの設定ファイルパス
main.go
main.goはこんな感じです。
package main
import (
"xxxxx/backend/infrastructure"
"google.golang.org/appengine"
)
func main() {
infrastructure.RegisterHandlers()
appengine.Main()
}
ルーティングを呼び出してます。
main.goは本番用も開発用も同じです。
切り替えるのはapp.yamlでincludeするyamlファイルです。
で、デプロイを冗長なコマンドでやっててもアレなんでMakefileでまとめておきます。
VER="deploy-version"
prod:
gcloud config set project プロジェクトID
goapp deploy -application プロジェクトID -version $(VER) ./deploy/app.yaml
dev:
gcloud config set project プロジェクトID
goapp deploy -application プロジェクトID -version $(VER) ./dev/app.yaml
下のコマンドでデプロイできます。
$ make prod VER=release
本番用なら make prod
開発用なら make dev
です。
VER
でデプロイするバージョンを指定できます。