🐙

Cloud Build と Secret Manager をいい感じに連携する

2021/07/06に公開

背景

これまでCloud BuildでPrivateなパッケージをインストールする際に、gcloudコマンドを叩いてSecret Managerから取得するという面倒なことをしていたのですが、もっと簡単な方法を見つけたので記事にしたいと思います。

やりたかったこと

Cloud Build上でサービスのビルドを行う際に、プライベートなパッケージをGithub Packages からインストールしています。
その際に、Secret ManagerからGithub Personal Access Token取得してパッケージインストール時に利用するというのが今回やりたかったことになります。

これまでのやり方

cloudbuild.yamlのstepsの中で gcloud secrets versions access コマンドを叩いてSecret Managerからsecretを取得し、余計な文字列を置換して、base64デコードした結果をファイルに突っ込みます。

以下のような感じです。

steps:
- name: gcr.io/cloud-builders/gcloud
  entrypoint: 'bash'
  args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]

このドキュメントを参考にしちゃっていました。
https://cloud.google.com/build/docs/securing-builds/use-encrypted-secrets-credentials?hl=ja

「Cloud Build Secret Manager」とググったときに、このやり方をしている記事が多くみられました。

このやり方でも問題はなかったのですが、 gcloud コマンドだと何をやっているのかパット見わかりづらく、余計な文字列の置換やデコードなどは黒魔術感もあり、できればもっと簡潔に記述したかったところでした。

今日見つけたやり方

cloudbuild.yamlってどういう書き方できるんだっけ?っていうのを思い出すために再度調べていたらこのドキュメントを発見しました。
https://cloud.google.com/build/docs/securing-builds/use-secrets#configuring_builds_to_access_the_secret_from

cloudbuild.yamlの availableSecretssecretEnv を使うやり方です。

steps:
- name: 'gcr.io/cloud-builders/docker'
  entrypoint: 'bash'
  args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
  secretEnv: ['USERNAME', 'PASSWORD']
availableSecrets:
  secretManager:
  - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION
    env: 'PASSWORD'
  - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION
    env: 'USERNAME'

このやり方では、 availableSecrets の部分でSecret ManagerのSecretを指定し、stepsの secretEnvavailableSecrets で指定したSecretを設定します。

secretEnv で指定したSecretは args の中で $$ という記号をSecret名の前につけることで参照することが可能です。

このやり方のおかげで、Cloud Buildの標準の設定を変更するだけで、簡単にSecret Managerからデータを取得して環境変数に展開することができました。
黒魔術的な要素もなくなってcloudbuild.yamlの見通しもかなり良くなりました😄

まとめ

Cloud BuildからSecret Managerのデータを引っ張りたいときは gcloud コマンドを叩くのではなく、 availableSecretssecretEnv を使いましょう。

Discussion