在S3中使用python删除所有版本的对象?

在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() 
+0

'delete_objects' * should *让你删除对象,不管版本。我不是100%肯定 – Mangohero1

+1

好吧,我将不得不测试这个。它有一个可选的'VersionId'参数,这让我觉得如果我没有明确提供每个对象的版本ID,它只会执行一个软删除(仅删除标记)。 – mouscous

+0

不..只是试了一下。我认为如果我没有指定'VersionId'参数,而只是删除了所有这些参数,只是删除了最新的一个 – Mangohero1

作为@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是很有帮助的位置:

  1. 当版本控制在S3启用存储区,一个简单的DeleteObject请求不能永久删除该存储桶中的一个对象。相反,Amazon S3会插入一个删除标记(实际上它是具有自己版本标识的对象的新版本)。
  2. 当您尝试获取当前版本为删除标记的对象时,S3的行为就好像对象已被删除(即使它没有)并返回404错误。
  3. 要从版本化存储桶中永久删除对象,请针对对象的每个版本(包括delete markers)使用DeleteObject和相关的版本ID。
+0

您好jarmod。感谢您的回应 - 我确实阅读了文档,但我想知道这是否是唯一的方法(即获取所有版本的对象列表并迭代删除每个对象)。 – mouscous