来自 S3 多个对象删除的不正确 JSON 响应

incorrect JSON response from S3 Multiple Objects Delete

我正在尝试删除 S3 项目列表,但发现 API 调用的响应似乎不正确:

根据 API,response 应仅在这种情况下包含 已删除 列表:

Deleted

Container element for a successful delete. It identifies the object that was successfully deleted.

Children: Key, VersionId

Type: Container

Ancestor: DeleteResult

delete_json 是:

{
   'Objects':[
      {
         'Key':'test1'
      },
      {
         'Key':'test2'
      },
      {
         'Key':'test3'
      },
      {
         'Key':'test4'
      }
   ],
   'Quiet':False
}

Python 要删除的代码:

response = self.client.delete_objects(Bucket=s3_bucket, Delete=delete_json)

响应是:

{
   'Deleted':[
      {
         'DeleteMarkerVersionId':'null',
         'Key':'test1',
         'DeleteMarker':True
      },
      {
         'DeleteMarkerVersionId':'null',
         'Key':'test2',
         'DeleteMarker':True
      },
      {
         'DeleteMarkerVersionId':'null',
         'Key':'test3',
         'DeleteMarker':True
      },
      {
         'DeleteMarkerVersionId':'null',
         'Key':'test4',
         'DeleteMarker':True
      }
   ],
   'ResponseMetadata':{
      'HostId':'JDl4XNrK02lfBLXCDDIJjuPXG6tOovOp0dtCv7eMlHc0hGC2L7eSV/wb/XRBFyYQ9mHHzb0O/Yg=',
      'HTTPStatusCode':200,
      'RequestId':'2F2A9FAE7F906B8'
   }
}

这是一个错误吗?

正如您在评论中确认的那样,此存储桶启用了版本控制,随后被暂停。

这与从未启用版本控制的存储桶不同。一旦存储桶启用了版本控制,它始终是一个版本控制的存储桶,但是新对象、覆盖和删除的版本控制行为是不同的。

来自 API 文档,您引用的页面:

Because versioning is enabled on the bucket, Amazon S3 does not delete the object. Instead, it adds a delete marker for this object. The response indicates that a delete marker was added (the DeleteMarker element in the response as a value of true) and the version number of the delete marker it added.

获取该信息,然后向其中添加版本控制暂停时必须遵循的行为。删除标记的版本号为空,因为这就是删除标记在版本控制挂起桶中的工作方式。删除标记替换对象的 null 版本(如果存在),并采用 null 本身的 ID。

http://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingObjectsfromVersioningSuspendedBuckets.html

此外,您的删除操作可能实际上并没有删除所需的对象,如果它不是该对象的空版本。该对象只会显示为已被删除。

API 回复似乎是正确的。