英文:
AWS S3 Golang SDK - uploading files - wrong region
问题
我遇到了一个问题,我正在尝试通过官方的Golang AWS SDK将文件上传到S3。
我正在针对一个指定为北加利福尼亚地区(us-west-1)的存储桶进行操作。我可以在S3资源管理器中看到它,但是当我运行put操作时,我收到以下错误:
BucketRegionError: 错误的区域,存储桶不在'Northern California'区域
这是我设置连接的方式:
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)
有什么建议或修复方法将会非常有帮助,谢谢。
英文:
I'm having an issue where I'm trying to upload a file to S3 via the official Golang AWS SDK.
I'm targeting a bucket that's specified to be in Northern California region (us-west-1). I can see it in the S3 explorer; however, when I run the put operation I get the following error:
BucketRegionError: incorrect region, the bucket is not in 'Northern California' region
This is how I am setting up my connection:
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)
Any suggestion or fix would be of huge help, thank you.
答案1
得分: 2
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,
})
请注意,上述代码中的AccessKey
、SecretKey
、Region
、acl
、bucket
、key
和contentType
需要根据你的具体情况进行替换。
英文:
the aws-sdk-go
offers a s3manager tool to make this work more convenient. You can upload a file like below:
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,
})
答案2
得分: 2
您看到此错误是因为您认为您的存储桶存在于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不会自动切换区域并重新发送请求,即使存储桶存在于不同的区域中。
英文:
You're seeing this error because you think your bucket exists in us-west-1
region, and your request is being made to the us-east-1
region. For the AWS SDK for Go the endpoint s3.amazon.com
maps to the us-east-1
region.
Use the curl command curl -I "https://<bucketname>.s3.amazonaws.com"
to verify the region your bucket is actually in with the header x-amz-bucket-region
Once you have the correct region remove the Endpoint
value from your config your request should start working. The SDK will determine the endpoint URL automatically based on the region provided. The Endpoint
value is overriding the URL the SDK would look up for the service.
The SDK does not automatically switch regions and resend the request when the request was made to the s3.amazon.com
endpoint when the bucket exists in a different region.
答案3
得分: 1
错误是由于终端点引起的。默认情况下,终端点“s3.amazonaws.com
”是用于us-east-1
区域的。如果您想为us-west-1
创建存储桶,您必须将终端点设置为“s3-us-west-1.amazonaws.com
”。
英文:
The error is because of end-point. End-point "s3.amazonaws.com
" is for us-east-1
region by default. If you want to create bucket for us-west-1
you have to put end-point as "s3-us-west-1.amazonaws.com
"
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论