我有一个名为bucket-hr-data
的bucket。其中有一个名为payroll
的文件夹。
我正在尝试创建一个服务帐户sa-payroll
,该帐户只能管理该文件夹下的文件/文件夹。
这就是我的IAM条件对于服务帐户的样子。
resource.name.extract("projects/_/buckets/bucket-hr-data/objects/{name}/")=='payroll'
这在大多数情况下都有效,除了当我尝试上传一个有名字的文件时。
gsutil cp/somefile.txt gs://bucket人力资源数据/工资单/工资单/-works如预期
gsutil cp/somefile.txtgs://bucket hr数据/工资单/工资单/data1/-按预期工作
gsutil cp/somefile.txt gs://bucket hr data/payroll/payroll/somefile.txt-意外失败,出现403
如何更改IAM条件表达式以使所有3个命令都能工作?
您的bucket的访问控制可以是细粒度的。IAM云存储策略的条件仅适用于使用统一存储桶级别访问的存储桶。
如果您想使用IAM条件在存储桶上配置访问,解决方案是启用统一存储桶级别的访问。
我的测试存储桶具有统一级别的访问权限,此IAM条件运行良好。将IAM条件更改为:
resource.name.startsWith("projects/_/buckets/BUCKET_NAME/objects/payroll/payroll/")
更新:检查您的IAM角色。如果您的服务帐户只有Storage Object Creator
和Storage Object Viewer
角色,则尝试上载bucket对象中已经存在的对象将返回403,因为对象创建者角色无权删除对象。