英文:
Unsupported Protocol Scheme "" in Golang with AWS S3 and goamz
问题
我正在尝试使用Go语言中的goamz/s3包将文件字节上传到S3 AWS。
当运行以下代码时:
var (
awsAuth aws.Auth
region aws.Region
connection s3.S3
bucket *s3.Bucket
)
func init() {
// 设置AWS S3连接配置。
awsAuth = aws.Auth{
AccessKey: os.Getenv("ACCESS_KEY"), // 将此处更改为您自己的Access Key
SecretKey: os.Getenv("SECRET_KEY"),
}
fmt.Println("AWS: ", awsAuth)
region := aws.EUWest
connection := s3.New(awsAuth, region)
bucket = connection.Bucket(os.Getenv("S3_BUCKET")) // 将此处更改为您的存储桶名称
}
func uploadToS3(filename string, byteArray *[]byte) error {
var err error
// 检查文件是否已经使用此密码上传并加密
fmt.Printf("[uploadToS3] 开始上传 %s\n", filename)
err = bucket.Put(filename, *byteArray, "text/plain; charset=utf-8", s3.PublicRead)
if err != nil {
fmt.Printf("[uploadToS3] 上传错误: %s\n", err)
return err
} else {
fmt.Printf("[uploadToS3] 完成上传 %s\n", filename)
return nil
}
return nil // 冗余
}
我得到了错误信息:
[uploadToS3] 上传错误: Put /filename: unsupported protocol scheme ""
根据https://stackoverflow.com/questions/26505623/unsupported-protocol-scheme-while-creating-ec2-security-group上的解释,这个错误的原因可能是错误的区域设置,但是在init()
函数中已经设置了正确的区域。
非常感谢您的帮助。
英文:
I am trying to upload file bytes to S3 AWS, using the goamz/s3 package in Go (lang).
When running the following code:
var (
awsAuth aws.Auth
region aws.Region
connection s3.S3
bucket *s3.Bucket
)
func init() {
// Set up the AWS S3 Connection config.
awsAuth = aws.Auth{
AccessKey: os.Getenv("ACCESS_KEY"), // change this to yours
SecretKey: os.Getenv("SECRET_KEY"),
}
fmt.Println("AWS: ", awsAuth)
region := aws.EUWest
connection := s3.New(awsAuth, region)
bucket = connection.Bucket(os.Getenv("S3_BUCKET")) // change this your bucket name
}
func uploadToS3(filename string, byteArray *[]byte) error {
var err error
//should check if file already uploaded, encrypted by this password
fmt.Printf("[uploadToS3] starting upload of %s\n", filename)
err = bucket.Put(filename, *byteArray, "text/plain; charset=utf-8", s3.PublicRead)
if err != nil {
fmt.Printf("[uploadToS3] error uploading: %s\n", err)
return err
} else {
fmt.Printf("[uploadToS3] done uploading %s\n", filename)
return nil
}
return nil // redundancy
}
I get the error
[uploadToS3] error uploading: Put /filename: unsupported protocol scheme ""
Judging from https://stackoverflow.com/questions/26505623/unsupported-protocol-scheme-while-creating-ec2-security-group it seems that the cause is an incorrect region, however it is not the case as it is being set in init()
.
Any thoughts would be greatly appreciated.
答案1
得分: 3
对于可能遇到相同问题的任何人。当存储桶名称未设置时,会出现此错误。看起来很愚蠢,但我是在Docker容器中运行的,忘记告诉Docker存储桶名称所在的环境变量是什么。因此,当我在终端上运行echo $S3_BUCKET
时,我得到了存储桶名称,因此以为一切都很好。然而,我没有在Docker容器内测试过这一点。我真是个傻瓜。
英文:
To anyone who might have the same issue. It is an error you get when the bucket name is not set. Seems stupid, but I was running this inside docker, and had forgot to tell docker what the enviroment variable was that held the bucket name. Therefore when I did echo $S3_BUCKET
on my terminal, I got the bucket name, and therefore thought all was good. However I didn't test that inside the docker container. Fool on me.
答案2
得分: 1
我在设置AWS配置时遇到了使用SDK V2的问题,我想指定AWS端点(在集成测试期间将我的服务指向localstack)。
我通过使用自定义的端点解析器解决了这个问题。
conf, err := config.LoadDefaultConfig(
ctx,
config.WithRegion(region),
config.WithRetryMaxAttempts(3),
config.WithEndpointResolver(aws.EndpointResolverFunc(func(_, region string) (aws.Endpoint, error) {
if internal.AwsEndpoint != "" {
return aws.Endpoint{
PartitionID: "aws",
URL: internal.AwsEndpoint,
SigningRegion: region,
}, nil
}
// 返回EndpointNotFoundError将允许服务回退到其默认解析
return aws.Endpoint{}, &aws.EndpointNotFoundError{}
})),
)
...
client := s3.NewFromConfig(conf, func(o *s3.Options) {
o.UsePathStyle = true
})
英文:
I experienced this issue with the SDK V2 while setting up an AWS config to allow me to specify the AWS endpoint (I point my service to localstack during integration tests).
I resolved it by using a custom endpoint resolver.
conf, err := config.LoadDefaultConfig(
ctx,
config.WithRegion(region),
config.WithRetryMaxAttempts(3),
config.WithEndpointResolver(aws.EndpointResolverFunc(func(_, region string) (aws.Endpoint, error) {
if internal.AwsEndpoint != "" {
return aws.Endpoint{
PartitionID: "aws",
URL: internal.AwsEndpoint,
SigningRegion: region,
}, nil
}
// returning EndpointNotFoundError will allow the service to fallback to it's default resolution
return aws.Endpoint{}, &aws.EndpointNotFoundError{}
})),
)
...
client := s3.NewFromConfig(conf, func(o *s3.Options) {
o.UsePathStyle = true
})
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论