GCP跨项目存储桶授权:含GCR镜像构建场景
刚好之前处理过类似的GCP跨项目权限问题,给你详细拆解下这两个场景的配置步骤:
1. 通用场景:授权某GCP项目访问另一项目的Cloud Storage存储桶
最常用的方式是通过IAM角色直接授权项目对应的主体,步骤如下:
授权项目级主体访问目标桶
每个GCP项目都有默认的服务账号和成员组,你可以根据需求选择授权对象:- 打开Cloud Storage控制台,定位到目标存储桶(比如项目B的桶)
- 切换到「权限」标签页,点击「添加」按钮
- 在「新成员」输入框中填写要授权的项目标识:
- 若要授权项目A的所有成员访问:输入
group:project-editors-<PROJECT_A_NUMBER>@google.com(编辑组)或group:project-viewers-<PROJECT_A_NUMBER>@google.com(查看组) - 若要授权项目A的默认服务账号访问:输入
[PROJECT_A_NUMBER]@cloudservices.gserviceaccount.com
- 若要授权项目A的所有成员访问:输入
- 选择匹配需求的IAM角色:
- 只读访问选
Storage Object Viewer - 读写操作选
Storage Object Admin - 桶级管理(比如创建/删除桶)选
Storage Admin
- 只读访问选
- 点击「保存」,等待1-2分钟让权限生效
细粒度授权(可选)
如果不想给整个项目授权,也可以创建专用服务账号,给它分配桶的权限,然后在项目A中使用该服务账号的密钥进行访问。这种方式更适合特定应用,而非项目级的全局授权。
2. 具体场景:项目A的GCR构建访问项目B的桶,同时授权项目B读取项目A的桶
这个场景需要分两部分配置,分别处理Cloud Build的权限和项目B的读取权限:
2.1 让项目A的GCR构建(Cloud Build)访问项目B的存储桶
Cloud Build在构建镜像时,默认使用项目A的Cloud Build专用服务账号,格式为[PROJECT_A_NUMBER]@cloudbuild.gserviceaccount.com。我们需要给这个账号授权项目B的桶权限:
控制台配置步骤:
- 进入项目B的Cloud Storage控制台,找到目标桶的「权限」页面
- 添加成员:输入项目A的Cloud Build服务账号
- 根据构建需求选择角色:比如仅读取对象选
Storage Object Viewer,需要写入则选Storage Object Admin - 保存后,Cloud Build在构建过程中就能正常访问该桶了
命令行快速配置(可选):
# 给项目A的Cloud Build账号授权项目B的桶只读权限 gsutil iam ch serviceAccount:[PROJECT_A_NUMBER]@cloudbuild.gserviceaccount.com:roles/storage.objectViewer gs://PROJECT_B_BUCKET_NAME
2.2 授权项目B拥有项目A存储桶的读取权限
这部分和通用场景逻辑一致,核心是给项目B的主体授权项目A的桶:
控制台配置步骤:
- 进入项目A的Cloud Storage控制台,找到目标桶的「权限」页面
- 添加成员:输入项目B的默认服务账号
[PROJECT_B_NUMBER]@cloudservices.gserviceaccount.com - 选择
Storage Object Viewer角色(只读权限) - 保存等待权限生效
细粒度优化:如果项目B中只有特定服务(比如GKE、Cloud Function)需要访问,可以给对应服务的专用服务账号授权,遵循最小权限原则,避免过度授权。
额外注意事项
- 权限生效可能有1-5分钟的延迟,刚配置完如果出现访问报错,稍等片刻再重试
- 始终遵循最小权限原则,不要分配超出需求的角色(比如不要直接给
Owner角色) - 可以通过GCP的IAM权限检查工具,验证配置是否正确
内容的提问来源于stack exchange,提问作者znat
相关产品推荐
相关产品推荐

