首页 > 解决方案 > 将来自不同项目的服务帐户分配给 Pub/Sub 上的推送订阅

问题描述

场景如下:我在同一个组织和文件夹中有两个项目;让我们打电话给他们project1project2。我有一个 Pub/Sub 主题,project2并且我有一个 Cloud Run 服务project1,我想将其用作该主题的推送订阅的端点。但是,我不希望每个人都能够访问我的 Cloud Run 服务:我只希望授权的服务帐户能够调用该服务。project1因此,我创建了一个具有role/run.invokerCloud Run 服务角色的服务帐户。现在,当我project2使用 Cloud Run 服务作为端点在主题中创建订阅时,我尝试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所述和此处iam.serviceAccounts.actAs所述),但我可以保证我在尝试创建订阅之前确实设置了这些权限,但我仍然遇到同样的错误。综上所述,我得出的结论是,无法将来自不同项目的服务帐户与 Pub/Sub 中的推送订阅相关联(更重要的是,如果我尝试从下拉菜单中的 GCP UI 创建订阅对于与推送订阅关联的服务帐户,我只看到与主题和订阅属于同一项目的服务帐户)。谁能证实这一点,或告诉我如何实现我的目标?我目前的解决方案是创建一个服务帐户project2并将其与推送订阅相关联,但我想知道我的原始计划是否可行。

标签: google-cloud-platformgoogle-cloud-pubsubgoogle-cloud-rungoogle-cloud-iam

解决方案


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


推荐阅读