将来自不同项目的服务帐户分配给 Pub/Sub 上的推送订阅

Posted

技术标签:

【中文标题】将来自不同项目的服务帐户分配给 Pub/Sub 上的推送订阅【英文标题】:Assign a service account from a different project to a push subscription on Pub/Sub 【发布时间】:2021-11-09 15:14:01 【问题描述】:

场景如下:我在同一个组织和文件夹中有两个项目;我们称他们为project1project2。我在 project2 上有一个 Pub/Sub 主题,我在 project1 上有一个 Cloud Run 服务,我想将其用作该主题的推送订阅的端点。但是,我不希望每个人都能够访问我的 Cloud Run 服务:我只希望授权的服务帐户能够调用该服务。因此,我在 project1 上创建了一个服务帐户,该帐户具有 Cloud Run 服务的 role/run.invoker 角色。现在,当我使用 Cloud Run 服务作为端点在 project2 的主题中创建订阅时,我尝试使用以下命令将 project1 中的服务帐户与其关联:

gcloud --project=project2 pubsub subscriptions create test_subscrption --topic=topic-name --topic-project=project2 --push-auth-service-account=service_account1 --push-endpoint=https://my-cloud-run-service.run.app/

我得到以下信息:

ERROR: Failed to create subscription [projects/project2/subscriptions/test_subscrption]: User not authorized to perform this action.
ERROR: (gcloud.pubsub.subscriptions.create) Failed to create the following: [test_subscrption].

请注意,我用于登录 GCP 的帐户在组织级别具有 Owner 权限。此外,如果我在project2 中创建一个服务帐户并使用它而不是project1 上的服务帐户,则可以毫无问题地创建订阅。我知道在将服务帐户关联到推送订阅之前需要设置一些权限(serviceAccountTokenCreator 描述为here 和iam.serviceAccounts.actAs 描述为here),但我可以保证我之前确实设置了这些权限尝试创建我的订阅,但我仍然遇到同样的错误。综上所述,我得出的结论是,无法将来自不同项目的服务帐户与 Pub/Sub 中的推送订阅相关联(更重要的是,如果我尝试从下拉菜单中的 GCP UI 创建订阅对于与推送订阅关联的服务帐户,我只看到与主题和订阅属于同一项目的服务帐户)。谁能证实这一点,或告诉我如何实现我的目标?我目前的解决方案是在project2 中创建一个服务帐户并将其与推送订阅相关联,但我想知道我最初的计划是否可行。

【问题讨论】:

用UI做的时候,只能选择当前项目的服务账号。因此,我认为不可能使用外部服务帐户。 但是,如果可行的话,您可以在项目 1 中创建推送订阅,并将我们的主题保留在项目 2 中 @guillaumeblaquiere 这绝对适用并且有效:) 非常感谢 【参考方案1】:

正如评论中提到的,当您使用 UI 进行操作时,您只能选择当前项目的服务帐户,而无法使用外部服务帐户。相反,您可以在 project1 中创建推送订阅,并在 project2 中创建主题。

【讨论】:

以上是关于将来自不同项目的服务帐户分配给 Pub/Sub 上的推送订阅的主要内容,如果未能解决你的问题,请参考以下文章

无法使用服务帐户订阅 google pub 子主题

Google Pub/Sub webhook 调用服务器后无法检索消息内容

异常:503 将数据推送到 Google Pub/Sub 时连接到所有地址失败

是否可以通过 Pub/Sub 主题上的消息子集触发云功能?

2-redis的pub/sub发布订阅

Google pub/sub 的 IP 范围是多少?