GCP Secret Manager本地可用,部署至Cloud Run后无法访问问题排查
问题解决:Cloud Run部署后无法访问Google Secret Manager密钥
问题概述
本地运行Spring Boot应用时,通过application.properties配置:
spring.config.import=sm:// my.secret.key=${sm://my_key}
可正常拉取Secret Manager密钥,但部署到Cloud Run后启动失败,核心报错:
Caused by: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Permission 'secretmanager.versions.access' denied for resource 'projects/demo/secrets/email_host/versions/latest' (or it may not exist).
解决方案
1. 确认Cloud Run使用的服务账号
Cloud Run默认使用项目的默认计算服务账号[你的项目编号]-compute@developer.gserviceaccount.com,可在Cloud Run服务详情的权限标签页查看当前生效的服务账号。
2. 为服务账号添加Secret Manager访问权限
- 进入Google Cloud控制台的Secret Manager页面,找到报错中提到的
email_host密钥(或所有应用需要访问的密钥); - 点击密钥详情→权限→添加成员,输入Cloud Run使用的服务账号邮箱;
- 为该账号分配
Secret Manager Secret Accessor角色(该角色包含secretmanager.versions.access权限,满足密钥读取需求); - 若需要批量授权,也可直接在IAM页面给服务账号绑定该角色,授权范围可选择单个密钥、Secret Manager服务或项目级别(按需选择)。
3. 验证密钥的存在性与路径
检查配置中引用的密钥路径是否与实际一致(比如sm://my_key对应projects/demo/secrets/my_key),同时确认该密钥的latest版本未被删除或禁用。
4. 重启Cloud Run服务
权限变更后,需重启Cloud Run服务,确保新的权限配置生效。
补充说明
本地开发环境能正常访问密钥,是因为使用了你的个人Google账号权限(如gcloud login认证的身份),而Cloud Run运行时使用的是服务账号,两者权限相互隔离,因此必须单独为Cloud Run的服务账号配置Secret Manager访问权限。
内容的提问来源于stack exchange,提问作者Manoj
相关产品推荐
相关产品推荐

