Skip to main content

AWS SDK for Go quickstart

The AWS SDK for Go v2 is the modern, modular Go SDK from AWS. It runs against Filebase by overriding the endpoint resolver and the region.

Install​

go get github.com/aws/aws-sdk-go-v2
go get github.com/aws/aws-sdk-go-v2/config
go get github.com/aws/aws-sdk-go-v2/credentials
go get github.com/aws/aws-sdk-go-v2/service/s3

Configure​

filebase.go
package main

import (
"context"
"os"

"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/credentials"
"github.com/aws/aws-sdk-go-v2/service/s3"
)

func NewFilebase(ctx context.Context) (*s3.Client, error) {
creds := credentials.NewStaticCredentialsProvider(
os.Getenv("FILEBASE_KEY"),
os.Getenv("FILEBASE_SECRET"),
"",
)

client := s3.New(s3.Options{
BaseEndpoint: aws.String("https://s3.filebase.io"),
Region: "auto",
Credentials: creds,
})

return client, nil
}

BaseEndpoint is the recommended way to override the endpoint in SDK v2 — it works for all S3-compatible services.

List buckets​

out, err := client.ListBuckets(ctx, &s3.ListBucketsInput{})
if err != nil {
log.Fatal(err)
}
for _, b := range out.Buckets {
fmt.Println(*b.Name)
}

Create a bucket​

_, err := client.CreateBucket(ctx, &s3.CreateBucketInput{
Bucket: aws.String("quickstart-demo"),
})

Upload an object​

f, err := os.Open("hello.txt")
if err != nil {
log.Fatal(err)
}
defer f.Close()

_, err = client.PutObject(ctx, &s3.PutObjectInput{
Bucket: aws.String("quickstart-demo"),
Key: aws.String("hello.txt"),
Body: f,
ContentType: aws.String("text/plain"),
})

For large files, use the upload manager:

import "github.com/aws/aws-sdk-go-v2/feature/s3/manager"

uploader := manager.NewUploader(client)

f, _ := os.Open("./large-file.bin")
defer f.Close()

_, err = uploader.Upload(ctx, &s3.PutObjectInput{
Bucket: aws.String("quickstart-demo"),
Key: aws.String("large-file.bin"),
Body: f,
})

The upload manager handles multipart upload automatically for files over 5 MB.

List objects​

out, err := client.ListObjectsV2(ctx, &s3.ListObjectsV2Input{
Bucket: aws.String("quickstart-demo"),
MaxKeys: aws.Int32(100),
})

for _, obj := range out.Contents {
fmt.Println(*obj.Key, obj.Size)
}

Download an object​

out, err := client.GetObject(ctx, &s3.GetObjectInput{
Bucket: aws.String("quickstart-demo"),
Key: aws.String("hello.txt"),
})
defer out.Body.Close()

io.Copy(os.Stdout, out.Body)

Generate a pre-signed URL​

presigner := s3.NewPresignClient(client)

req, err := presigner.PresignGetObject(ctx, &s3.GetObjectInput{
Bucket: aws.String("quickstart-demo"),
Key: aws.String("hello.txt"),
}, s3.WithPresignExpires(time.Hour))

fmt.Println(req.URL)

Delete an object​

_, err := client.DeleteObject(ctx, &s3.DeleteObjectInput{
Bucket: aws.String("quickstart-demo"),
Key: aws.String("hello.txt"),
})

What's next​