跨项目场景下能否将其他项目服务账号绑定到Pub/Sub推送订阅
Pub/Sub推送订阅不存在不支持跨项目绑定服务账号的限制,你最初的方案完全可行,报错是权限配置缺失导致的。控制台UI下拉框仅展示同项目服务账号属于前端展示限制,不影响API/gcloud命令实现跨项目绑定。
你当前的权限配置漏了两项核心配置:
- Project2的Pub/Sub官方服务代理账号,没有被授予Project1中service_account1的服务账号令牌创建者权限,无法跨项目模拟该服务账号生成访问Cloud Run的身份令牌
- 你执行gcloud命令的操作账号,缺少Project1中service_account1的服务账号用户权限,无法在创建订阅时指定其他项目的服务账号
首先获取Project2的Pub/Sub服务代理账号:
gcloud projects get-iam-policy project2 --filter="binding.role:roles/pubsub.serviceAgent" --format="value(binding.members)"
输出的账号格式为service-<project2数字ID>@gcp-sa-pubsub.iam.gserviceaccount.com,记为PUBSUB_SA。给该代理账号授予Project1服务账号的令牌创建权限:
gcloud iam service-accounts add-iam-policy-binding service_account1@project1.iam.gserviceaccount.com --project=project1 --member=serviceAccount:${PUBSUB_SA} --role=roles/iam.serviceAccountTokenCreator给你的操作账号授予Project1服务账号的模拟使用权限:
gcloud iam service-accounts add-iam-policy-binding service_account1@project1.iam.gserviceaccount.com --project=project1 --member=user:<你的GCP登录账号邮箱> --role=roles/iam.serviceAccountUser重新执行订阅创建命令,注意服务账号需填写全量邮箱地址:
gcloud --project=project2 pubsub subscriptions create test_subscrption \ --topic=topic-name \ --topic-project=project2 \ --push-auth-service-account=service_account1@project1.iam.gserviceaccount.com \ --push-endpoint=https://my-cloud-run-service.run.app/
内容的提问来源于stack exchange,提问作者Andrea B.

