获取amazon s3存储桶中所有版本的对象?

时间:2014-05-27 05:07:26

标签: amazon-web-services amazon-s3 key version

我启用了一个桶版本。我想获得一个密钥的所有版本。但我找不到方法去做这件事。有人可以帮帮我吗?

4 个答案:

答案 0 :(得分:1)

AWS支持通过前缀获取所有对象版本,因此您可以使用您的密钥作为此前缀,它可以正常工作,请尝试。

答案 1 :(得分:0)

我会看看Amazon S3 documentation.您需要列出该对象的所有版本,然后遍历列表。

答案 2 :(得分:0)

您可以使用AWS CLI获取存储桶中所有版本的列表

aws s3api list-object-versions --bucket bucketname

使用python,

session = boto3.Session(aws_access_key_id, aws_secret_access_key)

s3 = session.client('s3')

bucket_name = 'bucketname'

versions = s3.list_object_versions (Bucket = bucket_name)

print(versions.get('Versions'))

答案 3 :(得分:0)

所以,今天早上我碰到了这堵砖墙。事实证明,这看似微不足道的事情很难做到。

您想要的API是GET Bucket Object versions API,但遗憾的是使用起来并不平凡。

首先,您必须避免一些非解决方案:KeyMarker,它由boto3记录为

  

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

…列出存储桶中的对象时,不以指定的键开头;相反,它会在该键后 后立即开始,这使它在这里有点用处。

此API提供的最佳限制是Prefix;这并不是一个完美的选择,因为可能有一些钥匙不是我们感兴趣的钥匙,但仍然包含我们的钥匙。

还要提防MaxKeys;从字典上讲,我们很容易想到我们的密钥应该是第一个,并且所有以我们的密钥作为其密钥名称前缀的密钥都将跟随,因此我们可以使用MaxKeys对其进行修整;可悲的是,MaxKeys并不控制响应中返回多少键,而是控制版本数。 (而且我想这是事先不知道的。)

因此,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