Bitbucket Pipeline部署Cloud Run报403提示project None如何解决
问题根因
- 核心原因是你调用Secret Manager的
access_secret_version接口时,传入的密钥资源名称没有补全完整路径,或者客户端初始化时未获取到有效的Google Cloud项目ID,导致拼接后的资源路径中项目位为None,触发权限错误。 - 你在
gcloud命令中指定的--project参数仅作用于gcloud命令本身,不会传递到容器内部的Django运行环境,因此Django代码无法拿到项目ID。 - Cloud Build执行migrate、collectstatic步骤时,也未向容器注入项目ID环境变量,同样会触发该错误。
解决方案
1. 修正Django settings.py中密钥拉取代码
确保传入完整的密钥资源路径,不要依赖客户端自动补全项目ID,示例代码:
import os from google.cloud import secretmanager # 从环境变量读取项目ID,兜底可写死默认项目ID PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT", "你的实际项目ID") SECRET_SETTINGS_NAME = os.getenv("SETTINGS_NAME") # 拼接完整的密钥资源路径,格式固定为 projects/项目ID/secrets/密钥名/versions/版本号 secret_full_name = f"projects/{PROJECT_ID}/secrets/{SECRET_SETTINGS_NAME}/versions/latest" client = secretmanager.SecretManagerServiceClient() payload = client.access_secret_version(name=secret_full_name).payload.data.decode("UTF-8")
2. 给Cloud Build步骤注入项目ID环境变量
修改cloudbuild.yaml中的migrate和collectstatic步骤,增加GOOGLE_CLOUD_PROJECT环境变量注入,以migrate步骤为例:
args: [ "-i", "gcr.io/${_PROJECT_ID}/${_SERVICE_NAME}", "-s", "${_PROJECT_ID}:${_REGION}:${_INSTANCE_NAME}", "-e", "SETTINGS_NAME=${_SECRET_SETTINGS_NAME}", # 新增项目ID环境变量 "-e", "GOOGLE_CLOUD_PROJECT=${_PROJECT_ID}", "--", "python", "manage.py", "migrate", ]
collectstatic步骤做相同修改,新增对应环境变量即可。
3. 给Cloud Run部署配置注入项目ID
修改Bitbucket流水线中的gcloud run deploy命令,注入项目ID环境变量:
gcloud run deploy devapi --image $IMAGE_NAME --platform managed --region europe-west1 --project my-project \ --set-env-vars GOOGLE_CLOUD_PROJECT=my-project
4. 配置必要的IAM权限
在Google Cloud IAM控制台,给以下两个身份授予Secret Manager Secret Accessor角色(作用范围可选整个项目或者仅对应需要访问的密钥):
- Cloud Build默认服务账号:格式为
[项目数字ID]@cloudbuild.gserviceaccount.com - Cloud Run运行时服务账号:如果使用默认服务账号,格式为
[项目号]-compute@developer.gserviceaccount.com,推荐单独创建专用服务账号分配权限。
内容的提问来源于stack exchange,提问作者Kimor
相关产品推荐
相关产品推荐

