服务帐户没有 storage.objects.get 对 Google 云存储的访问权限

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

并且 documentation 清楚地表明角色 roles/storage.admin 包含权限 storage.objects.*(以及 storage.buckets.*)。

但是当我尝试将该服务帐户与 Python 的 Google 云存储客户端库结合使用时,我收到此错误消息:

my_sa@my_project.iam.gserviceaccount.com does not have storage.objects.get access to my_project/my_bucket.

那么为什么选择的角色在这种情况下还不够?

问题显然是服务帐户与太多角色相关联,这可能是之前配置尝试的结果。

这些步骤解决了问题:

  • 删除了 IAM & Admin / IAM
  • 下违规服务帐户(成员)my_sa 的所有(三个)角色
  • 删除 my_sa 下的 IAM & Admin / Service accounts
  • 重新创建 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 

将此服务添加为用户,然后赋予这些角色;

  • 云存储 - 存储管理员
  • 云存储 - 存储对象管理
  • 云存储 - 存储对象创建器

那么您应该有足够的权限来更改您的存储桶。

对我来说,这是因为部署了 "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();