我试图向服务帐户授予一组有限的权限,同时允许在特定存储桶上创建文件。我没有创建自定义角色,而是考虑使用存储桶上预定义的角色。
roles/storage.objectCreator
之后,我通过模拟 SA 运行以下代码行:
但是,当我执行工作流时,我收到权限被拒绝的错误:
storage_client = storage.Client("project")
bucket_name = "bucket"
bucket = storage_client.get_bucket(bucket_name)
blob = bucket.blob("test.txt")
blob.upload_from_string("Hello World")
我原以为这就足够了,但似乎还不够。我知道我可以创建自定义角色并定义我想要授予它的权限集。但是,是否可以在将范围限制在
[email protected] does not have storage.buckets.get access to the Google Cloud Storage bucket. Permission 'storage.buckets.get' denied on resource (or it may not exist)
角色的情况下上传文件?也许通过编辑 python 代码而不是实例化存储桶对象?
objectCreator
role? Maybe by editing the python code and not instantiating the bucket object?
是对的,
roles/storage.objectCreator
角色应该足以让服务账号在一个 bucket 中创建对象。但是,遇到的错误信息表明服务账号缺少读取 bucket 的权限:
[email protected] does not have storage.buckets.get access to the Google Cloud Storage bucket. Permission 'storage.buckets.get' denied on resource (or it may not exist)
发生这种情况是因为的代码首先尝试使用
storage_client.get_bucket(bucket_name)
获取 bucket 对象。此操作需要
storage.buckets.get
权限,而
roles/storage.objectCreator
角色不包含此权限。
有以下几种解决方案:
1. 授予额外的
storage.buckets.get
权限:
可以授予服务账号
roles/storage.objectViewer
角色,该角色包含
storage.buckets.get
权限。这将允许的代码成功获取 bucket 对象并上传文件。
2. 修改代码以避免获取 bucket 对象:
可以修改代码,直接使用 bucket 名称和对象名称创建 Blob 对象,而无需先获取 bucket 对象:
from google.cloud import storage
storage_client = storage.Client()
bucket_name = "bucket"
blob_name = "test.txt"
blob = storage_client.bucket(bucket_name).blob(blob_name)
blob.upload_from_string("Hello World")
此方法不需要
storage.buckets.get
权限,因为没有直接获取 bucket 对象。
3. 使用自定义角色:
如果想严格控制权限,可以创建一个自定义角色,并仅授予
storage.objects.create
和
storage.objects.update
权限。这将允许服务账号创建和更新对象,而无需任何其他权限。
总结:
推荐使用第二种方法,因为它更简洁并且遵循最小权限原则。如果需要对 bucket 执行其他操作,则可以选择第一种或第三种方法。
标签:python,google-cloud-storage From: 78832062