Cloud runにデプロイする時にSecret Managerを使う
ゴール
バックエンド環境としてNode.jsをCloud Runで動かします。その時にSecret Managerを利用して未必情報の管理を行います。
必要なもの
・node環境
・gcloudのCLI
・GCPでプロジェクトが使える状況であること
Express.jsをインストール
nodeがインストールできていない場合は、nodeの設定をお願いします。
mkdir test-backend
npm init -y
npm install express
作成されたindex.jsを以下のようにします。
const express = require('express');
const app = express();
const port = process.env.PORT || 8080;
app.get('/', (req, res) => {
// ここでシークレットを使えているか確認します。
const secret = process.env.MY_SECRET || 'Secret not found (check if set in Cloud Run)';
res.send(`
<h1>Cloud Run Secret Manager Demo</h1>
<p>Secret value: <strong>${secret}</strong></p>
`);
});
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
types/nodeのインストール
npm i --save-dev @types/node
.gitignoreとDocker作成
.gitignoreを以下のようにします。
node_modules
.env
.DS_Store
Dockerfileを以下のようにします。
FROM node:18-slim
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --only=production
COPY . .
ENV PORT=8080
EXPOSE 8080
CMD [ "node", "index.js" ]
.dockerignoreを以下のようにします。
node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
.gitignore
README.md
試しにローカルのターミナルでシークレットを登録する
以下のコマンドでexportします。
export MY_SECRET="testing_locally"
以下のコマンドを実行して先ほどの"testing_locally"がターミナルに表示されたら成功です。
echo "Current MY_SECRET: '$MY_SECRET'"
以下で8080番をローカルで起動
node index.js
以下のように先ほどのMY_SECRETがブラウザで見たときに表示されたらOK。

GCPでプロジェクトを作成する
google cloud platformに行き、プロジェクトを新規作成します。
※すでにプロジェクトがある場合はそちらを使ってください。

Secret Managerを有効化します。

以下のような画面がでたらOKです。

ローカルでプロジェクトを設定する
以下のコマンドを実行して先ほど作成したプロジェクトを探します。gcloud cliをインストールしていない場合はインストールしてください。
gcloud projects list
以下の名前の後ろにおそらくなんか数字がついているはずです。そちらも含めて以下のコマンドを実行してください。
gcloud config set project test-antigravity-1111
.envを作成する
以下のようにしていただいてOKです。SERVICE_NAMEの名前は適当です。
PROJECT_ID="test-antigravity"
MY_SECRET="testing_locally"
SERVICE_NAME="my-backend"
REGION="asia-northeast1"
ローカルでSecretを作成する。
echo -n "test-antigravity" | gcloud secrets create PROJECT_ID --replication-policy="automatic" --data-file=-
echo -n "testing_locally" | gcloud secrets create MY_SECRET --replication-policy="automatic" --data-file=-
echo -n "my-backend" | gcloud secrets create SERVICE_NAME --replication-policy="automatic" --data-file=-
echo -n "asia-northeast1" | gcloud secrets create REGION --replication-policy="automatic" --data-file=-
するとGCPにsecret managerができています。

Artifact Registryを作成
以下のようにしてarifactsを作成していきます。
gcloud artifacts repositories create test-backend-repo \
--repository-format=docker \
--location=asia-northeast1 \
--description="Docker repository for test-backend"
GCPでArtifact Registryを見ると以下のようになっているはずです。

IAMに権限を設定
test-antigravity-1111のような先ほどのプロジェクトを以下に入力します。
gcloud projects add-iam-policy-binding "自分のプロジェクト" \
--member="user:自分のemail" \
--role="roles/cloudbuild.builds.editor"
gcloud projects add-iam-policy-binding "自分のプロジェクト" \
--member="user:自分のemail" \
--role="roles/storage.admin"
以下のコマンドでちゃんと権限が設定されたか確認します。
gcloud projects get-iam-policy "自分のプロジェクト" \
--flatten="bindings[].members" \
--filter="bindings.members:自分のemail" \
--format="table(bindings.role)"
Dockerイメージをビルドしてプッシュ
以下のコマンドでイメージの認証設定とビルドとプッシュを行います。
gcloud auth configure-docker asia-northeast1-docker.pkg.dev
以下のプロジェクト名のところはtest-antigravity-1111のようなものにしてください。
gcloud builds submit --tag asia-northeast1-docker.pkg.dev/"プロジェクト名"/test-backend-repo/my-backend:latest .
Cloud runにデプロイ
以下のプロジェクト名のところはtest-antigravity-1111のようなものにしてください。
gcloud run deploy my-backend \
--image asia-northeast1-docker.pkg.dev/"プロジェクト名"/test-backend-repo/my-backend:latest \
--platform managed \
--region asia-northeast1 \
--allow-unauthenticated \
--set-secrets="PROJECT_ID=PROJECT_ID:latest,MY_SECRET=MY_SECRET:latest,SERVICE_NAME=SERVICE_NAME:latest,REGION=REGION:latest"
おそらく一回以下のようなエラーが出るかと思います。
ERROR: (gcloud.run.deploy) spec.template.spec.containers[0].env[0].value_from.secret_key_ref.name: Permission denied on secret: projects/"ランダムな数字"/secrets/PROJECT_ID/versions/latest for Revision service account "~~~~.com"
上記の"~~~~.com"の部分をコピーします。
そして以下のようにコマンド入力します。--projectのところは自分のプロジェクトIDに置き換えてください。
SA="~~~~.com"
gcloud secrets add-iam-policy-binding PROJECT_ID \
--member="$SA" \
--role="roles/secretmanager.secretAccessor" \
--project=test-antigravity-1111
gcloud secrets add-iam-policy-binding MY_SECRET \
--member="$SA" \
--role="roles/secretmanager.secretAccessor" \
--project=test-antigravity-1111
gcloud secrets add-iam-policy-binding SERVICE_NAME \
--member="$SA" \
--role="roles/secretmanager.secretAccessor" \
--project=test-antigravity-1111
gcloud secrets add-iam-policy-binding REGION \
--member="$SA" \
--role="roles/secretmanager.secretAccessor" \
--project=test-antigravity-1111
再度もう一回デプロイします。
gcloud run deploy my-backend
--image asia-northeast1-docker.pkg.dev/"プロジェクト名"/test-backend-repo/my-backend:latest
--platform managed
--region asia-northeast1
--allow-unauthenticated
--set-secrets="PROJECT_ID=PROJECT_ID:latest,MY_SECRET=MY_SECRET:latest,SERVICE_NAME=SERVICE_NAME:latest,REGION=REGION:latest"
するとURLが発行されるはずです。
URLを見た時に以下のような画面が出ていれば成功です。

Discussion