Cloud BuildからCloud Runをデプロイするときの環境変数の設定方法について
最近、やっとCloud Runを使い始めたのですが、Cloud Buildの構成スクリプト内で環境変数をいい感じにCloud Runに設定する方法が意外と見つからな方ので備忘録です。
以下のようなcloudbuild.yaml
があるとして、この中でCloud Runに環境変数を設定してデプロイする方法を考えていきたいと思います。
steps:
- name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}', '.' ]
- name: 'gcr.io/cloud-builders/docker'
args: [ 'push', '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}' ]
- name: 'gcr.io/cloud-builders/gcloud'
args:
- run
- deploy
- ${_SERVICE}
- --image
- ${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}
- --platform
- managed
- --region
- ${_REGION}
- --allow-unauthenticated
substitutions:
_LOCATION: asia-northeast1
_REPOSITORY: my-repository
_IMAGE: my-image
_SERVICE: my-service
_REGION: asia-northeast1
timeout: 1200s
最初に結論
- Secret Managerを使う
-
--set-secrets
オプションを使う
--set-env-vars
,--update-env-vars
が使えそう
構成ファイル内に環境変数を直接書きたくはないと思うので何かしらの方法で環境変数の値をファイル内で扱いたいのですが、Secret Managerを使うのが1番実用的でしょう。Secret Managerに設定した値を構成ファイル内でCloud Runに設定するには以下のようにすることができます。
steps:
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- -c
- |
gcloud run deploy ${_SERVICE} \
--image ${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE} \
--platform managed \
--region ${_REGION} \
--allow-unauthenticated \
--set-env-vars "FOO_BAR=$$FOO_BAR"
secretEnv: ['FOO_BAR']
availableSecrets:
secretManager:
- versionName: projects/example/secrets/FOO_BAR/versions/1
env: FOO_BAR
これでSecret Managerの値をCloud Runに設定することはできるが、設定する環境変数の数が多くなるとかなり冗長になるし、記載漏れが出そう。
ちなみに、上記のようにしてSecret Managerの値を使うにはentrypoint
にbash
を指定して、bash -c '...'
の形式でコマンドを実行する必要がある。
--env-vars-file
というのもあるらしい
yamlファイルに環境変数を設定して、それを指定することもできるらしい。しかし、結局yamlファイルに秘匿情報を書いてしまってはGitHubでバージョン管理もできないし、メンバー間で共有するのも難しいのでやはりSecret Managerを使いたい。
--set-secrets
を使いましょう
ややこしいことをせず--set-secrets
を使うことで直接Secret Managerの値をCloud Runに設定することができました。
steps:
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- -c
- |
gcloud run deploy ${_SERVICE} \
--image ${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE} \
--platform managed \
--region ${_REGION} \
--allow-unauthenticated \
--set-secrets="FOO_BAR=FOO_BAR:latest"
指定する環境変数の分だけ--set-secrets
を指定する。数が多くなると大変だけど他の方法よりはマシでしょう。
おわりに
Cloud RunにDBの情報のような秘匿情報を設定したい場合はSecret Managerを使うのが良いでしょう。そして、Cloud RunのデプロイにCloud Buildを使う場合は--set-secrets
を指定することでSecret Managerの値をCloud Runに設定することができます。
Cloud BuildのサービスアカウントにSecret Managerのアクセス権限が必要なのでそれだけ注意してください。
ちなみに、けっこうネットの情報を漁ったんですが普通に公式ドキュメントに書いてありました。
それにしてもこんなにデプロイ簡単にできるなんてCloud Run便利すぎる。
今回は以上です🐼
Discussion