如何获取 S3 密钥的所有版本并使用 boto 取消删除?

How do I get all versions of an S3 key and undelete using boto?

我使用 S3 存储桶有一段时间了,但现在才打开版本控制。对它进行一些试验,试图弄清楚我在不激活 "MFA delete" 选项的情况下仅启用版本控制就获得了什么样的检测保护。

我上传了一个测试文件,然后将其删除,然后重新上传了两次。现在,使用 the S3 browser tool 我看到了文件的 4 个版本:#1、#2(已删除)、#3 和#4(当前)。如果我使用 boto 获取最新版本,我可以提取它的 version_id:

import boto
c=boto.connect_s3()
b=c.get_bucket('my-bucket')
k = b.get_key('test2/dw.txt')
print k.version_id

但是我如何获得给定密钥的 version_id 的完整列表?如果我想检索密钥的版本 #1(已删除),我是否需要先使用版本 #2 id 来 "undelete" 做一些事情?

最后,这种删除保护(创建删除标记)是否适用于在启用版本控制之前上传的遗留文件?

感谢

您可以使用存储桶对象的 list_versions 方法获取所有可用版本的列表。

import boto
c = boto.connect_s3()
bucket = c.get_bucket('my-bucket')
for version in bucket.list_versions():
    print(version)

这将 return 一个包含 Key 个对象的列表,这些对象具有特定的 version_ids 与之关联。您可以检索任何版本,但使用 Key 对象上的常规方法。如果您想将旧版本设为当前版本,则必须重新上传或将其复制到服务器上。

在存储桶上启用版本控制后,在该时间点之后对存储桶中的任何对象执行的所有删除操作都会导致将删除标记写入存储桶,而不是实际删除对象。

您可以使用以下方法获取所有版本的列表

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, Prefix = 'Key')

print(versions.get('Versions'))

这将打印该存储桶中存在的所有版本的列表以及其他信息,如密钥、存储 class、大小等

我没有看到同样撤消删除标记的答案,所以这是我用来专门取消删除一个对象的脚本,如果您使用 AWS S3,则可以忽略 ENDPOINT。

  • 此版本使用分页助手,以防对象的版本多于一个响应(默认为 1000)。
  • 我使用返回的 VersionId 创建一个 s3.ObjectVersion,然后 delete() 以恢复对象。
import boto3
import sys

ENDPOINT='10.62.64.200'

if len(sys.argv) != 3:
    print("Usage: {} bucketname key".format(sys.argv[0]))
    sys.exit(1)

bucketname = sys.argv[1]
key = sys.argv[2]

s3 = boto3.resource('s3', endpoint_url='http://' + ENDPOINT)
kwargs = {'Bucket' : bucketname, 'Prefix' : key}

pageresponse = s3.meta.client.get_paginator('list_object_versions').paginate(**kwargs)

for pageobject in pageresponse:
    if 'DeleteMarkers' in pageobject.keys() and pageobject['DeleteMarkers'][0]['Key'] == key:
        print("Undeleting s3://{}/{}".format(bucketname, key))
        s3.ObjectVersion(bucketname, key, pageobject['DeleteMarkers'][0]['VersionId']).delete()