使用 boto 从 s3 中删除目录

Using boto to remove a directory from s3

我有以下代码尝试从 S3 中删除目录:

    s3 = boto.connect_s3(
        aws_access_key_id=settings.AWS_ACCESS_KEY_ID,
        aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY,
    )
    bucket = s3.lookup(self.bucket_name)
    if not bucket:
        return True

    key = Key(bucket, "test/%s/%s" % (
        self.account_id,
        self.id
    ))

    key.delete()

代码运行时不会失败。但是目录没有被删除。如果我在目录中添加一个文件,那么它会被删除而不是目录。

我正在将 Python 2.7 与 Boto 2 一起使用,但无法弄明白

目录实际上并不存在于 Amazon S3 中。

Amazon S3 是对象存储,而不是文件系统。所有对象都存储在平面结构中,但文件名 ('Key') 可以包含斜线以充当目录。

因此,s3://my-bucket/foo/bar.txt 不在 foo 目录中。相反,密钥是 foo/bar.txt.

这有一个有趣的 属性,您可以在不存在的目录中将文件添加到 S3,然后神奇地 'appear' 创建目录:

aws s3 cp foo s3://my-bucket/dir1/dir2/foo

删除该对象会使目录也神奇地消失,因为它们实际上并不存在。

然而,这又提出了一个问题,即当用户单击 创建文件夹 按钮时,AWS 管理控制台中的目录是如何 'created' 的?答案是控制台创建了一个零长度对象 'hold the place' 并使目录看起来在那里:

$ aws s3 ls s3://my-bucket/dir
2017-03-16 22:53:53          0 

下面是一些示例代码,用于删除所有存储桶以及这些存储桶中的对象,其中存储桶名称以 -cheese 结尾。 (请注意,此代码不适用于版本化存储桶。)

#!/usr/bin/env python

from boto.s3.connection import S3Connection

conn = S3Connection()

buckets = conn.get_all_buckets()

for b in buckets:
  if b.name.endswith("-cheese"):

    print "Processing bucket", b.name
    objects = b.list()
    for o in objects:
      print "Deleting object", o.key
      b.delete_key(o.key)

    print "Deleting bucket", b.name
    conn.delete_bucket(b.name)