微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 gsutil cp 在版本化存储桶上需要 storage.objects.delete?

如何解决为什么 gsutil cp 在版本化存储桶上需要 storage.objects.delete?

我正在使用服务帐号将文件上传到具有版本控制功能的 Google Cloud Storage 存储分区。我想将服务帐户权限保持在最低限度,它只需要上传文件,所以我不想授予它删除文件的权限,但上传失败(仅在流式传输所有内容之后!)说它需要删除权限。>

不应该是创建一个新版本而不是删除吗?

命令如下:

cmd-that-streams | gsutil cp -v - gs://my-bucket/${FILE}
ResumableuploadAbortException: 403 service-account@project.iam.gserviceaccount.com does not have storage.objects.delete access to my-bucket/file

我已经仔细检查了存储桶上是否启用了版本控制

> gsutil versioning get gs://my-bucket
gs://my-bucket: Enabled

解决方法

如果您要覆盖一个对象,无论其父存储桶是否启用了版本控制,您都必须对该对象拥有 storage.objects.delete 权限。

版本控制的作用是,当您删除对象的“实时”版本时,该版本会被标记为“非当前”版本(并填充 the timeDeleted field)。为了在实时版本已经存在时创建对象的新版本(即覆盖对象),发生的事务是:

  • 删除当前版本
  • 创建成为“实时”或“当前”版本的新版本
,

如果您按照 cloud storage gsutil commands 执行 storage.objects.delete 命令,则需要 gsutl cp 权限。

命令:cp

所需权限:

  • storage.objects.list*(用于目标存储桶)
  • storage.objects.get(用于源对象)
  • storage.objects.create(用于目标存储桶)
  • storage.objects.delete**(用于目标存储桶)

**仅当您不使用 -n 标志并且您插入的对象与已经存在的对象同名时才需要此权限 存在于存储桶中。

Google 文档建议使用 -n(不要覆盖现有文件),因此不需要 storage.objects.delete。但是您的用例使用版本控制,您将需要覆盖,因此您将需要添加 storage.objects.delete 对您的权限。

我在启用存储桶版本控制的情况下对此进行了测试,并且只有 1 个版本。具有角色 Storage Object Creator and Storage Object Viewer 的服务帐户。

查看命令和输出的截图: enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。