我有兩個項目Project-A和Project-B。通過IAM ServiceAccount跨項目PubSub訂閱
在項目-A上,我有一個服務帳戶[email protected]
,我想用它來讀取來自Project-B PubSub主題的消息。
我在Project-B projects/project-b/subscriptions/data
上創建了主題訂閱。然後在「權限」選項卡中添加[email protected]
作爲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配置方面的一些東西。但究竟是什麼?
看起來雲控制檯已損壞。因爲如果我直接通過API添加訂閱者權限,它按預期工作(仍在調查......) –
好像你正在對一個主題調用'pubsub.projects()。subscriptions()。testIamPermissions',這看起來不正確。 –
它是正確的主題訂閱,形式爲'projects /%xxx%/ subscriptions /%yyyy%'。客戶端lib會拋出不同的異常,如果我嘗試在那裏傳遞無效值 –