Как установить параметр S3 Request Payer при использовании aws-sdk-v2?

Я пытаюсь использовать aws-sdk-go-v2 для извлечения некоторых данных из корзины S3. Для этого мне нужно установить опцию Request Payer, однако, поскольку я новичок в использовании SDK, я понятия не имею, как это сделать.

Я попытался установить это как переменную env AWS_REQUEST_PAYER=requester, но быстро просканировав исходный код для этого golang SDK, я не смог найти, что он будет выбран SDK в качестве опции.

Использование SDK по указанию также завершается сбоем с неавторизованным ответом:

import (
    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/feature/s3/manager"
    "github.com/aws/aws-sdk-go-v2/service/s3"
)

type awsArchive struct {
    bucket string
    config config.Config
    client *s3.Client
}

func (s *awsArchive) download(uri string, dest string) error {

    downloader := manager.NewDownloader(s.client)
    paginator := s3.NewListObjectsV2Paginator(s.client, &s3.ListObjectsV2Input{
        Bucket: &s.bucket,
        Prefix: &uri,
    })

    for paginator.HasMorePages() {
        page, err := paginator.NextPage(context.TODO())
        if err != nil {
            return err
        }
        for _, obj := range page.Contents {
            if err := downloadToFile(downloader, dest, s.bucket, aws.ToString(obj.Key)); err != nil {
                return err
            }
        }
    }
    return nil
}

func downloadToFile(downloader *manager.Downloader, targetDirectory, bucket, key string) error {
    // Create the directories in the path
    file := filepath.Join(targetDirectory, key)
    if err := os.MkdirAll(filepath.Dir(file), 0775); err != nil {
        return err
    }

    // Set up the local file
    fd, err := os.Create(file)
    if err != nil {
        return err
    }
    defer fd.Close()

    // Download the file using the AWS SDK for Go
    fmt.Printf("Downloading s3://%s/%s to %s...\n", bucket, key, file)
    _, err = downloader.Download(context.TODO(), fd, &s3.GetObjectInput{Bucket: &bucket, Key: &key})

    return err
}
Error: operation error S3: ListObjectsV2, https response error StatusCode: 403, RequestID: ..., HostID: ..., api error AccessDenied: Access Denied

Может ли кто-нибудь предоставить мне пример использования Golang SDK для получения файлов S3 из корзины с поддержкой Requestor Pays, например, эквивалент:

aws s3 sync --request-payer requester source_bucket destination_folder

person rstegmann-arch    schedule 08.03.2021    source источник


Ответы (1)