From c1b310af31915605f30e2faa3a19a5a224b9ad96 Mon Sep 17 00:00:00 2001 From: Sebastien Lacoste Date: Wed, 11 Mar 2020 23:33:06 +0100 Subject: [PATCH 1/4] Added s3-upload --- .goreleaser.yml | 11 +++++++++ s3/upload/README.md | 34 +++++++++++++++++++++++++++ s3/upload/main.go | 56 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 s3/upload/README.md create mode 100644 s3/upload/main.go diff --git a/.goreleaser.yml b/.goreleaser.yml index ccf62c6..d604bd8 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -247,3 +247,14 @@ builds: - amd64 ldflags: - -s -w -X github.com/hamstah/awstools/common.Version={{.Version}} -X github.com/hamstah/awstools/common.CommitHash={{.ShortCommit}}" + - env: + - CGO_ENABLED=0 + main: ./s3/upload/ + binary: s3-upload + goos: + - linux + - darwin + goarch: + - amd64 + ldflags: + - -s -w -X github.com/hamstah/awstools/common.Version={{.Version}} -X github.com/hamstah/awstools/common.CommitHash={{.ShortCommit}}" diff --git a/s3/upload/README.md b/s3/upload/README.md new file mode 100644 index 0000000..5bc6b5d --- /dev/null +++ b/s3/upload/README.md @@ -0,0 +1,34 @@ +# s3-upload + +Download a single file from S3. + +``` +usage: s3-upload --bucket=BUCKET --key=KEY --file=FILE [] + +Upload a file to S3. + +Flags: + --help Show context-sensitive help (also try --help-long and --help-man). + --bucket=BUCKET Name of the bucket + --key=KEY Key of the uploaded file + --file=FILE File to upload + --acl=ACL ACL of the uploaded file + --metadata=METADATA Metadata of the uploaded file + --assume-role-arn=ASSUME-ROLE-ARN + Role to assume + --assume-role-external-id=ASSUME-ROLE-EXTERNAL-ID + External ID of the role to assume + --assume-role-session-name=ASSUME-ROLE-SESSION-NAME + Role session name + --assume-role-policy=ASSUME-ROLE-POLICY + IAM policy to use when assuming the role + --region=REGION AWS Region + --mfa-serial-number=MFA-SERIAL-NUMBER + MFA Serial Number + --mfa-token-code=MFA-TOKEN-CODE + MFA Token Code + --session-duration=1h Session Duration + -v, --version Display the version + --log-level=warn Log level + --log-format=text Log format +``` diff --git a/s3/upload/main.go b/s3/upload/main.go new file mode 100644 index 0000000..a0d2b4a --- /dev/null +++ b/s3/upload/main.go @@ -0,0 +1,56 @@ +package main + +import ( + "encoding/json" + "fmt" + + "github.com/aws/aws-sdk-go/service/s3" + "github.com/aws/aws-sdk-go/service/s3/s3manager" + "github.com/hamstah/awstools/common" + kingpin "gopkg.in/alecthomas/kingpin.v2" +) + +var ( + bucket = kingpin.Flag("bucket", "Name of the bucket").Required().String() + key = kingpin.Flag("key", "Key of the uploaded file").Required().String() + file = kingpin.Flag("file", "File to upload").Required().File() + acl = kingpin.Flag("acl", "ACL of the uploaded file").String() + metadata = kingpin.Flag("metadata", "Metadata of the uploaded file (json)").String() +) + +func main() { + kingpin.CommandLine.Name = "s3-upload" + kingpin.CommandLine.Help = "Upload a file to S3." + flags := common.HandleFlags() + + session, conf := common.OpenSession(flags) + + s3Client := s3.New(session, conf) + uploader := s3manager.NewUploaderWithClient(s3Client) + + defer (*file).Close() + + var parsedMetadata map[string]*string + + if metadata != nil { + err := json.Unmarshal([]byte(*metadata), &parsedMetadata) + common.FatalOnErrorW(err, "Invalid metadata") + } + + uploadInput := &s3manager.UploadInput{ + Bucket: bucket, + Key: key, + Body: *file, + ACL: acl, + Metadata: parsedMetadata, + } + + res, err := uploader.Upload(uploadInput) + + if err != nil { + (*file).Close() + common.Fatalln(err.Error()) + } + + fmt.Println(res.Location) +} From 260eff0f32d0c40d64a86b7865d3745778884522 Mon Sep 17 00:00:00 2001 From: Sebastien Lacoste Date: Fri, 13 Mar 2020 11:38:07 +0100 Subject: [PATCH 2/4] s3-upload: Fix typo in README.md --- s3/upload/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/s3/upload/README.md b/s3/upload/README.md index 5bc6b5d..b85af37 100644 --- a/s3/upload/README.md +++ b/s3/upload/README.md @@ -1,6 +1,6 @@ # s3-upload -Download a single file from S3. +Upload a single file to S3. ``` usage: s3-upload --bucket=BUCKET --key=KEY --file=FILE [] From d90c99dc75e7c105f48ad53cbdc02282e753faac Mon Sep 17 00:00:00 2001 From: Sebastien Lacoste Date: Fri, 13 Mar 2020 11:38:37 +0100 Subject: [PATCH 3/4] s3-upload: Add default value for "acl" flag --- s3/upload/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/s3/upload/main.go b/s3/upload/main.go index a0d2b4a..b941538 100644 --- a/s3/upload/main.go +++ b/s3/upload/main.go @@ -14,7 +14,7 @@ var ( bucket = kingpin.Flag("bucket", "Name of the bucket").Required().String() key = kingpin.Flag("key", "Key of the uploaded file").Required().String() file = kingpin.Flag("file", "File to upload").Required().File() - acl = kingpin.Flag("acl", "ACL of the uploaded file").String() + acl = kingpin.Flag("acl", "ACL of the uploaded file").Default("private").String() metadata = kingpin.Flag("metadata", "Metadata of the uploaded file (json)").String() ) From 09cbec1b1ba452495de4cc2edfa964eba7a3f653 Mon Sep 17 00:00:00 2001 From: Sebastien Lacoste Date: Fri, 13 Mar 2020 11:39:16 +0100 Subject: [PATCH 4/4] s3-upload: Fix errors when metadata is empty --- s3/upload/main.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/s3/upload/main.go b/s3/upload/main.go index b941538..f55070c 100644 --- a/s3/upload/main.go +++ b/s3/upload/main.go @@ -22,17 +22,16 @@ func main() { kingpin.CommandLine.Name = "s3-upload" kingpin.CommandLine.Help = "Upload a file to S3." flags := common.HandleFlags() + defer (*file).Close() session, conf := common.OpenSession(flags) s3Client := s3.New(session, conf) uploader := s3manager.NewUploaderWithClient(s3Client) - defer (*file).Close() - var parsedMetadata map[string]*string - if metadata != nil { + if metadata != nil && len(*metadata) != 0 { err := json.Unmarshal([]byte(*metadata), &parsedMetadata) common.FatalOnErrorW(err, "Invalid metadata") } @@ -47,10 +46,7 @@ func main() { res, err := uploader.Upload(uploadInput) - if err != nil { - (*file).Close() - common.Fatalln(err.Error()) - } + common.FatalOnError(err) fmt.Println(res.Location) }