获取 AWS S3 存储桶中对象的所有版本?

ZZB*_*ZZB 6 key version amazon-s3 amazon-web-services

我在存储桶上启用了对象版本控制。我想在该存储桶中获取所有版本的密钥。但我找不到方法去做这件事;如何使用 S3 API 实现这一目标?

Tha*_*tos 6

所以,今天早上我遇到了这堵砖墙。事实证明,这件看似微不足道的事情做起来非常困难。

\n\n

您想要的 API 是GET Bucket Object 版本 API,但遗憾的是它的使用并不简单。

\n\n

首先,您必须避开一些非解决方案:KeyMarker,这是由boto3

\n\n
\n

关键标记 (字符串) --指定列出存储桶中的对象时开始的键。

\n
\n\n

\xe2\x80\xa6列出桶中的对象时不以指定的key开头;相反,它立即开始立即开始,这使得它在这里有些无用。

\n\n

这个API提供的最好的限制是Prefix;这不会是完美的,因为可能有一些不是我们感兴趣的密钥,但仍然包含我们的密钥。

\n\n

还要提防MaxKeys;人们很容易认为,按字典顺序,我们的键应该是第一个,并且所有以我们的键作为其键名前缀的键都将跟随,因此我们可以使用 ; 修剪它们MaxKeys。可悲的是,MaxKeys它控制的不是响应中返回的密钥数量,而是版本的数量。(我假设事先不知道这一点。)

\n\n

所以,Prefix这似乎是能做到的最好的事情。另请注意,至少在某些语言中,客户端库不会为您处理分页,因此您还需要处理该问题。

\n\n

作为一个例子boto3

\n\n
response = client.list_object_versions(\n    Bucket=bucket_name, Prefix=key_name,\n)\nwhile True:\n    # Process `response`\n    ...\n    # Check if the results got paginated:\n    if response[\'IsTruncated\']:\n        response = client.list_object_versions(\n            Bucket=bucket_name, Prefix=key_name,\n            KeyMarker=response[\'NextKeyMarker\'],\n            VersionIdMarker=response[\'NextVersionIdMarker\'],\n        )\n    else:\n       break\n
Run Code Online (Sandbox Code Playgroud)\n


小智 -1

AWS支持通过前缀获取所有对象版本,因此您可以使用您的密钥作为此前缀,效果很好,请尝试一下。