不支持的协议方案“”在使用AWS S3和goamz的Golang中。

huangapple go评论93阅读模式
英文:

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
})

huangapple
  • 本文由 发表于 2017年1月3日 07:15:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/41434410.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定