Skip to content

Commit

Permalink
Merge pull request #20 from Droplr/feat-formatDotenv
Browse files Browse the repository at this point in the history
Allow to output in a dotenv format to create .env files
  • Loading branch information
orfin authored Aug 17, 2018
2 parents 2005b61 + 9605a21 commit 82c8340
Show file tree
Hide file tree
Showing 8 changed files with 53 additions and 17 deletions.
26 changes: 23 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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

```
Expand Down
44 changes: 30 additions & 14 deletions aws-env.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
package main

import (
"flag"
"fmt"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ssm"
"log"
"os"
"strings"
"flag"
)

const (
formatExports = "exports"
formatDotenv = "dotenv"
)

func main() {
Expand All @@ -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 {
Expand All @@ -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)
Expand All @@ -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)
}
}
Binary file modified bin/aws-env-darwin-386
Binary file not shown.
Binary file modified bin/aws-env-darwin-amd64
Binary file not shown.
Binary file modified bin/aws-env-linux-386
Binary file not shown.
Binary file modified bin/aws-env-linux-amd64
Binary file not shown.
Binary file modified bin/aws-env-windows-386
Binary file not shown.
Binary file modified bin/aws-env-windows-amd64
Binary file not shown.

0 comments on commit 82c8340

Please sign in to comment.