Skip to content

Instantly share code, notes, and snippets.

@ritesh
Created June 14, 2018 11:08
Show Gist options
  • Save ritesh/e632d48973d4bbfd9730fff95a0631ca to your computer and use it in GitHub Desktop.
Save ritesh/e632d48973d4bbfd9730fff95a0631ca to your computer and use it in GitHub Desktop.
s3signer
package main
import (
"flag"
"fmt"
"log"
"time"
"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"
)
var (
bucket = flag.String("b", "", "the name of the bucket where the object lives")
key = flag.String("k", "", "the key for the object that you want to share")
region = flag.String("r", "eu-west-1", "the region you want to use, the default is eu-west-1")
)
func main() {
flag.Parse()
if len(*bucket) == 0 {
log.Fatal("no bucketname provided")
}
if len(*key) == 0 {
log.Fatal("no key name provided")
}
cfg, err := external.LoadDefaultAWSConfig()
if err != nil {
log.Fatalf("unable to load default AWS config %v", err)
}
cfg.Region = *region
url, err := s3signer(cfg, bucket, key)
if err != nil {
log.Fatalf("unable to generate signed URL %v", err)
}
fmt.Printf("\nShare this: %v\n", url)
}
func s3signer(cfg aws.Config, bucket *string, key *string) (string, error) {
svc := s3.New(cfg)
obj := svc.GetObjectRequest(&s3.GetObjectInput{
Bucket: aws.String(*bucket),
Key: aws.String(*key)})
//valid for an hour
urlstr, err := obj.Presign(1 * 60 * time.Minute)
if err != nil {
log.Println("failed to sign request", err)
return "", err
}
return urlstr, nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment