如何从 S3 版本化存储桶下载文件的当前版本

How to download the current version of a file from an S3 versioned bucket

我有多个版本的对象,我正在尝试比较我可以删除哪些版本。我基本上想删除与当前版本大小相同的任何版本。 我遇到的问题是我无法找出哪个返回版本是 latest/current.

如果我使用 aws cli,它 returns 一个名为 'IsLatest' 的字段,但显然,boto3 版本没有。 aws cli 也总是 returns StorageClass 而 boto3 在某些情况下显然不是。

Return 来自 boto3:

{'ResponseMetadata': {'RequestId': 'PHQFMDCF3AHQM6R1', 'HostId': 'b7PmgsVm6y30wfA9GExS+Rc659cu1DI4YFec3i7tvDBew8ob5tY0Mtz6q+yC9nTwdmAoykdV7Lo=', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amz-id-2': 'b7PmgsVm6y30wfA9GExS+Rc659cu1DI4YFeR3i7tVDBeu8ab5tY0Mtz6X+yC9nTwdmAoykdV7Lo=', 'x-amz-request-id': 'PHQFMDTB32HQM6R1', 'date': 'Sat, 19 Feb 2022 22:42:14 GMT', 'last-modified': 'Thu, 17 Feb 2022 17:02:54 GMT', 'etag': '"55f146382684970d4970ae31b3d4b310"', 'x-amz-server-side-encryption': 'AES256', 'x-amz-version-id': 'gHm2D2uuosJQS6GpmuySU9uNSXN84cq9', 'accept-ranges': 'bytes', 'content-type': 'text/plain', 'server': 'AmazonS3', 'content-length': '969'}, 'RetryAttempts': 0}, 'AcceptRanges': 'bytes', 'LastModified': datetime.datetime(2022, 2, 17, 17, 2, 54, tzinfo=tzutc()), 'ContentLength': 969, 'ETag': '"55f141382684970d4970ae31b3d4b310"', 'VersionId': 'gHa2D2uuosJQS6GpmuySU9uNSXN84cR9', 'ContentType': 'text/plain', 'ServerSideEncryption': 'AES256', 'Metadata': {}, 'Body': <botocore.response.StreamingBody object at 0x10f29e1c0>}
Versioning_Test/file1.txt

来自 aws cli 的响应:

        {
            "ETag": "\"55f141382684970d4970ae31b3d4b310\"",
            "Size": 969,
            "StorageClass": "STANDARD",
            "Key": "Versioning_Test/file1.txt",
            "VersionId": "gHa2D2uuosJQS6GpmuySU9uNSXN84cR9",
            "IsLatest": true,
            "LastModified": "2022-02-17T17:02:54+00:00",
            "Owner": {
                "ID": "1e5bc34834bec07ae1bc55a5d07adab10d7d58da04ae761769339a914d1ab472"
            }
        },

这是我的 python 脚本:


bucket_name = 'bucket-name'
profile_name = 'aws-profile-name'

key = ''
session = boto3.session.Session(profile_name=profile_name)
s3 = session.resource('s3')
versions = s3.Bucket(bucket_name).object_versions.filter()

for version in versions:
    print(version.object_key)
    obj = version.get()
    print(obj)
    #print("\t" + obj.get('VersionId'), obj.get('ContentLength'), obj.get('LastModified'), obj.get('IsLatest'), obj.get('StorageClass'))

我错过了什么?

您可以使用 list_object_versions API:

列出存储桶中的对象版本
import boto3

bucket_name = 'bucket-name'
profile_name = 'aws-profile-name'

if __name__ == "__main__":
    session = boto3.Session(profile_name=profile_name)
    client = session.client('s3')
    response = client.list_object_versions(Bucket=bucket_name)
    for version in response['Versions']:
        print(f'Key: {version["Key"]}, Size: {version["Size"]} bytes, Latest: {version["IsLatest"]}'
              f' LastModified: {version["IsLatest"]}, StorageClass: {version["StorageClass"]}')

您可以注意到来自 AWS 的响应也包含 IsLatest 属性。