diff --git a/README.md b/README.md index 69cc4b8..0be46b7 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,10 @@ $ export DB_USERNAME=$'Username' $ export DB_PASSWORD=$'SecretPassword' ``` -You can also pass the `--recursive` flag. When specified, aws-env will recursively fetch parameters starting from the base path specified in +### Optional Flags + +*--recursive* +You can pass the `--recursive` flag. When specified, aws-env will recursively fetch parameters starting from the base path specified in `AWS_ENV_PATH`. For the exported environment variables, any `/` characters from sub-paths will be converted to `_` characters. For example: With the following parameters: @@ -44,10 +47,27 @@ $ aws ssm put-parameter --name /prod/my-app/db1/DB_PASSWORD --value "OtherSecret `eval $(AWS_ENV_PATH=/prod/my-app/ AWS_REGION=us-west-2 ./aws-env --recursive)` will output: ``` -$ export db0_DB_PASSWORD=$'SecretPassword' -$ export db1_DB_PASSWORD=$'OtherSecretPassword' +export db0_DB_PASSWORD=$'SecretPassword' +export db1_DB_PASSWORD=$'OtherSecretPassword' ``` +*--format* + +Specify output format of parameters. + +* exports (default) - export as environmental variables ready to be eval(...) +* dotenv - used for generating dotenv files + +`AWS_ENV_PATH=/prod/my-app/ AWS_REGION=us-west-2 ./aws-env --format=dotenv` will output: +``` +FOO="bar" +ACME="zaz" +``` + +...which then can be easily used to create .env file: + +`AWS_ENV_PATH=/prod/my-app/ AWS_REGION=us-west-2 ./aws-env --format=dotenv > .env` + ## Example Dockerfile ``` diff --git a/aws-env.go b/aws-env.go index 2c24b2f..9bbd62d 100644 --- a/aws-env.go +++ b/aws-env.go @@ -1,6 +1,7 @@ package main import ( + "flag" "fmt" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" @@ -8,7 +9,11 @@ import ( "log" "os" "strings" - "flag" +) + +const ( + formatExports = "exports" + formatDotenv = "dotenv" ) func main() { @@ -17,13 +22,19 @@ func main() { return } - recursivePtr := flag.Bool("recursive", false, "recursively process parameters on path") - flag.Parse() + recursivePtr := flag.Bool("recursive", false, "recursively process parameters on path") + format := flag.String("format", formatExports, "output format") + flag.Parse() + + if *format == formatExports || *format == formatDotenv { + } else { + log.Fatal("Unsupported format option. Must be 'exports' or 'dotenv'") + } sess := CreateSession() client := CreateClient(sess) - ExportVariables(client, os.Getenv("AWS_ENV_PATH"), *recursivePtr, "") + ExportVariables(client, os.Getenv("AWS_ENV_PATH"), *recursivePtr, *format, "") } func CreateSession() *session.Session { @@ -34,12 +45,12 @@ func CreateClient(sess *session.Session) *ssm.SSM { return ssm.New(sess) } -func ExportVariables(client *ssm.SSM, path string, recursive bool, nextToken string) { - input := &ssm.GetParametersByPathInput{ - Path: &path, - WithDecryption: aws.Bool(true), - Recursive: aws.Bool(recursive), - } +func ExportVariables(client *ssm.SSM, path string, recursive bool, format string, nextToken string) { + input := &ssm.GetParametersByPathInput{ + Path: &path, + WithDecryption: aws.Bool(true), + Recursive: aws.Bool(recursive), + } if nextToken != "" { input.SetNextToken(nextToken) @@ -52,20 +63,25 @@ func ExportVariables(client *ssm.SSM, path string, recursive bool, nextToken str } for _, element := range output.Parameters { - PrintExportParameter(path, element) + OutputParameter(path, element, format) } if output.NextToken != nil { - ExportVariables(client, path, recursive, *output.NextToken) + ExportVariables(client, path, recursive, format, *output.NextToken) } } -func PrintExportParameter(path string, parameter *ssm.Parameter) { +func OutputParameter(path string, parameter *ssm.Parameter, format string) { name := *parameter.Name value := *parameter.Value env := strings.Replace(strings.Trim(name[len(path):], "/"), "/", "_", -1) value = strings.Replace(value, "\n", "\\n", -1) - fmt.Printf("export %s=$'%s'\n", env, value) + switch format { + case formatExports: + fmt.Printf("export %s=$'%s'\n", env, value) + case formatDotenv: + fmt.Printf("%s=\"%s\"\n", env, value) + } } diff --git a/bin/aws-env-darwin-386 b/bin/aws-env-darwin-386 index 7d8cc3f..86a32a8 100755 Binary files a/bin/aws-env-darwin-386 and b/bin/aws-env-darwin-386 differ diff --git a/bin/aws-env-darwin-amd64 b/bin/aws-env-darwin-amd64 index 8d529c0..2795dc6 100755 Binary files a/bin/aws-env-darwin-amd64 and b/bin/aws-env-darwin-amd64 differ diff --git a/bin/aws-env-linux-386 b/bin/aws-env-linux-386 index 79929dd..ccb02bb 100755 Binary files a/bin/aws-env-linux-386 and b/bin/aws-env-linux-386 differ diff --git a/bin/aws-env-linux-amd64 b/bin/aws-env-linux-amd64 index abed0c3..8e12f38 100755 Binary files a/bin/aws-env-linux-amd64 and b/bin/aws-env-linux-amd64 differ diff --git a/bin/aws-env-windows-386 b/bin/aws-env-windows-386 index ad290cd..9fefa9a 100755 Binary files a/bin/aws-env-windows-386 and b/bin/aws-env-windows-386 differ diff --git a/bin/aws-env-windows-amd64 b/bin/aws-env-windows-amd64 index 84ff63d..380f90f 100755 Binary files a/bin/aws-env-windows-amd64 and b/bin/aws-env-windows-amd64 differ