amlwwalker
amlwwalker

Reputation: 3314

Unsupported Protocol Scheme "" in Golang with AWS S3 and goamz

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 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.

Upvotes: 5

Views: 11113

Answers (2)

Luke
Luke

Reputation: 2454

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

Upvotes: 1

amlwwalker
amlwwalker

Reputation: 3314

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.

Upvotes: 5

Related Questions