我有两个项目 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"
}
我已经仔细检查了服务帐户是否在订阅者列表中,还尝试再次删除/添加它,等等。尝试了不同的项目。它不会改变任何东西。
如果我在同一个云项目下有 PubSub 主题订阅和服务帐户,那么它对于两者testIamPermissions
和pull
请求都可以正常工作。这是否意味着 IAM 服务帐户不能用于从另一个项目获取对 PubSub 的访问权限?
请注意,它适用于其他项目的存储访问。这意味着该问题仅针对 PubSub。这就是为什么我认为我在 PubSub 配置方面遗漏了一些东西。但究竟是什么?