【问题标题】:Why does gsutil cp require storage.objects.delete on versioned bucket?为什么 gsutil cp 在版本化存储桶上需要 storage.objects.delete?
【发布时间】:2021-02-10 14:31:58
【问题描述】:

我正在使用服务帐号将文件上传到具有版本控制的 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

【问题讨论】:

    标签: google-cloud-storage gsutil


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      命令: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 角色的服务帐号。

      查看命令和输出的截图:

      【讨论】:

      • 谢谢。我希望我做错了什么,因为当我的目标是保留它们时,我需要授予我的服务帐户删除内容的权限似乎很疯狂
      猜你喜欢
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 2019-01-07
      • 2020-04-16
      • 2018-11-04
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多