我遇到了一个问题,我正试图通过官方Golang AWS SDK将文件上传到S3。
我的目标是指定位于北加州地区(us-west-1)的水桶。我可以在S3资源管理器中看到它;但是,当我运行put操作时,我收到以下错误:
BucketRegionError: incorrect region, the bucket is not in 'Northern California' region
这就是我设置连接的方式:
creds := credentials.NewStaticCredentials(aws_access_key_id, aws_secret_access_key, token)
_,err := creds.Get()
config := &aws.Config{
Region :aws.String("us-west-1"),
Endpoint :aws.String("s3.amazonaws.com"),
S3ForcePathStyle:aws.Bool(true),
Credentials :creds,
//LogLevel :0,
}
s3_client := s3.New(session.New(config))
params := &s3.PutObjectInput{
Bucket :aws.String(p_bucket_name_str),
Key :aws.String(p_target_file__s3_path_str),
ACL :aws.String("public-read"),
Body :file_bytes,
ContentLength:aws.Int64(size),
ContentType :aws.String(file_type),
Metadata :map[string]*string{
"Key":aws.String("MetadataValue"),
},
}
result,err := p_s3_client.PutObject(params)
任何建议或修复都会有很大的帮助,谢谢。
答案 0 :(得分:1)
aws-sdk-go
提供s3manager工具,使这项工作更方便。您可以上传如下文件:
creds := credentials.NewStaticCredentials(AccessKey, SecretKey, "")
sess := session.New(&aws.Config{
Credentials: creds,
Region: &Region,
})
uploader := s3manager.NewUploader(sess)
uploader.Upload(&s3manager.UploadInput{
ACL: aws.String(acl),
Bucket: aws.String(bucket),
Key: aws.String(key),
ContentType: aws.String(contentType),
Body: r,
})
答案 1 :(得分:1)
您看到此错误是因为您认为自己的存储区位于us-west-1
区域,并且您的请求是针对us-east-1
区域的。对于AWS SDK for Go,端点s3.amazon.com
映射到us-east-1
区域。
使用curl命令curl -I "https://<bucketname>.s3.amazonaws.com"
通过标题x-amz-bucket-region
验证您的存储桶实际所在的区域
获得正确的区域后,请从配置中删除Endpoint
值,您的请求应该开始工作。 SDK将根据提供的区域自动确定端点URL。 Endpoint
值将覆盖SDK查找服务的URL。
当存储桶位于其他区域时,当请求发送到s3.amazon.com
端点时,SDK不会自动切换区域并重新发送请求。
答案 2 :(得分:0)
错误是因为终点。终点&#34; s3.amazonaws.com
&#34;默认为us-east-1
区域。如果您想为us-west-1
创建广告资源,则必须将结束点设置为&#34; s3-us-west-1.amazonaws.com
&#34;