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) +}