Skip to content

Instantly share code, notes, and snippets.

@jboelter
Last active July 20, 2019 00:19
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jboelter/6f5bd598673eb0e606f10660495fc175 to your computer and use it in GitHub Desktop.
Save jboelter/6f5bd598673eb0e606f10660495fc175 to your computer and use it in GitHub Desktop.
// Uses the default AWS SDK Credentials; e.g. via the environment
// AWS_REGION=region AWS_ACCESS_KEY_ID=key AWS_SECRET_ACCESS_KEY=secret
package main
import (
"flag"
"fmt"
"io"
"log"
"os"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
)
func main() {
var bucket string
var key string
var debug bool
flag.StringVar(&bucket, "bucket", "", "s3 bucket")
flag.StringVar(&key, "key", "", "s3 key (path)")
flag.BoolVar(&debug, "debug", false, "show aws sdk debug output")
flag.Parse()
if len(bucket) == 0 || len(key) == 0 {
flag.Usage()
os.Exit(-1)
}
cfg := aws.NewConfig()
if debug {
log := log.New(os.Stderr, "", log.LstdFlags)
cfg = cfg.WithLogger(
aws.LoggerFunc(func(args ...interface{}) { log.Println(args) }),
).WithLogLevel(aws.LogDebugWithSigning)
}
awsSession := session.New(cfg)
fmt.Fprintf(os.Stderr, "attempting to download s3://%v/%v\n", bucket, key)
start := time.Now()
s3Svc := s3.New(awsSession)
result, err := s3Svc.GetObject(&s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
})
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
n, err := io.Copy(os.Stdout, result.Body)
result.Body.Close()
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(2)
}
if n != aws.Int64Value(result.ContentLength) {
fmt.Fprintf(os.Stderr, "bytes written (%v) != ContentLength (%v)\n", n, aws.Int64Value(result.ContentLength))
os.Exit(3)
}
fmt.Fprintf(os.Stderr, "wrote %v bytes to stdout in %v\n", n, time.Now().Sub(start))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment