2016-02-29 99 views
0

我有兩個項目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主題訂閱和服務帳戶,那麼對於testIamPermissionspull請求都可以正常工作。這是否意味着IAM服務帳戶不能用於從另一個項目訪問PubSub?

請注意,它適用於從其他項目的存儲訪問。這意味着該問題僅限於PubSub。這就是爲什麼我認爲我錯過了PubSub配置方面的一些東西。但究竟是什麼?

+0

看起來雲控制檯已損壞。因爲如果我直接通過API添加訂閱者權限,它按預期工作(仍在調查......) –

+0

好像你正在對一個主題調用'pubsub.projects()。subscriptions()。testIamPermissions',這看起來不正確。 –

+0

它是正確的主題訂閱,形式爲'projects /%xxx%/ subscriptions /%yyyy%'。客戶端lib會拋出不同的異常,如果我嘗試在那裏傳遞無效值 –

回答

0

要從主題訂閱角色消費應向訂閱提供「訂閱者」。不幸的是,現在無法使用雲端控制檯。

問題是雲控制檯有誤導性,通過選擇主題我也希望爲主題訂閱設置權限(因爲畢竟沒有用於主題訂閱的單獨UI)。但它不能這樣工作,權限表單將僅更改應用於所選主題,忽略所有現有主題訂閱。基本上,您無法查看或編輯訂閱服務器權限,目前沒有此類用戶界面。

PS雖然有一種方法可以通過API來實現。但它不適合我的情況