如何通过Cloud Build部署使用Secret Manager密钥的Cloud Functions?
问题根因
你遇到的报错是Cloud Build的参数解析逻辑和本地Shell解析逻辑的差异导致的:
- 本地执行CLI命令时,Shell会自动剥离
--set-secrets参数外层的单引号,最终传递给gcloud的实际参数值是env_1=secret_1:latest,env_2=secret_2:latest,符合格式要求。 - Cloud Build的
args数组会将每个元素直接作为原始参数传递给gcloud,不会做Shell引号解析处理,你配置中的单引号会被当成参数值的一部分,最终传递的参数变成'env_1=secret_1:latest','env_2=secret_2:latest',多余的单引号触发了格式校验错误。
修复方案
两种写法二选一即可,更推荐第一种拆分写法,可读性更高且不容易出错:
方案1:拆分多个--set-secrets参数(推荐)
每个密钥单独对应一条--set-secrets配置,不需要加引号、不需要用逗号分隔:
steps: - name: 'gcr.io/cloud-builders/gcloud' args: - beta - functions - deploy - myfunction - --source=src - --trigger-topic=mytopic - --region=europe-west1 - --runtime=python39 - --set-secrets=env_1=secret_1:latest - --set-secrets=env_2=secret_2:latest
方案2:保留逗号分隔,移除多余引号
如果要保持逗号分隔的写法,直接去掉外层的单引号即可:
# 仅修改最后一行即可 - --set-secrets=env_1=secret_1:latest,env_2=secret_2:latest
额外注意事项
你还需要提前为Cloud Build默认服务账号授予对应密钥的访问权限,否则部署后函数会无法拉取密钥:
- Cloud Build默认服务账号格式为:
[项目编号]@cloudbuild.gserviceaccount.com - 需为该账号授予
roles/secretmanager.secretAccessor权限,可按单个密钥粒度授权,避免权限过大。
内容的提问来源于stack exchange,提问作者Emil Bonne Kristiansen
相关产品推荐
相关产品推荐

