2017-03-22 32 views
4

我創建了一個Google App Engine應用程序,用於偵聽Google Cloud Storage通知,並且無論何時在GCS上創建新對象時,應用程序都需要打開新對象並根據其內容執行操作。當應用程序和gcs存儲桶位於不同的項目中時,我無法訪問對象內容。如何使用服務帳戶跨項目訪問GCS存儲桶對象?

配置:

我已創建了存儲對象管理權限在項目中的服務帳戶,相關的GAE應用它,使用激活的服務帳戶:

gcloud auth activate-service-account [ACCOUNT] --key-file=KEY_FILE

我然後在項目B中與我的GAE應用程序在同一區域創建了一個存儲桶gs:// some_bucket,並將我的服務帳戶添加爲存儲桶的所有者。

我使用「存儲對象管理」權限將我的服務帳戶添加爲項目B的成員。

我創建我的應用程序和使用

gsutil notification watchbucket -i [ChannelId] -t [Token] https://[app-name].appspot.com/ gs://some_bucket

我的應用程序現在已經收到請求後,我可以通過他們解析葉之間的watchbucket通道,找到源桶,大小,對象名稱等。但我無法自己讀取對象。我收到以下錯誤。

{Location: ""; Message: "Access Denied: File gs://some_bucket/some_object: Access Denied"; Reason: "accessDenied"}

我測試上面的配置在同一個項目(項目A)內,並我能讀的對象,並對其進行操作。這是一個我無法弄清楚的權限問題。

+0

項目A中的服務帳戶需要讀取存儲桶和對象的內容。你可以添加作爲項目B的成員嗎? –

+0

是的,我已經將服務帳戶作爲具有「存儲對象管理」權限的成員添加到項目B.我還將該服務帳戶作爲存儲桶所有者添加到了source_bucket。 – ioverzero

+0

擁有存儲桶並不意味着可以讀取對象。嘗試明確授予該特定對象的服務帳戶讀取權限。 –

回答

3

GCS存儲桶權限與GCS對象權限不同,作爲存儲桶所有者不會轉換爲對象所有者或具有對象訪問權限。您可以授予讀取權限所有現有的GCS對象你的水桶使用遞歸以下:

gsutil -m acl ch -u [email protected]:R -r gs://example-bucket

這將遞歸授予服務帳戶讀取權限桶中的所有對象。

人們可能會想改變桶對象的默認權限,以便進入你的GCS桶中的所有未來的對象具有所需的權限

gsutil defacl ch -u [email protected]:READ gs://example-bucket

更改對象ACL的:https://cloud.google.com/storage/docs/gsutil/commands/acl

更改默認對象ACL的: https://cloud.google.com/storage/docs/gsutil/commands/defacl

相關問題