【问题标题】:How do I set the S3 Request Payer option when using the aws-sdk-v2?使用 aws-sdk-v2 时如何设置 S3 请求付款人选项?
【发布时间】:2021-06-06 18:43:15
【问题描述】:

我正在尝试使用 aws-sdk-go-v2 从 S3 存储桶中检索一些数据。为此,我需要能够设置请求付款人选项,但是,由于我是使用 SDK 的新手,我不知道如何设置。

我尝试将它设置为一个环境变量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 从启用 Requestor Pays 的存储桶中获取 S3 文件的示例,即相当于:

aws s3 sync --request-payer requester source_bucket destination_folder

【问题讨论】:

    标签: go aws-sdk-go


    【解决方案1】:

    您似乎可以在 GetObjectInput 结构中使用名为“RequestPayer”的字段。从pkg document找到它。

    来自链接:

    type GetObjectInput struct {
    
        // The bucket name containing the object. When using this action with an access
        ...
        Bucket *string
        // Key of the object to get.
        // This member is required.
        Key *string
        ...
        ...
        // Confirms that the requester knows that they will be charged for the request.
        // Bucket owners need not specify this parameter in their requests. For information
        // about downloading objects from requester pays buckets, see Downloading Objects
        // in Requestor Pays Buckets
        // (https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html)
        // in the Amazon S3 Developer Guide.
        RequestPayer types.RequestPayer
    

    您可以参考'RequestPayer'定义here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 2013-09-25
      • 1970-01-01
      • 2020-08-08
      • 2012-06-02
      • 2015-11-21
      • 2020-11-04
      相关资源
      最近更新 更多