当需要删除超过 400K 个对象时,AWS S3 的默认删除操作会显得非常缓慢。下面给出一种较为高效的删除方法,使用 AWS S3 的 ListObjectV2 API,设置参数 MaxKeys 为 1000 来获取对象列表,然后进行分批删除。
以下是 Python 代码示例:
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('your-bucket-name')
def delete_objects(s3, bucket, objects):
delete_marker_batch = {'Objects': []}
for obj in objects:
delete_marker_batch['Objects'].append({'Key': obj.key})
if len(delete_marker_batch['Objects']) == 1000:
bucket.delete_objects(Delete=delete_marker_batch)
delete_marker_batch = {'Objects': []}
if delete_marker_batch['Objects']:
bucket.delete_objects(Delete=delete_marker_batch)
def delete_all_objects(s3, bucket):
keys = []
for obj in bucket.objects.all():
keys.append(obj)
if len(keys) == 1000:
delete_objects(s3, bucket, keys)
keys = []
if keys:
delete_objects(s3, bucket, keys)
delete_all_objects(s3, bucket)
在此示例中,delete_all_objects 函数首先获取对象列表,将其存储到 keys 列表中。当 keys 列表的长度达到 1000 时,就调用 delete_objects 函数进行删除。
delete_objects 函数使用 delete_object API 批量删除对象。 当 delete_marker_batch 列表长度达到 1000 时,调用 bucket.delete_objects 函数。 在进行最后一次删除之前,如果 delete_marker_batch 列表的长度少于 1000,也会调用 bucket.delete_objects 函数。