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