我創建了一個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)內,並我能讀的對象,並對其進行操作。這是一個我無法弄清楚的權限問題。
項目A中的服務帳戶需要讀取存儲桶和對象的內容。你可以添加作爲項目B的成員嗎? –
是的,我已經將服務帳戶作爲具有「存儲對象管理」權限的成員添加到項目B.我還將該服務帳戶作爲存儲桶所有者添加到了source_bucket。 – ioverzero
擁有存儲桶並不意味着可以讀取對象。嘗試明確授予該特定對象的服務帳戶讀取權限。 –