首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用python删除S3中对象的所有版本?

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

Stack Overflow用户
提问于 2017-10-18 21:32:08
回答 12查看 22.8K关注 0票数 17

我有一个版本化的存储桶,希望从桶中删除对象(及其所有版本)。但是,当我尝试从控制台中删除对象时,S3只是添加了一个删除标记,但没有执行硬删除。

是否可以使用特定的键删除对象的所有版本(硬删除)?:

代码语言:javascript
运行
复制
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()
EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2017-10-18 22:42:40

作为@jarmod答案的补充,我开发了一种解决方法来“硬删除”一个对象(包括删除标记的对象);

代码语言:javascript
运行
复制
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)
票数 4
EN

Stack Overflow用户

发布于 2019-01-07 20:38:42

其他回答分别删除对象。使用delete_objects boto3调用和批处理删除更有效。请参阅以下函数的代码,该函数收集所有对象并在1000批中删除:

代码语言:javascript
运行
复制
bucket = 'bucket-name'
s3_client = boto3.client('s3')
object_response_paginator = s3_client.get_paginator('list_object_versions')

delete_marker_list = []
version_list = []

for object_response_itr in object_response_paginator.paginate(Bucket=bucket):
    if 'DeleteMarkers' in object_response_itr:
        for delete_marker in object_response_itr['DeleteMarkers']:
            delete_marker_list.append({'Key': delete_marker['Key'], 'VersionId': delete_marker['VersionId']})

    if 'Versions' in object_response_itr:
        for version in object_response_itr['Versions']:
            version_list.append({'Key': version['Key'], 'VersionId': version['VersionId']})

for i in range(0, len(delete_marker_list), 1000):
    response = s3_client.delete_objects(
        Bucket=bucket,
        Delete={
            'Objects': delete_marker_list[i:i+1000],
            'Quiet': True
        }
    )
    print(response)

for i in range(0, len(version_list), 1000):
    response = s3_client.delete_objects(
        Bucket=bucket,
        Delete={
            'Objects': version_list[i:i+1000],
            'Quiet': True
        }
    )
    print(response)
票数 13
EN

Stack Overflow用户

发布于 2017-10-18 22:28:19

文档在这里很有用:

  1. 当在S3桶中启用版本控制时,简单的DeleteObject请求不能永久地从该桶中删除对象。相反,亚马逊S3插入一个删除标记(这实际上是一个带有自己版本ID的对象的新版本)。
  2. 当您试图获取当前版本为delete标记的对象时,S3的行为就好像该对象已被删除一样(尽管它没有删除),并返回一个404错误。
  3. 要从版本化的桶中永久删除对象,请对对象的每个版本(包括删除标记)使用带有相关版本ID的删除标记
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46819590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档