AWS S3 - Как рекурсивно удалять объекты [GoLang] - PullRequest
0 голосов
/ 12 июня 2019

Я хотел бы удалить все .JPEG файлы по указанному пути в сегменте S3. Например, предположим, что у меня есть структура в облачном сервисе S3, похожая на следующую:

Obj1/
   Obj2/
      Obj3/
         image_1.jpeg
         ...
         image_N.jpeg

Можно ли указать Obj1/Obj2/Obj3 как DeleteObjectsInput's prefix и рекурсивно удалить все .JPEG файлы, содержащие такие prefix.

Вот мой код:

func (s3Obj S3) Delete() error {
    sess := session.Must(session.NewSession(&aws.Config{
        Region: aws.String(s3Obj.Region),
    }))
    svc := s3.New(sess)

    input := &s3.DeleteObjectsInput{
        Bucket: aws.String(s3Obj.Bucket),
        Delete: &s3.Delete{
            Objects: []*s3.ObjectIdentifier{
                {
                    Key: aws.String(s3Obj.ItemPath),
                },
            },
            Quiet: aws.Bool(false),
        },
    }

    result, err := svc.DeleteObjects(input)
    if err != nil {
        if aerr, ok := err.(awserr.Error); ok {
            switch aerr.Code() {
            default:
                glog.Errorf("Error occurred while trying to delete object from S3. Error message - %v", aerr.Error())
            }
        } else {
            glog.Errorf("Error occurred while trying to delete object from S3. Error message - %v", err.Error())
        }
        return err
    }

    glog.Info(result)
    return nil
}

sObj3.ItemPath представляет Obj1/Obj2/Obj3 путь из примера выше. В результате этой функции я не получаю никакой ошибки. На самом деле я получаю следующее сообщение:

Deleted: [{
      Key: "Obj1/Obj2/Obj3"
    }]

Но когда я проверяю свой облачный сервис S3, ничего не делается. Что я делаю не так?

EDIT

Я изменил свой код, поэтому моя функция Delete принимает список объектов, из которых я составляю список s3.ObjectIdentifier. В этом списке примерно 50 файлов .JPEG, и по какой-то причине следующий код ТОЛЬКО УДАЛЯЕТ ПОСЛЕДНИЙ . Я не уверен почему.

func (s3Obj S3) Delete(objects []string) error {
    sess := session.Must(session.NewSession(&aws.Config{
        Region: aws.String(s3Obj.Region),
    }))
    svc := s3.New(sess)

    var objKeys = make([]*s3.ObjectIdentifier, len(objects))
    for i, v := range objects {
        glog.Info("About to delete: ", v)
        objKeys[i] = &s3.ObjectIdentifier{
            Key: &v,
        }
    }

    input := &s3.DeleteObjectsInput{
        Bucket: aws.String(s3Obj.Bucket),
        Delete: &s3.Delete{
            Objects: objKeys,
            Quiet:   aws.Bool(false),
        },
    }

    result, err := svc.DeleteObjects(input)
    if err != nil {
        if aerr, ok := err.(awserr.Error); ok {
            switch aerr.Code() {
            default:
                glog.Errorf("Error occurred while trying to delete object from S3. Error message - %v", aerr.Error())
            }
        } else {
            glog.Errorf("Error occurred while trying to delete object from S3. Error message - %v", err.Error())
        }
        return err
    }

    glog.Info(result)
    return nil
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...