Cloud Build と Secret Manager をいい感じに連携する
背景
これまで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" ]
このドキュメントを参考にしちゃっていました。
「Cloud Build Secret Manager」とググったときに、このやり方をしている記事が多くみられました。
このやり方でも問題はなかったのですが、 gcloud
コマンドだと何をやっているのかパット見わかりづらく、余計な文字列の置換やデコードなどは黒魔術感もあり、できればもっと簡潔に記述したかったところでした。
今日見つけたやり方
cloudbuild.yamlってどういう書き方できるんだっけ?っていうのを思い出すために再度調べていたらこのドキュメントを発見しました。
cloudbuild.yamlの availableSecrets
と secretEnv
を使うやり方です。
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の secretEnv
で availableSecrets
で指定したSecretを設定します。
secretEnv
で指定したSecretは args
の中で $$
という記号をSecret名の前につけることで参照することが可能です。
このやり方のおかげで、Cloud Buildの標準の設定を変更するだけで、簡単にSecret Managerからデータを取得して環境変数に展開することができました。
黒魔術的な要素もなくなってcloudbuild.yamlの見通しもかなり良くなりました😄
まとめ
Cloud BuildからSecret Managerのデータを引っ張りたいときは gcloud
コマンドを叩くのではなく、 availableSecrets
と secretEnv
を使いましょう。
Discussion