要实现标题中的内容,我正在尝试执行几个步骤(使用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,并且它们都是有效的,它应该能够获取该对象。 感谢您阅读我的帖子。
答案 0 :(得分:0)
s3.get_object()
尝试检索对象的当前版本,除非您包含其他版本的VersionId
,所以您观察到的行为是正确的-当前版本的ETag版本与您传递的etag值不匹配,因此前提条件失败。 ETag不是查找键,IfMatch不是选择器(这是一个有条件的请求-“除非先决条件匹配,否则不要给我对象”),无论如何,对象的多个版本可以具有相同的如果对象版本具有相同的有效负载,则使用ETag(取决于您在存储桶上使用的加密类型-标准仅要求有效负载不同时etag有所不同;如果有效负载匹配,则技术上不要求它们匹配)。>
还要注意,如果只需要元数据,则出于成本和性能方面的原因,应使用s3.head_object()
以避免获取对象有效载荷。