如何从存储桶中列出所有对象的版本及其各自的元数据(x-amz-meta-version)

时间:2019-03-09 06:46:41

标签: amazon-s3 aws-sdk

要实现标题中的内容,我正在尝试执行几个步骤(使用python和AWS开发工具包),在提到错误后我将列出这些步骤是412“至少您指定的先决条件之一没有在方法get_object的第二次迭代中,当我向其发送以下参数时:“ bucket”,“ key”和“ IfMatch”(在此行中失败)。

使用以下代码列出所有对象的版本

s3 = boto3.client('s3')
response = s3.list_object_versions(
                    Bucket='my-bucket',
                    Prefix='file.exe'
                )
obj_versions = response["Versions"]

这完全可以,但是我需要在元数据中设置的版本(x-amz-meta-version),以获得每个对象的元数据版本,我正在尝试执行以下操作:

obj_info = []
for obj_version in obj_versions:
    obj = s3.get_object(
            Bucket='my-bucket',
            Key='file.exe',
            IfMatch=obj_version['ETag']
        )
    obj_info.append(obj['Metadata']['version'])

就是这样,目前它只能工作到第二次迭代为止,它总是失败,并且在s3.get_object(IfMatch)行中显示412“您指定的至少一个前提条件不成立”。我肯定知道错误是在前提条件IfMatch中,但是我不知道出了什么问题……我已经打印了接收到的每个ETag,并且它们都是有效的,它应该能够获取该对象。 感谢您阅读我的帖子。

1 个答案:

答案 0 :(得分:0)

s3.get_object()尝试检索对象的当前版本,除非您包含其他版本的VersionId,所以您观察到的行为是正确的-当前版本的ETag版本与您传递的etag值不匹配,因此前提条件失败。 ETag不是查找键,IfMatch不是选择器(这是一个有条件的请求-“除非先决条件匹配,否则不要给我对象”),无论如何,对象的多个版本可以具有相同的如果对象版本具有相同的有效负载,则使用ETag(取决于您在存储桶上使用的加密类型-标准仅要求有效负载不同时etag有所不同;如果有效负载匹配,则技术上不要求它们匹配)。

还要注意,如果只需要元数据,则出于成本和性能方面的原因,应使用s3.head_object()以避免获取对象有效载荷。