使用删除标记 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用删除标记

Amazon S3 中的删除标记是用于在简单 DELETE 请求中指定的、启用了版本控制的对象的占位符(或标记)。简单 DELETE 请求是指未指定版本 ID 的请求。因为对象位于已启用版本控制的存储桶中,所以不能删除该对象。但是,删除标记可以使 Amazon S3 的行为类似于对象已被删除。在删除标记上可以使用 Amazon S3 API DELETE 调用。为此,您必须使用具有适当权限的 Amazon Identity and Access Management (IAM) 用户或角色来发出 DELETE 请求。

与任何其他对象一样,删除标记同样有键名(或)和版本 ID。但是,删除标记在以下方面与其他对象不同:

  • 删除标记没有与之关联的数据。

  • 删除标记不与访问控制列表 (ACL) 值关联。

  • 如果您针对删除标记发出 GET 请求,则 GET 请求不会检索任何内容,因为删除标记没有数据。具体而言,如果您的 GET 请求未指定 versionId,则会收到 404(未找到)错误。

删除标记会对 Amazon S3 中的存储产生极少的费用。删除标记的存储大小等于删除标记键名的大小。键名是 Unicode 字符序列。对于名称中的每个字符,键名的 UTF-8 编码将 1 到 4 字节的存储添加到存储桶中。删除标记存储在 S3 Standard 存储类中。

如果您想知道自己有多少个删除标记以及它们存储在哪个存储类中,可以使用 Amazon S3 Storage Lens 存储统计管理工具。有关更多信息,请参阅 使用 Amazon S3 Storage Lens 存储统计管理工具评估您的存储活动和使用情况Amazon S3 Storage Lens 存储统计管理工具指标词汇表

有关键名称的更多信息,请参阅 创建对象键名称。有关将删除标记删除的信息,请参阅 管理删除标记

仅 Amazon S3 可以创建删除标记,且当您在已启用版本控制或已暂停版本控制的存储桶的对象上发送 DeleteObject 请求时执行此操作。在 DELETE 请求中指定的对象不会实际删除。而是使删除标记成为对象的当前版本。该对象的键名(键)将成为删除标记的键。

如果您获取对象而未在请求中指定 versionId,如果其当前版本是一个删除标记,则 Amazon S3 的响应如下:

  • 404(未找到)错误

  • 响应标头,x-amz-delete-marker: true

当您通过在请求中指定 versionId 来获取对象时,如果其当前版本是一个删除标记,则 Amazon S3 的响应如下:

  • 405(不允许此方法)错误

  • 响应标头,x-amz-delete-marker: true

  • 响应标头,Last-Modified: timestamp(仅在使用 HeadObjectGetObject API 操作时)

x-amz-delete-marker: true 响应标头告知您所访问的对象是删除标记。此响应标头永远不会返回 false,因为当值为时 false,对象的当前版本或指定版本不是删除标记。

Last-Modified 响应标头提供删除标记的创建时间。

下图显示了对当前版本为删除标记的对象进行 GetObject API 调用时,该调用如何使用 404(未找到)错误进行响应且响应标头中包括 x-amz-delete-marker: true


            图中显示了对删除标记的 GetObject 调用返回 404(未找到)错误。

如果您通过在请求中指定 versionId 来对对象进行 GetObject 调用,并且指定的版本是删除标记,则 Amazon S3 会以 405(不允许方法)错误进行响应,且响应标头包括 x-amz-delete-marker: trueLast-Modified: timestamp


            图中显示,如果您在请求中指定的版本 ID 为删除标记,则对删除标记的 GetObject 调用会返回 405(不允许方法)错误。

列出删除标记(和对象的其他版本)的唯一方法在 versions 请求中使用 ListObjectVersions 子资源。下图显示 ListObjectsV2ListObjects 请求不会返回其当前版本为删除标记的对象。


            图中显示了 ListObjectsV2 或 ListObjects 调用在响应中不返回任何删除标记。