AWS SDK for Go v2 with 130+ service clients, Request/Send pattern, and context support.
# Using dep (recommended for v0.4.0)
dep ensure -add github.com/aws/aws-sdk-go-v2
# Or using go get
go get github.com/aws/aws-sdk-go-v2
# For specific service
go get github.com/aws/aws-sdk-go-v2/service/s3export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
export AWS_REGION=us-east-1
export AWS_SESSION_TOKEN=token # Optional, for temporary credentials~/.aws/credentials:
[default]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
[production]
aws_access_key_id = AKID_PROD
aws_secret_access_key = SECRET_PROD~/.aws/config:
[default]
region = us-east-1
output = json
[profile production]
region = eu-west-1No configuration needed - credentials automatically loaded from instance/task metadata.
cfg := aws.Config{
Region: "us-west-2",
Credentials: aws.NewStaticCredentialsProvider("AKID", "SECRET", ""),
}package main
import (
"fmt"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/aws/external"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func main() {
// Load config
cfg, err := external.LoadDefaultAWSConfig()
if err != nil {
panic("config load error: " + err.Error())
}
// Override region if needed
cfg.Region = "us-east-1"
// Create S3 client
svc := s3.New(cfg)
// Make request
req := svc.ListBucketsRequest(&s3.ListBucketsInput{})
// Send request
resp, err := req.Send()
if err != nil {
panic("request error: " + err.Error())
}
// Use response
for _, bucket := range resp.Buckets {
fmt.Println(*bucket.Name)
}
}import (
"os"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/aws/external"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func uploadFile(filename, bucket, key string) error {
cfg, err := external.LoadDefaultAWSConfig()
if err != nil {
return err
}
svc := s3.New(cfg)
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close()
// Get file size for Content-Length
stat, _ := file.Stat()
req := svc.PutObjectRequest(&s3.PutObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
Body: file,
ContentLength: aws.Int64(stat.Size()),
})
_, err = req.Send()
return err
}import "io"
func downloadFile(bucket, key, filename string) error {
cfg, _ := external.LoadDefaultAWSConfig()
svc := s3.New(cfg)
req := svc.GetObjectRequest(&s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
})
resp, err := req.Send()
if err != nil {
return err
}
defer resp.Body.Close()
file, err := os.Create(filename)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(file, resp.Body)
return err
}cfg, err := external.LoadDefaultAWSConfig(
external.WithSharedConfigProfile("production"),
)import "github.com/aws/aws-sdk-go-v2/service/dynamodb"
func getItem(tableName, id string) (map[string]dynamodb.AttributeValue, error) {
cfg, _ := external.LoadDefaultAWSConfig()
svc := dynamodb.New(cfg)
req := svc.GetItemRequest(&dynamodb.GetItemInput{
TableName: aws.String(tableName),
Key: map[string]dynamodb.AttributeValue{
"id": {S: aws.String(id)},
},
})
resp, err := req.Send()
if err != nil {
return nil, err
}
return resp.Item, nil
}func putItem(tableName, id, name string) error {
cfg, _ := external.LoadDefaultAWSConfig()
svc := dynamodb.New(cfg)
req := svc.PutItemRequest(&dynamodb.PutItemInput{
TableName: aws.String(tableName),
Item: map[string]dynamodb.AttributeValue{
"id": {S: aws.String(id)},
"name": {S: aws.String(name)},
},
})
_, err := req.Send()
return err
}import (
"encoding/json"
"github.com/aws/aws-sdk-go-v2/service/lambda"
)
func invokeLambda(functionName string, payload interface{}) ([]byte, error) {
cfg, _ := external.LoadDefaultAWSConfig()
svc := lambda.New(cfg)
payloadBytes, _ := json.Marshal(payload)
req := svc.InvokeRequest(&lambda.InvokeInput{
FunctionName: aws.String(functionName),
Payload: payloadBytes,
})
resp, err := req.Send()
if err != nil {
return nil, err
}
return resp.Payload, nil
}import "github.com/aws/aws-sdk-go-v2/service/ec2"
func listInstances() error {
cfg, _ := external.LoadDefaultAWSConfig()
svc := ec2.New(cfg)
req := svc.DescribeInstancesRequest(&ec2.DescribeInstancesInput{})
resp, err := req.Send()
if err != nil {
return err
}
for _, reservation := range resp.Reservations {
for _, instance := range reservation.Instances {
fmt.Printf("%s: %s\n", *instance.InstanceId, instance.State.Name)
}
}
return nil
}import "github.com/aws/aws-sdk-go-v2/service/sqs"
func sendMessage(queueURL, message string) error {
cfg, _ := external.LoadDefaultAWSConfig()
svc := sqs.New(cfg)
req := svc.SendMessageRequest(&sqs.SendMessageInput{
QueueUrl: aws.String(queueURL),
MessageBody: aws.String(message),
})
_, err := req.Send()
return err
}import (
"context"
"time"
)
func withTimeout() error {
cfg, _ := external.LoadDefaultAWSConfig()
svc := s3.New(cfg)
// Create context with timeout
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
// Create request
req := svc.GetObjectRequest(&s3.GetObjectInput{
Bucket: aws.String("bucket"),
Key: aws.String("key"),
})
// Set context
req.SetContext(ctx)
// Send - respects timeout
resp, err := req.Send()
if err != nil {
if err == context.DeadlineExceeded {
return fmt.Errorf("request timed out")
}
return err
}
defer resp.Body.Close()
return nil
}import (
"fmt"
"github.com/aws/aws-sdk-go-v2/aws/awserr"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func handleErrors() error {
cfg, _ := external.LoadDefaultAWSConfig()
svc := s3.New(cfg)
req := svc.GetObjectRequest(&s3.GetObjectInput{
Bucket: aws.String("bucket"),
Key: aws.String("key"),
})
resp, err := req.Send()
if err != nil {
// Type assert to AWS error
if aerr, ok := err.(awserr.Error); ok {
// AWS-specific error
fmt.Printf("AWS Error Code: %s\n", aerr.Code())
fmt.Printf("AWS Error Message: %s\n", aerr.Message())
// Check specific error codes
switch aerr.Code() {
case s3.ErrCodeNoSuchBucket:
return fmt.Errorf("bucket does not exist")
case s3.ErrCodeNoSuchKey:
return fmt.Errorf("object does not exist")
case "AccessDenied":
return fmt.Errorf("insufficient permissions")
}
// Get HTTP details if available
if reqErr, ok := err.(awserr.RequestFailure); ok {
fmt.Printf("HTTP Status: %d\n", reqErr.StatusCode())
fmt.Printf("Request ID: %s\n", reqErr.RequestID())
}
}
// Generic error
return fmt.Errorf("request failed: %w", err)
}
defer resp.Body.Close()
return nil
}Install with Tessl CLI
npx tessl i tessl/golang-github-com--aws--aws-sdk-go-v2