【问题标题】:What is the fastest way to empty s3 bucket using boto3?使用 boto3 清空 s3 存储桶的最快方法是什么?
【发布时间】:2021-06-01 05:17:24
【问题描述】:

我正在考虑删除然后重新创建存储桶(我后来意识到的不好的选择)。

那怎样才能从bucket中删除所有对象呢?

我试过这个:http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Bucket.delete_objects

但它会删除多个对象而不是全部。

你能建议清空桶的最佳方法吗?

【问题讨论】:

标签: python python-2.7 boto3


【解决方案1】:

只需使用aws cli

aws s3 rm s3://mybucket --recursive

好吧,如果您坚持使用 boto3,请提供更长的答案。这会将删除标记发送到 s3。无需文件夹处理。 bucket.Object.all 将创建一个不限于 1K 的迭代器。

import boto3    
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket')
# suggested by Jordon Philips 
bucket.objects.all().delete()

【讨论】:

  • 你也可以只做bucket.objects.all().delete(),不过如果你的桶是版本化的,它会变得有点复杂
  • @JordonPhillips 感谢您的回答。这对我有用,因为我没有为我的存储桶使用版本控制。但是这样会不会把bucket里面的所有对象都找出来,然后一一删除呢?当桶中有大量数据时会发生什么?会不会很慢?
  • @TusharNiras,当您使用 sn-p 时,boto3 将使用 delete_objects,因此您将在每页对象中发出一个请求(一次最多 1000 个)。这是在没有线程的情况下可以做到的最快速度。
  • @Davos 在第二次之后,我删除了 bucket.delete() ,以防万一测试脚本的人删除了他们的存储桶。
  • 看起来你现在可以跳过.all(),直接做bucket.objects.delete()boto3.amazonaws.com/v1/documentation/api/latest/reference/….
【解决方案2】:

如果启用了版本控制,则会对另一个答案进行类似的调用以删除所有对象版本:

import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('bucket-name')
bucket.object_versions.delete()

【讨论】:

  • 我发现这非常慢。它似乎在完成时收集并返回有关每个对象的详细信息,也许这就是为什么?有什么提示吗? (我知道专门针对 boto3 提出的问题,但控制台“空”选项要快得多)
【解决方案3】:

根据之前的响应,并添加启用版本控制的检查,您可以清空存储桶,启用或不启用版本:

s3 = boto3.resource('s3')
s3_bucket = s3.Bucket(bucket_name)
bucket_versioning = s3.BucketVersioning(bucket_name)
if bucket_versioning.status == 'Enabled':
    s3_bucket.object_versions.delete()
else:
    s3_bucket.objects.all().delete()

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 2016-08-29
    • 2018-08-28
    • 2021-03-29
    • 2017-01-02
    • 1970-01-01
    • 2021-11-25
    • 2021-07-26
    • 2015-09-14
    相关资源
    最近更新 更多