服务帐号没有 storage.buckets.get 访问存储桶的权限

Dim*_*tri 8 oauth google-cloud-storage google-cloud-platform

我正在尝试使用 python 获取项目中的存储桶列表:

from google.cloud import storage

storage_client = storage.Client(project='[project-id]')
bucket = storage_client.get_bucket([bucket-name])

blobs = bucket.list_blobs()

for blob in blobs:
    print(blob.name)
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

[service-account-ID]-compute@developer.gserviceaccount.com does not have storage.buckets.get access to [bucket-name]
Run Code Online (Sandbox Code Playgroud)

无论如何,如果我尝试使用 gsutil(使用相同的服务帐户):

gsutil ls gs://[bucket-name]
Run Code Online (Sandbox Code Playgroud)

我可以获得存储桶中的对象列表......所以我不明白发生了什么,关于我应该做什么的任何线索?

小智 12

要添加到最上面的答案,请注意角色 Roles/storage.legacyBucketReader 也具有 storage.buckets.get 权限。(请参阅https://cloud.google.com/iam/docs/permissions-reference

因此,要将服务帐户添加到该角色:

gsutil iam ch serviceAccount:john.doe@example.com:legacyBucketReader gs://ex-bucket
Run Code Online (Sandbox Code Playgroud)


Gar*_*ett 11

GCP 有角色权限的概念。一个角色是像存储管理员(roles/storage.admin)和权限是一样的东西storage.buckets.get。角色由一个或多个权限组成。始终通过将角色应用于主体(用户、服务帐户或组)来授予权限——也就是说,您不能直接向主体分配权限。

您看到的错误是因为storage.buckets.get服务帐户缺少权限- 也就是说,应用于服务帐户的角色都没有授予 storage.buckets.get 权限。您可以列出存储桶的对象(storage.objects.list 权限),而不能列出存储桶(storage.buckets.get 权限)。

因此,您需要分配一个roles/storage.admin具有 storage.buckets.get 权限的角色。如果您想使用最低权限模型进行操作,您还可以创建一个仅具有该权限的自定义角色

  • 谢谢@Garrett,这是我在 SO/SE 上读过的关于角色和权限的最好描述。这可能是与 GCP 合作最难理解的部分。我曾经通过 GCP 的 UI 验证 terraform 的所有更改。我发现确实如此 - 首先更好地理解概念,然后尝试从简单的事物中构建复杂的事物。简单才是王道) (2认同)