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

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

我正在尝试使用 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)

但我收到一个错误:

[service-account-ID][email protected] does not have storage.buckets.get access to [bucket-name]

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

gsutil ls gs://[bucket-name]

我可以获得存储桶中的对象列表...所以我不明白发生了什么,有什么线索告诉我该怎么办?

答案1

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

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

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

答案2

要补充最佳答案,请注意,角色roles/storage.legacyBucketReader 也具有storage.buckets.get权限。(请参阅https://cloud.google.com/iam/docs/permissions-reference

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

gsutil iam ch serviceAccount:[email protected]:legacyBucketReader gs://ex-bucket

相关内容