【发布时间】: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