🪨

GCPのCloudBuildとSecretManager連携でつまづいた!!

2023/11/13に公開
1

はじめに

CloudBuildでバックエンドの自動デプロイ環境とSQLの自動マイグレーション環境を構築してHAPPYになっていた私。しかしCloudBuild.yamlにDBのパスなどの機密情報ベタ書きだったのでSecretManagerを使うことに。API有効化なども忘れずに行い、トリガーも作動してSecretManagerとの連携ができている、、、と思いきやある朝開発環境でクエリを叩くとこんなエラーが

"models: failed to execute a one query for hoge: bind failed to execute query: pq: password authentication failed for user \"$DB_USER\"",

なるほどね〜まあ多分環境変数にうまいことDBのユーザ名とかパスワードが渡されてないんやろな〜、ちょちょっとSecretManagerとかいじれば治るやろ。

そんな甘い考えの私は1hくらい溶かしました。

そんな人間を二度と生み出さないためにも後世にこの記事を残します。

つまづいたポイント

cloudbuild.yaml ファイルでのシークレットの参照方法で正しい構文と手順を理解するのに苦労😭

やりがちなミスと修正方法まとめ

cloudbuild.yaml の修正

ビルドステップでシークレットを参照するために、secretEnv フィールドを使用し、entrypointbash に設定しました。これにより、環境変数としてシークレットを安全に注入できるようになりました。コレとても大事!!!

  # ... Zenryaku ...
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk:slim'
    entrypoint: 'bash'
  # ... Kouryaku ...

コレとても大事です。忘れがちだし公式ドキュメントに書いてあるんですけど見落としがち。

ビルドステップで bash ツールを使用するには、bash を指す entrypoint フィールドを追加し? ます。これは、シークレットの環境変数を参照するために必要です。
https://cloud.google.com/build/docs/securing-builds/use-secrets?hl=ja

嘘です。バッチリ書いてあります。しかも必要ってむっちゃ強調されてます。
これで私は詰まり祭りしてました。

環境変数の参照

シークレットは $$ を接頭辞とする環境変数として参照されます。例えば、DB_USER$$DB_USER として参照します。

    secretEnv:
      - DB_PASSWORD
      - DB_USER
      - DB_HOST

こうやってsecretEnvフィールドに書くだけ書いて満足してはいけない。
一回ChatGPTに書くだけで満足していいよって嘘つかれたので。

環境変数の設定

--set-env-vars オプションを使用して、複数の環境変数を設定しました。これには特殊な構文 ^@^@ が使用され、これにより複数の環境変数を一つのコマンドライン引数内で設定できました。(最終的に読みにくいからやめた)

vars=^@^API_PORT=8080@DB_PORT=5432@DB_NAME=hogehoge-db@_CLOUD_RUN=true@INSTANCE_UNIX_SOCKET=/cloudsql/hogehogeback:asia-northeast1:hogehoge-db

こんな書き方できちゃう。
(^@^)かわいい〜

実際のコード

私が実際に使用した cloudbuild.yaml の一部です。

steps:
  # ... 他のステップ ...
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk:slim'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        gcloud run services update $_SERVICE_NAME \
          --platform=managed \
          --image=$_AR_HOSTNAME/$PROJECT_ID/cloud-run-source-deploy/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA \
          --labels=managed-by=gcp-cloud-build-deploy-cloud-run,commit-sha=$COMMIT_SHA,gcb-build-id=$BUILD_ID,gcb-trigger-id=$_TRIGGER_ID \
          --region=$_DEPLOY_REGION \
          --quiet \
          --set-env-vars=API_PORT=8080,DB_PORT=5432,DB_NAME=hogehoge-db,_CLOUD_RUN=true,INSTANCE_UNIX_SOCKET=/cloudsql/hogehoge-36383:asia-northeast1:hogehoge-db
    secretEnv:
      - DB_PASSWORD
      - DB_USER
      - DB_HOST
# ... 他の設定 ...

結論

この経験から、GCPのサービス間の連携には、ドキュメントを丁寧に読み解くことが重要だなって思いました。また、実際に手を動かし、試行錯誤することで、より深い理解が得られることも実感しました!この記事が、同じような問題に直面した方々の助けになれば幸いです!!
ご指摘、ご感想ございましたらお気軽によろしくお願いします🤝
HAPPY CI/CDLIFE!

Discussion