如何列出存储桶中所有 object 的版本及其各自的元数据 (x-amz-meta-version)
How to list all object's versions from a bucket and their respective metadata (x-amz-meta-version)
为了实现标题中的内容,我正在尝试执行几个步骤(使用 python 和 AWS SDK),我将在提到我遇到的错误是 412 "At least one of the preconditions you specified did not hold" 后列出这些步骤在方法 get_object 的第二次迭代中,当我向它发送参数时:bucket、key 和 IfMatch(在这一行失败)。
使用以下代码列出所有 object 的版本
s3 = boto3.client('s3')
response = s3.list_object_versions(
Bucket='my-bucket',
Prefix='file.exe'
)
obj_versions = response["Versions"]
这完全有效,但我需要我在元数据 (x-amz-meta-version) 中设置的版本,以获取每个 object 的元数据版本我正在尝试执行以下操作:
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 "At least one of the preconditions you specified did not hold" 失败。我确定错误在先决条件 IfMatch 中,但我不知道出了什么问题......我已经打印了它正在接收的每个 ETag,它们都是有效的,它应该能够获得 object。
的
感谢您阅读我的 post.
s3.get_object()
尝试检索对象的 当前版本 除非你包含另一个版本的 VersionId
,所以你观察到的行为是正确的 -当前版本的 ETag 与您传递的 etag 值不匹配,因此前提条件失败。 ETag 不是查找键,IfMatch 不是选择器(它是条件请求——"don't give me the object unless the precondition matches"),并且在任何情况下,如果对象版本具有相同的有效负载,则对象的多个版本可以具有相同的 ETag (取决于您在存储桶上使用的加密类型——如果有效负载不同,标准只要求 etags 不同;如果有效负载匹配,它在技术上不要求它们匹配)。
另请注意,如果您只需要元数据,那么出于成本和性能方面的原因,您应该使用 s3.head_object()
来避免获取对象负载。
为了实现标题中的内容,我正在尝试执行几个步骤(使用 python 和 AWS SDK),我将在提到我遇到的错误是 412 "At least one of the preconditions you specified did not hold" 后列出这些步骤在方法 get_object 的第二次迭代中,当我向它发送参数时:bucket、key 和 IfMatch(在这一行失败)。
使用以下代码列出所有 object 的版本
s3 = boto3.client('s3')
response = s3.list_object_versions(
Bucket='my-bucket',
Prefix='file.exe'
)
obj_versions = response["Versions"]
这完全有效,但我需要我在元数据 (x-amz-meta-version) 中设置的版本,以获取每个 object 的元数据版本我正在尝试执行以下操作:
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 "At least one of the preconditions you specified did not hold" 失败。我确定错误在先决条件 IfMatch 中,但我不知道出了什么问题......我已经打印了它正在接收的每个 ETag,它们都是有效的,它应该能够获得 object。 的 感谢您阅读我的 post.
s3.get_object()
尝试检索对象的 当前版本 除非你包含另一个版本的 VersionId
,所以你观察到的行为是正确的 -当前版本的 ETag 与您传递的 etag 值不匹配,因此前提条件失败。 ETag 不是查找键,IfMatch 不是选择器(它是条件请求——"don't give me the object unless the precondition matches"),并且在任何情况下,如果对象版本具有相同的有效负载,则对象的多个版本可以具有相同的 ETag (取决于您在存储桶上使用的加密类型——如果有效负载不同,标准只要求 etags 不同;如果有效负载匹配,它在技术上不要求它们匹配)。
另请注意,如果您只需要元数据,那么出于成本和性能方面的原因,您应该使用 s3.head_object()
来避免获取对象负载。