Python3环境GAE Standard访问Secret Manager报403权限错误
问题根因
本地运行正常是因为你使用的本地JSON服务账号密钥已经配置了Secret Manager访问权限,App Engine Standard环境报错的核心原因是GAE默认运行身份没有目标密钥的访问权限:
GAE Standard默认使用App Engine专属默认服务账号(邮箱格式为<你的项目ID>@appspot.gserviceaccount.com)发起所有云服务API调用,你没有给这个账号授予secretmanager.versions.access权限,因此被Secret Manager拒绝访问。日志里前面的gRPC _InactiveRpcError是权限错误抛出前的底层RPC异常,不是根因,核心错误就是明确标注的403 PermissionDenied。
你当前的依赖配置、业务代码、app.yaml基础配置都没有问题,不需要修改代码逻辑。
修复步骤
- 定位GAE默认服务账号
进入Cloud控制台IAM页面,在主账号列表里找到后缀为@appspot.gserviceaccount.com的服务账号,这就是你GAE应用运行时的实际身份。注意别和Compute Engine默认服务账号(后缀一般是@developer.gserviceaccount.com)搞混,加错账号不会生效。 - 给服务账号授权
遵循最小权限原则按需授权即可:- 仅需要访问
API_OCR这一个密钥:进入Secret Manager中API_OCR的详情页,切到权限面板,添加上述GAE默认服务账号,绑定Secret Manager Secret Accessor角色。 - 需要访问项目下所有Secret:直接在IAM页面给该服务账号绑定项目级别的Secret Manager Secret Accessor角色。
- 仅需要访问
- 重新部署验证
IAM权限生效延迟一般在1分钟以内,执行gcloud app deploy重新部署应用后,再访问/s1接口就能正常拿到密钥值。
可选配置
如果你不想使用GAE默认服务账号,也可以在app.yaml中增加配置指定自定义服务账号,修改后的app.yaml示例如下:
runtime: python39 service_account: 你的自定义服务账号邮箱 automatic_scaling: max_instances : 2 max_idle_instances : 1 target_cpu_utilization : 0.9 target_throughput_utilization : 0.9 max_concurrent_requests : 80
注意提前给自定义服务账号绑定好Secret Manager的访问权限,同时确保该服务账号属于当前GAE应用所在的项目。
内容的提问来源于stack exchange,提问作者Fian Julio
相关产品推荐
相关产品推荐

