Terraform部署Cloud Run跨GCP项目访问Docker镜像权限问题
解决项目B Cloud Run访问项目A Docker镜像的问题
核心问题定位
你之前给自定义的cloud-run-sa授予了权限,但错误提示明确要求:必须给项目B的Google Cloud Run Service Agent授予访问项目A镜像的权限。这个Service Agent是GCP自动创建的托管服务账号,和你自定义的Cloud Run运行时服务账号不是同一个——自定义SA用于服务运行时权限,而部署阶段拉取镜像的操作由Cloud Run的托管服务代理完成。
具体解决步骤
1. 获取项目B的Cloud Run Service Agent账号
该账号的固定格式为:service-<项目B数字ID>@serverless-robot-prod.iam.gserviceaccount.com
执行以下命令获取项目B的数字ID:
gcloud projects describe <项目B的ID> --format="value(projectNumber)"
2. 在项目A中为该账号添加镜像读取权限
GCR镜像存储在项目A的artifacts.project-A.appspot.com存储桶中,需要给项目B的Cloud Run Service Agent授予Storage Object Viewer权限:
命令行方式
gsutil iam ch serviceAccount:service-<项目B数字ID>@serverless-robot-prod.iam.gserviceaccount.com:objectViewer gs://artifacts.project-A.appspot.com
Terraform自动化方式(若需集成到代码)
在项目A的Terraform配置中添加存储桶IAM绑定:
resource "google_storage_bucket_iam_member" "cloud_run_agent_image_access" { bucket = "artifacts.project-A.appspot.com" role = "roles/storage.objectViewer" member = "serviceAccount:service-${var.project_b_number}@serverless-robot-prod.iam.gserviceaccount.com" }
注:需确保当前Terraform环境有权限操作项目A的存储桶。
3. 重新部署
等待权限生效(通常1-2分钟),再执行:
terraform apply
额外说明
- 你自定义的
cloud-run-sa仅作用于Cloud Run服务运行时的资源访问,和部署阶段拉取镜像的权限无关。 - 若刚启用Cloud Run API,可多等待几分钟让权限完全同步,但核心操作是给托管的Cloud Run Service Agent加权限。
内容的提问来源于stack exchange,提问作者tifrel
相关产品推荐
相关产品推荐

