Amazon S3 рекурсивно удаляет подпапку - PullRequest
0 голосов
/ 31 мая 2018

У меня есть корзина 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)

1 Ответ

0 голосов
/ 31 мая 2018

Что я понимаю из вашего вопроса: вы хотите удалить подпапку с именем delete-this-folder , поэтому вот простой способ сделать это:

import boto3
s3 = boto3.resource('s3')
bucket=s3.Bucket('mausamrest');
obj = s3.Object('mausamrest','do-not-delete-folder/delete-this-folder/')
counter=-1


for obj in bucket.objects.filter(Prefix='do-not-delete-folder/delete-this-folder/'):
    print(obj.key)
    try:
        obj.delete()
        counter=counter+1
    except:
        print("error occurred while deleting")

if(counter==-1):
    print("subfolder doesn't exists")
if(counter!=-1):
    print("1 subfolder and "+str(counter)+" items in it deleted") 

здесь mausamrest - это имя сегмента, а do-not-delete-folder / delete-this-folder / - это подкаталоги

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...