在S3中使用python删除所有版本的对象?
问题描述:
我有一个版本化的存储桶,并希望从存储桶中删除对象(及其所有版本)。但是,当我尝试从控制台删除对象时,S3只是添加了一个删除标记,但不执行硬删除。在S3中使用python删除所有版本的对象?
是否可以删除对象的所有版本(硬删除)与特定键?:
s3resource = boto3.resource('s3')
bucket = s3resource.Bucket('my_bucket')
obj = bucket.Object('my_object_key')
# I would like to delete all versions for the object like so:
obj.delete_all_versions()
# or delete all versions for all objects like so:
bucket.objects.delete_all_versions()
答
作为@jarmod的答案的补充,我开发了一种方法来“硬删除”一个对象(包括删除市场对象);
def get_all_versions(bucket, filename):
s3 = boto3.client('s3')
keys = ["Versions", "DeleteMarkers"]
results = []
for k in keys:
response = s3.list_object_versions(Bucket=bucket)[k]
to_delete = [r["VersionId"] for r in response if r["Key"] == filename]
results.extend(to_delete)
return results
bucket = "YOUR BUCKET NAME"
file = "YOUR FILE"
for version in get_all_versions(bucket, file):
s3.delete_object(Bucket=bucket, Key=file, VersionId=version)
答
的documentation是很有帮助的位置:
- 当版本控制在S3启用存储区,一个简单的DeleteObject请求不能永久删除该存储桶中的一个对象。相反,Amazon S3会插入一个删除标记(实际上它是具有自己版本标识的对象的新版本)。
- 当您尝试获取当前版本为删除标记的对象时,S3的行为就好像对象已被删除(即使它没有)并返回404错误。
- 要从版本化存储桶中永久删除对象,请针对对象的每个版本(包括delete markers)使用DeleteObject和相关的版本ID。
+0
您好jarmod。感谢您的回应 - 我确实阅读了文档,但我想知道这是否是唯一的方法(即获取所有版本的对象列表并迭代删除每个对象)。 – mouscous
'delete_objects' * should *让你删除对象,不管版本。我不是100%肯定 – Mangohero1
好吧,我将不得不测试这个。它有一个可选的'VersionId'参数,这让我觉得如果我没有明确提供每个对象的版本ID,它只会执行一个软删除(仅删除标记)。 – mouscous
不..只是试了一下。我认为如果我没有指定'VersionId'参数,而只是删除了所有这些参数,只是删除了最新的一个 – Mangohero1