首页 文章

通过IAM ServiceAccount进行跨项目PubSub订阅

提问于
浏览
0

我有两个Project-A和Project-B项目 .

在Project-A上我有一个服务帐户 loader@project-a.iam.gserviceaccount.com ,我想用它来读取Project-B PubSub主题中的消息 .

我在Project-B projects/project-b/subscriptions/data 上创建了一个主题订阅 . 然后在权限选项卡中将 loader@project-a.iam.gserviceaccount.com 添加为 Subscriber . 我相信它应该让我访问 .

但如果我尝试:

TestIamPermissionsRequest iamreq = new TestIamPermissionsRequest();
iamreq.setPermissions(Arrays.asList(
        "pubsub.subscriptions.consume",
        "pubsub.subscriptions.get"
));
pubsub.projects().subscriptions()
        .testIamPermissions(topicSubscription, iamreq).execute();

它返回空的权限列表 .

对于实际拉动请求:

PullRequest pull = new PullRequest();
pull.setMaxMessages(1);
pull.setReturnImmediately(true);
pubsub.projects().subscriptions().pull(topicSubsription, pull).execute();

它失败了:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 403
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "User not authorized to perform this action.",
    "reason" : "forbidden"
  } ],
  "message" : "User not authorized to perform this action.",
  "status" : "PERMISSION_DENIED"
}

我已经仔细检查过服务帐户是在Subscribers列表中,还试图删除/添加它等等 . 试过不同的项目 . 它没有改变任何东西 .

如果我在同一个 Cloud 项目下有PubSub主题订阅和服务帐户,那么对于 testIamPermissionspull 请求它都可以正常工作 . 这是否意味着IAM服务帐户不能用于从另一个项目访问PubSub?

请注意,它适用于其他项目的存储访问 . 这意味着该问题仅适用于PubSub . 这就是为什么我认为我在PubSub配置方面遗漏了一些东西 . 但到底是什么?

1 回答

  • 0

    要从主题订阅角色使用“订阅者”,应该为订阅提供 . 不幸的是,目前 Cloud 控制台无法实现 .

    问题是 Cloud 控制台具有误导性,通过选择主题我希望也设置主题订阅权限(因为're no separate UI for Topic Subscriptions after all). But it' s不能像这样工作,权限表单仅对选定的主题应用更改,忽略所有现有的主题订阅 . 基本上您无法查看或编辑订阅者权限,目前没有此类UI .

    PS那里有're a way to do that via API, though. But it doesn'为我的情况工作

相关问题