🚴

Cloud BuildからCloud Runをデプロイするときの環境変数の設定方法について

2024/04/01に公開

最近、やっとCloud Runを使い始めたのですが、Cloud Buildの構成スクリプト内で環境変数をいい感じにCloud Runに設定する方法が意外と見つからな方ので備忘録です。

以下のようなcloudbuild.yamlがあるとして、この中でCloud Runに環境変数を設定してデプロイする方法を考えていきたいと思います。

cloudbuild.yaml
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の値を使うにはentrypointbashを指定して、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のアクセス権限が必要なのでそれだけ注意してください。

ちなみに、けっこうネットの情報を漁ったんですが普通に公式ドキュメントに書いてありました。

https://cloud.google.com/run/docs/configuring/secrets?hl=ja#command-line

それにしてもこんなにデプロイ簡単にできるなんてCloud Run便利すぎる。

今回は以上です🐼

GitHubで編集を提案

Discussion