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