У меня есть корзина S3 с вложенными папками и файловыми структурами.Я понимаю, что у S3 плоская концепция, но потерпите меня, когда я четко формулирую свою проблему.
Я хотел бы сделать это:
delete bucket/do-not-delete-folder/delete-this-folder-recursively
Я уже вылил документы S3 и следовал за ответами на python - Amazon S3 boto - как удалитьпапка?- Переполнение стека .
Я пробовал два разных решения, и они дают два разных выхода, вы догадались, никто из них не делает то, что я хочу.
Функция 1:
При этом рекурсивно удаляется «do-not-delete-folder» и все его содержимое.Я хочу только удалить подпапку, а не папку верхнего уровня.
Я вызываю это со следующими параметрами:
DeleteAWSBucketObjects(my-bucket, do-not-delete-folder/delete-this-folder/)
Функция:
def DeleteAWSBucketObjects(bucketName, prefixStr):
s3 = boto3.resource('s3')
bucket = s3.Bucket(bucketName)
try:
client = boto3.client('s3')
response = client.list_objects_v2(Bucket=bucketName, Prefix=prefixStr)
if 'Contents' in response:
for item in response['Contents']:
while response['KeyCount'] == 1000:
response = client.list_objects_v2(Bucket=bucketName,
StartAfter=response['Contents'][0]['Key'],)
for item in response['Contents']:
client.delete_object(Bucket=bucketName, Key=item['Key'])
except ClientError as e:
error_code = int(e.response['Error']['Code'])
print ("DeleteAWSBucketObjects : hit an exception")
print (error_code)
return
Функция 2:
Принято по ссылке, указанной выше.Я называю это теми же параметрами, что и упомянутые выше.
Как ни странно, это приводит к ошибке Access-denied
.Я запускаю его из одного и того же кодового файла в Lambda и из тех же учетных записей AWS, поэтому я не уверен, почему одна версия функции удаляет все, а другая не имеет доступа для удаления чего-либо.
DeleteAWSBucketObjectsV2(my-bucket, do-not-delete-folder/delete-this-folder/)
Функция:
def DeleteAWSBucketObjectsV2(bucketName, prefixStr):
s3 = boto3.resource('s3')
bucket = s3.Bucket(bucketName)
objects_to_delete = s3.meta.client.list_objects(Bucket=bucketName, Prefix=prefixStr)
delete_keys = {'Objects' : []}
delete_keys['Objects'] = [{'Key' : k} for k in [obj['Key'] for obj in objects_to_delete.get('Contents', [])]]
for i in delete_key:
print("delete_key_array !!!")
print(str(i))
try:
s3.meta.client.delete_objects(Bucket="MyBucket", Delete=delete_keys)
except ClientError as e:
error_code = int(e.response['Error']['Code'])
print ("DeleteAWSBucketObjects : hit an exception")
print (error_code)