Table of contents
Part of nurago, a collection of independent Go packages for backend services.
import "github.com/tecnickcom/nurago/pkg/s3"
Package s3 uploads, downloads, lists, and deletes S3 bucket objects through the AWS SDK v2 S3 client.
It covers the common object operations:
- upload object data,
- download object data,
- list object keys by prefix,
- delete objects.
It is built on github.com/aws/aws-sdk-go-v2/service/s3.
What It Provides
Newto create a bucket-scopedClient.Client.Putto upload from anio.Reader.Client.Getto fetch an object and access its body stream.Client.ListKeysto list object keys, optionally filtered by prefix.Client.ListObjectsto list objects with per-object metadata (size, last-modified, ETag), optionally filtered by prefix.Client.Deleteto remove an object by key.Client.HealthCheckto verify bucket reachability and access permissions.
Configuration & Extensibility
The client configuration composes with awsopt and exposes option hooks:
WithAWSOptionsto pass generic AWS config options,WithSrvOptionFuncsto customize S3 service options,WithS3Clientto inject a custom S3 implementation (tests and advanced integrations; skips AWS configuration loading),WithEndpointMutableandWithEndpointImmutablefor endpoint overrides (useful for local S3-compatible environments and tests).
Usage
c, err := s3.New(ctx, "my-bucket")
if err != nil {
return err
}
if err := c.Put(ctx, "reports/latest.json", reader); err != nil {
return err
}
obj, err := c.Get(ctx, "reports/latest.json")
if err != nil {
return err
}
_ = obj
keys, err := c.ListKeys(ctx, "reports/")
if err != nil {
return err
}
_ = keys
if err := c.Delete(ctx, "reports/old.json"); err != nil {
return err
}
if err := c.HealthCheck(ctx); err != nil {
return err
}
When To Use
- A service puts, gets, lists, and deletes objects and nothing more exotic.
- S3 should be reported on the service health endpoint.
Example
// A caller would normally configure a real client via options such as
// WithAWSOptions or WithEndpointMutable; here an injected client keeps the
// example self-contained, so no AWS configuration is loaded.
c, err := s3.New(
context.TODO(),
"my-bucket",
s3.WithS3Client(&exampleS3Client{objects: map[string][]byte{}}),
)
if err != nil {
fmt.Println("error:", err)
return
}
err = c.Put(context.TODO(), "reports/latest.json", strings.NewReader(`{"ok":true}`))
if err != nil {
fmt.Println("error:", err)
return
}
obj, err := c.Get(context.TODO(), "reports/latest.json")
if err != nil {
fmt.Println("error:", err)
return
}
data, err := io.ReadAll(obj.Body())
if err != nil {
fmt.Println("error:", err)
return
}
err = obj.Close()
if err != nil {
fmt.Println("error:", err)
return
}
fmt.Println(obj.ContentType())
fmt.Println(obj.ContentLength())
fmt.Println(string(data))
keys, err := c.ListKeys(context.TODO(), "reports/")
if err != nil {
fmt.Println("error:", err)
return
}
fmt.Println(keys)
err = c.Delete(context.TODO(), "reports/latest.json")
if err != nil {
fmt.Println("error:", err)
return
}
// Output:
// application/json
// 11
// {"ok":true}
// [reports/latest.json]
Full source is in example_s3_test.go. More runnable examples are on pkg.go.dev.
Dependencies
Importing this package pulls 18 external modules:
github.com/aws/aws-sdk-go-v2github.com/aws/aws-sdk-go-v2/aws/protocol/eventstreamgithub.com/aws/aws-sdk-go-v2/configgithub.com/aws/aws-sdk-go-v2/credentialsgithub.com/aws/aws-sdk-go-v2/feature/ec2/imdsgithub.com/aws/aws-sdk-go-v2/internal/configsourcesgithub.com/aws/aws-sdk-go-v2/internal/endpoints/v2github.com/aws/aws-sdk-go-v2/internal/v4agithub.com/aws/aws-sdk-go-v2/service/internal/accept-encodinggithub.com/aws/aws-sdk-go-v2/service/internal/checksumgithub.com/aws/aws-sdk-go-v2/service/internal/presigned-urlgithub.com/aws/aws-sdk-go-v2/service/internal/s3sharedgithub.com/aws/aws-sdk-go-v2/service/s3github.com/aws/aws-sdk-go-v2/service/signingithub.com/aws/aws-sdk-go-v2/service/ssogithub.com/aws/aws-sdk-go-v2/service/ssooidcgithub.com/aws/aws-sdk-go-v2/service/stsgithub.com/aws/smithy-go