簡體   English   中英

服務帳戶沒有對 Google Cloud Storage 的 storage.objects.get 訪問權限

[英]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_saIAM & Admin / IAM下顯示一個角色 ( Storage Admin )
  • my_saStorage / 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM