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