因此,我写了一个漂亮的脚本来删除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!')
}
答案 0 :(得分:2)
s3中没有目录或文件之类的概念。这里的一切都是对象,因此没有区分的好方法。您可能会考虑重组存储在存储桶中的内容,因此一个存储桶实际上存储的是文件夹对象,而另一个存储存储在根目录中的文件。或者,您可以将文件放在特定的“文件夹”中,然后仅在其中删除文件。
但是,在大多数情况下,该目录将以\
结尾(用于在控制台中创建,或以/
用于其他人结束),因此您必须添加一个{{1 }},然后再执行删除操作:
if
答案 1 :(得分:1)
目录在S3中并不真正存在。像“ foo / bar / baz”这样的键就是这样,“ foo”和“ bar”并不分开存在。因此,如果需要保留“目录”,则需要保留一些包含这些目录的文件作为其键的一部分。