/
ssm.go
72 lines (57 loc) · 1.35 KB
/
ssm.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package ssm
import (
"context"
"os"
"strings"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ssm"
"github.com/pkg/errors"
)
type Config struct {
Path string `envconfig:"SSM_PATH"`
}
type Param struct {
Name string
Value string
}
func GetParametersFromPath(ctx context.Context, path string) ([]Param, error) {
sess, err := session.NewSession()
if err != nil {
return nil, errors.Wrap(err, "session: new session")
}
ssmClient := ssm.New(sess)
var tok *string
var params []*ssm.Parameter
for {
res, err := ssmClient.GetParametersByPathWithContext(ctx, &ssm.GetParametersByPathInput{
NextToken: tok,
Path: aws.String(path),
WithDecryption: aws.Bool(true),
})
if err != nil {
return nil, errors.Wrap(err, "ssm: get parameters by path")
}
params = append(params, res.Parameters...)
if res.NextToken == nil {
break
}
tok = res.NextToken
}
tbr := make([]Param, len(params))
for i, p := range params {
tbr[i] = Param{
Name: strings.TrimLeft(strings.Replace(aws.StringValue(p.Name), path, "", 1), "/"),
Value: aws.StringValue(p.Value),
}
}
return tbr, nil
}
func LoadIntoEnv(in []Param) error {
for _, v := range in {
if err := os.Setenv(v.Name, v.Value); err != nil {
return errors.Wrap(err, "os: setenv")
}
}
return nil
}