![](/img/trans.png)
[英]How to access to a Google Cloud Storage bucket from a Cloud Run service without using a local Service Account key file?
[英]service account does not have storage.objects.get access for Google Cloud Storage
我在 Google Cloud Console 中創建了一個服務帳戶並選擇了角色Storage
/ Storage Admin
(即對 GCS 資源的完全控制)。
gcloud projects get-iam-policy my_project
似乎表明該角色實際上已被選中:
- members:
- serviceAccount:my_sa@my_project.iam.gserviceaccount.com
role: roles/storage.admin
- members:
- serviceAccount:my_sa@my_project.iam.gserviceaccount.com
role: roles/storage.objectAdmin
- members:
- serviceAccount:my_sa@my_project.iam.gserviceaccount.com
role: roles/storage.objectCreator
文檔清楚地表明角色roles/storage.admin
包含權限storage.objects.*
(以及storage.buckets.*
)。
但是,當我嘗試將該服務帳戶與 Python 的 Google Cloud Storage Client Library 結合使用時,我收到此錯誤消息:
my_sa@my_project.iam.gserviceaccount.com 沒有 storage.objects.get 訪問 my_project/my_bucket。
那么,為什么所選角色在這種情況下還不夠呢?
問題顯然是服務帳戶與太多角色相關聯,這可能是先前配置嘗試的結果。
這些步驟解決了這個問題:
IAM & Admin
/ IAM
下有問題的服務帳戶(成員) my_sa
的所有(三個)角色IAM & Admin
/ Service accounts
下的my_sa
my_sa
(再次使用角色Storage
/ Storage Admin
)效果是這樣的:
my_sa
在IAM & Admin
/ IAM
下顯示一個角色 ( Storage Admin
)my_sa
在Storage
/ Browser
/ my_bucket
/ Edit bucket permissions
下顯示為成員值得注意的是,如果您剛剛分配了權限,您最多需要等待幾分鍾才能正常工作。 至少那是我之后發生的事情:
gcloud projects add-iam-policy-binding xxx --member
"serviceAccount:xxx@xxx.iam.gserviceaccount.com" --role "roles/storage.objectViewer"
轉到您的存儲桶的權限部分並為您的存儲桶打開添加權限部分。 例如,gcloud 告訴您的服務不足是;
1234567890-compute@developer.gserviceaccount.com
將此服務添加為用戶,然后賦予這些角色;
然后,您應該有足夠的權限對您的存儲桶進行更改。
我在創建項目之前嘗試檢查存儲桶是否已經存在時遇到了這個問題,在我的情況下,這不是角色問題,因為我的服務帳戶有存儲管理員、存儲對象管理員和創建者角色,但結果是我試圖檢查存在/創建的存儲桶名稱(從我的 python 代碼中)不是全局唯一的。 當我將存儲桶的名稱更改為全局唯一的名稱時,錯誤消失了。
對我來說,這是因為使用"default-bucket"
作為存儲模擬器所需的參數進行部署。
admin.storage().bucket('default-bucket'); // do not deploy that
為了解決這個問題,我在 firebase 管理員初始化時設置了默認存儲桶名稱。
const admin = require('firebase-admin');
const config = process.env.FUNCTIONS_EMULATOR ? {
storageBucket: 'default-bucket',
} : {
storageBucket: 'YOUT_FIREBASE_STORAGE_BUCKET',
};
admin.initializeApp(config);
const bucket = admin.storage().bucket();
我剛剛意識到,當您第一次創建 Firebase/Firestore/Storage 項目時,有時會發生這種情況。
如果您在第一次安裝/部署/設置中遇到此錯誤,請等待 1 分鍾,然后重試。 似乎谷歌雲部署/服務中的一些延遲是造成這種情況的原因。
當我從另一個項目復制雲 function 時出現此錯誤,因為我忘記更新存儲桶。 愚蠢的錯誤。
admin.initializeApp({
storageBucket: "gs://*****.appspot.com",
});
在我的例子中,創建服務帳戶后,界面返回錯誤:“服務帳戶沒有 storage.objects.get 訪問 Google Cloud Storage”。
但是,當我第二天再次嘗試時,一切都很好:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.