S3

Connect to AWS S3 with AWS SDK v2 credentials, custom clients, public URLs, and signed URLs.

Create the adapter

package main

import (
	"context"

	files "github.com/cersho/gofiles-sdk"
	"github.com/cersho/gofiles-sdk/providers/s3"
)

func newClient(ctx context.Context) (*files.Client, error) {
	adapter, err := s3.New(ctx, s3.Options{
		Bucket: "uploads",
		Region: "us-east-1",
	})
	if err != nil {
		return nil, err
	}

	return files.New(files.Options{Adapter: adapter})
}

Credentials

By default, the adapter uses the AWS SDK credential chain and region settings. These environment variables are commonly used:

VariablePurpose
AWS_REGIONBucket region.
AWS_DEFAULT_REGIONFallback bucket region.
AWS_ACCESS_KEY_IDAccess key ID.
AWS_SECRET_ACCESS_KEYSecret access key.
AWS_SESSION_TOKENOptional session token.

You can also pass static credentials:

adapter, err := s3.New(ctx, s3.Options{
	Bucket: "uploads",
	Region: "us-east-1",
	Credentials: &s3.Credentials{
		AccessKeyID: os.Getenv("AWS_ACCESS_KEY_ID"),
		SecretAccessKey: os.Getenv("AWS_SECRET_ACCESS_KEY"),
	},
})

Signed URLs

url, err := client.URL(ctx, "reports/q1.pdf", files.URLOptions{
	ExpiresIn: 15 * time.Minute,
})
if err != nil {
	return err
}

fmt.Println(url)

Use PublicBaseURL when reads should return a public CDN URL instead of a presigned URL.

adapter, err := s3.New(ctx, s3.Options{
	Bucket: "uploads",
	Region: "us-east-1",
	PublicBaseURL: "https://cdn.acme.internal",
})

On this page