所以,今天早上我遇到了这堵砖墙。事实证明,这件看似微不足道的事情做起来非常困难。
您想要的 API 是获取桶对象版本 https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETVersion.htmlAPI,但遗憾的是它的使用并不简单。
首先,你必须避开一些非解决方案:KeyMarker
,记录为boto3
as,
关键标记 (string)-- 指定列出存储桶中的对象时从哪个键开始。
…列出存储桶中的对象时不以指定键开头;相反,它立即开始after那个键,这使得它在这里有点无用。
这个API提供的最好的限制是Prefix
;这并不完美,因为可能有一些不是我们感兴趣的密钥,但仍然包含我们的密钥。
还要提防MaxKeys
;人们很容易认为,按字典顺序,我们的键应该是第一个,并且所有以我们的键作为其键名前缀的键都将跟随,因此我们可以使用MaxKeys
;可悲的是,MaxKeys
控制的不是响应中返回的密钥数量,而是版本的数量。 (我假设事先不知道这一点。)
So, Prefix
似乎是能做到的最好的事情。另请注意,至少在某些语言中,客户端库不会为您处理分页,因此您还需要处理该问题。
作为一个例子boto3
:
response = client.list_object_versions(
Bucket=bucket_name, Prefix=key_name,
)
while True:
# Process `response`
...
# Check if the results got paginated:
if response['IsTruncated']:
response = client.list_object_versions(
Bucket=bucket_name, Prefix=key_name,
KeyMarker=response['NextKeyMarker'],
VersionIdMarker=response['NextVersionIdMarker'],
)
else:
break