删除s3存储桶中的所有文件,但不删除所有目录

时间:2019-06-18 15:02:00

标签: python amazon-web-services amazon-s3 automation aws-lambda

因此,我写了一个漂亮的脚本来删除s3存储桶中的所有内容,下面将对此进行共享。唯一的问题是此脚本也删除目录。我有一个数据提取存储桶,需要保留其目录,但每天都要删除其文件。任何人都有关于如何修改它以不删除目录的想法?

我已经看到可以执行类似操作的CLI命令,但是我需要弄清楚如何从lambda函数运行这些命令

import json
import boto3

def empty_s3_bucket():
  client = boto3.client(
    's3'
   )
bucketNames = ["bucket1","bucket2"]
for bucketName in bucketNames:
    response = client.list_objects_v2(Bucket=bucketName)
  if 'Contents' in response:
    for item in response['Contents']:
      print('deleting file', item['Key'])
      client.delete_object(Bucket=bucketName, Key=item['Key'])
      while response['KeyCount'] == 1000:
        response = client.list_objects_v2(
         Bucket=S3_BUCKET,
         StartAfter=response['Contents'][0]['Key'],
       )
      for item in response['Contents']:
        print('deleting file', item['Key'])
        client.delete_object(Bucket=S3_BUCKET, Key=item['Key'])

def lambda_handler(event, context):
  empty_s3_bucket()
  return {
    'statusCode': 200,
    'body': json.dumps('Buckets cleared!')
  }

2 个答案:

答案 0 :(得分:2)

s3中没有目录或文件之类的概念。这里的一切都是对象,因此没有区分的好方法。您可能会考虑重组存储在存储桶中的内容,因此一个存储桶实际上存储的是文件夹对象,而另一个存储存储在根目录中的文件。或者,您可以将文件放在特定的“文件夹”中,然后仅在其中删除文件。

但是,在大多数情况下,该目录将以\结尾(用于在控制台中创建,或以/用于其他人结束),因此您必须添加一个{{1 }},然后再执行删除操作:

if

答案 1 :(得分:1)

目录在S3中并不真正存在。像“ foo / bar / baz”这样的键就是这样,“ foo”和“ bar”并不分开存在。因此,如果需要保留“目录”,则需要保留一些包含这些目录的文件作为其键的一部分。