来自 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 回复似乎是正确的。
我正在尝试删除 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 回复似乎是正确的。