【发布时间】:2019-12-20 09:24:27
【问题描述】:
我创建了一个服务帐户并分配了以下角色:
Owner
Storage Admin
Storage Object Admin
Tester
Tester 是我为学习目的创建的角色,具有以下权限:
storage.buckets.create
storage.buckets.delete
storage.buckets.get
storage.buckets.getIamPolicy
storage.buckets.list
storage.buckets.setIamPolicy
storage.buckets.update
storage.objects.create
storage.objects.delete
storage.objects.get
storage.objects.getIamPolicy
storage.objects.list
storage.objects.setIamPolicy
storage.objects.update
...
我知道我不必要地过度使用这些角色的权限;但是,这只是为了测试目的。
考虑到bucket只包含一个文件并且账户有相应的权限,下面的Python代码应该可以工作(在我的本地计算机上运行):
from google.cloud import storage
if __name__ == '__main__':
storage_client = storage.Client()
bucket = storage_client.bucket('my-bucket-name')
blobs = bucket.list_blobs()
for blob in blobs:
print(blob.name)
但它没有:
Traceback (most recent call last):
File "gcloud/test.py", line 8, in <module>
for blob in blobs:
File "/home/user/.local/lib/python3.6/site-packages/google/api_core/page_iterator.py", line 212, in _items_iter
for page in self._page_iter(increment=False):
File "/home/berkay/.local/lib/python3.6/site-packages/google/api_core/page_iterator.py", line 243, in _page_iter
page = self._next_page()
File "/home/user/.local/lib/python3.6/site-packages/google/api_core/page_iterator.py", line 369, in _next_page
response = self._get_next_page_response()
File "/home/user/.local/lib/python3.6/site-packages/google/api_core/page_iterator.py", line 419, in _get_next_page_response
method=self._HTTP_METHOD, path=self.path, query_params=params
File "/home/user/.local/lib/python3.6/site-packages/google/cloud/_http.py", line 421, in api_request
raise exceptions.from_http_response(response)
google.api_core.exceptions.Forbidden: 403 GET LINK: USER does not have storage.objects.list access to BUCKET.
桶使用统一的桶级访问控制。我正在使用的服务帐户是此存储桶的成员,它从以下位置继承此成员资格:
Storage Admin
Storage Object Admin
Tester
有人能解释一下这种行为背后的原因吗?
谢谢
【问题讨论】:
-
你是把这个桶切换到“统一桶级访问控制”还是这样创建的?
-
@StefanG。如果我不手动分配权限(gsutil acl ch -u),这两种情况都不起作用。如果该用户已经继承了角色,为什么我必须手动授予权限?例如 serviceuser1 已经继承了角色 Storage Object Admin。但我仍然需要单击“添加成员”并手动赋予该角色以使其正常工作。
-
gcloud 使用的是什么帐号?
gcloud auth list -
@mirana 我有 2 个凭据帐户:一个是我的 gmail 帐户,另一个是活动帐户。我通过
gcloud iam service-accounts keys create为服务用户创建了密钥并使用gcloud auth activate-service-account激活。 -
@mirana 好的,我删除了旧的服务帐户,创建了一个只有存储对象管理员角色的新服务帐户,为其创建了密钥,设置帐户并激活。目前,一切正常。谢谢 :) 请提交您的评论作为答案。
标签: python google-cloud-platform google-cloud-storage