AWS S3 Golang SDK - 上传文件 - 错误的区域

时间:2016-04-07 01:25:07

标签: amazon-web-services go amazon-s3

我遇到了一个问题,我正试图通过官方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)

任何建议或修复都会有很大的帮助,谢谢。

3 个答案:

答案 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;