Skip to content

Commit 92a2340

Browse files
authored
fix: use AWS SDK v2 (#36)
The v1 SDK has been EOL for some time now.
1 parent 9cf77d2 commit 92a2340

5 files changed

Lines changed: 131 additions & 42 deletions

File tree

go.mod

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,25 @@ module github.com/cultureamp/parameter-store-exec
33
go 1.23.0
44

55
require (
6-
github.com/aws/aws-sdk-go v1.55.5
6+
github.com/aws/aws-sdk-go-v2 v1.30.3
7+
github.com/aws/aws-sdk-go-v2/config v1.27.27
8+
github.com/aws/aws-sdk-go-v2/service/ssm v1.52.4
79
github.com/pkg/errors v0.9.1
810
github.com/stretchr/testify v1.9.0
911
)
1012

1113
require (
14+
github.com/aws/aws-sdk-go-v2/credentials v1.17.27 // indirect
15+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11 // indirect
16+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 // indirect
17+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 // indirect
18+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect
19+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 // indirect
20+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 // indirect
21+
github.com/aws/aws-sdk-go-v2/service/sso v1.22.4 // indirect
22+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 // indirect
23+
github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 // indirect
24+
github.com/aws/smithy-go v1.20.3 // indirect
1225
github.com/davecgh/go-spew v1.1.1 // indirect
1326
github.com/jmespath/go-jmespath v0.4.0 // indirect
1427
github.com/pmezard/go-difflib v1.0.0 // indirect

go.sum

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,31 @@
1-
github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
2-
github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
1+
github.com/aws/aws-sdk-go-v2 v1.30.3 h1:jUeBtG0Ih+ZIFH0F4UkmL9w3cSpaMv9tYYDbzILP8dY=
2+
github.com/aws/aws-sdk-go-v2 v1.30.3/go.mod h1:nIQjQVp5sfpQcTc9mPSr1B0PaWK5ByX9MOoDadSN4lc=
3+
github.com/aws/aws-sdk-go-v2/config v1.27.27 h1:HdqgGt1OAP0HkEDDShEl0oSYa9ZZBSOmKpdpsDMdO90=
4+
github.com/aws/aws-sdk-go-v2/config v1.27.27/go.mod h1:MVYamCg76dFNINkZFu4n4RjDixhVr51HLj4ErWzrVwg=
5+
github.com/aws/aws-sdk-go-v2/credentials v1.17.27 h1:2raNba6gr2IfA0eqqiP2XiQ0UVOpGPgDSi0I9iAP+UI=
6+
github.com/aws/aws-sdk-go-v2/credentials v1.17.27/go.mod h1:gniiwbGahQByxan6YjQUMcW4Aov6bLC3m+evgcoN4r4=
7+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11 h1:KreluoV8FZDEtI6Co2xuNk/UqI9iwMrOx/87PBNIKqw=
8+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11/go.mod h1:SeSUYBLsMYFoRvHE0Tjvn7kbxaUhl75CJi1sbfhMxkU=
9+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 h1:SoNJ4RlFEQEbtDcCEt+QG56MY4fm4W8rYirAmq+/DdU=
10+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15/go.mod h1:U9ke74k1n2bf+RIgoX1SXFed1HLs51OgUSs+Ph0KJP8=
11+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 h1:C6WHdGnTDIYETAm5iErQUiVNsclNx9qbJVPIt03B6bI=
12+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15/go.mod h1:ZQLZqhcu+JhSrA9/NXRm8SkDvsycE+JkV3WGY41e+IM=
13+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU=
14+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY=
15+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 h1:dT3MqvGhSoaIhRseqw2I0yH81l7wiR2vjs57O51EAm8=
16+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3/go.mod h1:GlAeCkHwugxdHaueRr4nhPuY+WW+gR8UjlcqzPr1SPI=
17+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 h1:HGErhhrxZlQ044RiM+WdoZxp0p+EGM62y3L6pwA4olE=
18+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17/go.mod h1:RkZEx4l0EHYDJpWppMJ3nD9wZJAa8/0lq9aVC+r2UII=
19+
github.com/aws/aws-sdk-go-v2/service/ssm v1.52.4 h1:hgSBvRT7JEWx2+vEGI9/Ld5rZtl7M5lu8PqdvOmbRHw=
20+
github.com/aws/aws-sdk-go-v2/service/ssm v1.52.4/go.mod h1:v7NIzEFIHBiicOMaMTuEmbnzGnqW0d+6ulNALul6fYE=
21+
github.com/aws/aws-sdk-go-v2/service/sso v1.22.4 h1:BXx0ZIxvrJdSgSvKTZ+yRBeSqqgPM89VPlulEcl37tM=
22+
github.com/aws/aws-sdk-go-v2/service/sso v1.22.4/go.mod h1:ooyCOXjvJEsUw7x+ZDHeISPMhtwI3ZCB7ggFMcFfWLU=
23+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 h1:yiwVzJW2ZxZTurVbYWA7QOrAaCYQR72t0wrSBfoesUE=
24+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4/go.mod h1:0oxfLkpz3rQ/CHlx5hB7H69YUpFiI1tql6Q6Ne+1bCw=
25+
github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 h1:ZsDKRLXGWHk8WdtyYMoGNO7bTudrvuKpDKgMVRlepGE=
26+
github.com/aws/aws-sdk-go-v2/service/sts v1.30.3/go.mod h1:zwySh8fpFyXp9yOr/KVzxOl8SRqgf/IDw5aUt9UKFcQ=
27+
github.com/aws/smithy-go v1.20.3 h1:ryHwveWzPV5BIof6fyDvor6V3iUL7nTfiTKXHiW05nE=
28+
github.com/aws/smithy-go v1.20.3/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E=
329
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
430
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
531
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=

main.go

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"context"
45
"fmt"
56
"log"
67
"os"
@@ -9,9 +10,8 @@ import (
910
"strings"
1011
"syscall"
1112

12-
"github.com/aws/aws-sdk-go/aws"
13-
"github.com/aws/aws-sdk-go/aws/session"
14-
"github.com/aws/aws-sdk-go/service/ssm"
13+
"github.com/aws/aws-sdk-go-v2/config"
14+
"github.com/aws/aws-sdk-go-v2/service/ssm"
1515
"github.com/cultureamp/parameter-store-exec/paramstore"
1616
"github.com/pkg/errors"
1717
)
@@ -25,16 +25,23 @@ var transformPattern = regexp.MustCompile("[^A-Z0-9_]")
2525
var Version = "dev"
2626

2727
func main() {
28+
log.SetOutput(os.Stderr)
29+
if err := run(); err != nil {
30+
log.Fatal(err)
31+
}
32+
}
33+
34+
func run() error {
2835
if len(os.Args) == 2 && os.Args[1] == "--version" {
2936
fmt.Printf("parameter-store-exec %s\n", Version)
30-
return
37+
return nil
3138
}
3239

33-
log.SetOutput(os.Stderr)
40+
ctx := context.Background()
3441

3542
argv, err := argvForExec(os.Args)
3643
if err != nil {
37-
log.Fatal(err)
44+
return err
3845
}
3946

4047
program, err := exec.LookPath(argv[0])
@@ -45,12 +52,18 @@ func main() {
4552
environ := os.Environ()
4653

4754
if path := os.Getenv(pathEnv); path != "" {
55+
cfg, err := config.LoadDefaultConfig(ctx)
56+
if err != nil {
57+
return err
58+
}
59+
client := ssm.NewFromConfig(cfg)
60+
4861
store := paramstore.Service{
49-
Client: ssm.New(session.Must(session.NewSession(&aws.Config{}))),
62+
Client: client,
5063
}
51-
params, err := store.GetParametersByPath(path)
64+
params, err := store.GetParametersByPath(ctx, path)
5265
if err != nil {
53-
log.Fatal(err)
66+
return err
5467
}
5568
for name, v := range params {
5669
envKey := paramToEnv(name, path)
@@ -67,8 +80,10 @@ func main() {
6780

6881
err = syscall.Exec(program, argv, environ)
6982
if err != nil {
70-
log.Fatal(err)
83+
return err
7184
}
85+
86+
return nil
7287
}
7388

7489
// argvForExec takes the os.Args from parameter-store-exec,

paramstore/store.go

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,36 @@
11
package paramstore
22

33
import (
4-
"github.com/aws/aws-sdk-go/aws"
5-
"github.com/aws/aws-sdk-go/service/ssm"
6-
"github.com/aws/aws-sdk-go/service/ssm/ssmiface"
4+
"context"
5+
6+
"github.com/aws/aws-sdk-go-v2/aws"
7+
"github.com/aws/aws-sdk-go-v2/service/ssm"
78
)
89

910
// Service provides a minimal interface to SSM Parameter Store,
10-
// and should be
11+
// giving us greater flexibility in a test context.
1112
type Service struct {
12-
Client ssmiface.SSMAPI
13+
Client ssm.GetParametersByPathAPIClient
1314
}
1415

15-
func (svc Service) GetParametersByPath(path string) (map[string]string, error) {
16+
// GetParametersByPath retrieves all parameters matching a given path prefix,
17+
// returning them as name-value pairs in a map.
18+
func (svc Service) GetParametersByPath(ctx context.Context, path string) (map[string]string, error) {
1619
input := &ssm.GetParametersByPathInput{
1720
Path: aws.String(path),
1821
Recursive: aws.Bool(true),
1922
WithDecryption: aws.Bool(true),
2023
}
2124
result := map[string]string{}
22-
err := svc.Client.GetParametersByPathPages(
23-
input,
24-
func(resp *ssm.GetParametersByPathOutput, lastPage bool) bool {
25-
for _, p := range resp.Parameters {
26-
result[*p.Name] = *p.Value
27-
}
28-
return true
29-
},
30-
)
31-
return result, err
25+
paginator := ssm.NewGetParametersByPathPaginator(svc.Client, input)
26+
for paginator.HasMorePages() {
27+
page, err := paginator.NextPage(ctx)
28+
if err != nil {
29+
return nil, err
30+
}
31+
for _, p := range page.Parameters {
32+
result[*p.Name] = *p.Value
33+
}
34+
}
35+
return result, nil
3236
}

paramstore/store_test.go

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package paramstore_test
22

33
import (
4+
"context"
5+
"errors"
6+
"strconv"
47
"testing"
58

6-
"github.com/aws/aws-sdk-go/service/ssm"
7-
"github.com/aws/aws-sdk-go/service/ssm/ssmiface"
9+
"github.com/aws/aws-sdk-go-v2/aws"
10+
"github.com/aws/aws-sdk-go-v2/service/ssm"
11+
"github.com/aws/aws-sdk-go-v2/service/ssm/types"
812
"github.com/cultureamp/parameter-store-exec/paramstore"
913
"github.com/stretchr/testify/assert"
1014
"github.com/stretchr/testify/require"
@@ -14,7 +18,7 @@ func TestGetParametersByPath(t *testing.T) {
1418
svc := paramstore.Service{Client: FakeClient{
1519
T: t,
1620
Path: "/foo/bar",
17-
Pages: [][]*ssm.Parameter{
21+
Pages: [][]types.Parameter{
1822
{
1923
param("/foo/bar/one", "first"),
2024
param("/foo/bar/two", "second"),
@@ -24,7 +28,7 @@ func TestGetParametersByPath(t *testing.T) {
2428
},
2529
},
2630
}}
27-
params, err := svc.GetParametersByPath("/foo/bar")
31+
params, err := svc.GetParametersByPath(context.Background(), "/foo/bar")
2832
require.NoError(t, err)
2933
assert.Equal(t, map[string]string{
3034
"/foo/bar/one": "first",
@@ -33,22 +37,49 @@ func TestGetParametersByPath(t *testing.T) {
3337
}, params)
3438
}
3539

36-
func param(name, value string) *ssm.Parameter {
37-
return &ssm.Parameter{Name: &name, Value: &value}
40+
func param(name, value string) types.Parameter {
41+
return types.Parameter{Name: &name, Value: &value}
3842
}
3943

44+
var _ ssm.GetParametersByPathAPIClient = FakeClient{}
45+
4046
type FakeClient struct {
41-
ssmiface.SSMAPI
4247
Path string
43-
Pages [][]*ssm.Parameter
48+
Pages [][]types.Parameter
4449
T *testing.T
4550
}
4651

47-
func (f FakeClient) GetParametersByPathPages(input *ssm.GetParametersByPathInput, handler func(*ssm.GetParametersByPathOutput, bool) bool) error {
52+
func (f FakeClient) GetParametersByPath(ctx context.Context, input *ssm.GetParametersByPathInput, opts ...func(*ssm.Options)) (*ssm.GetParametersByPathOutput, error) {
4853
require.Equal(f.T, *input.Path, f.Path)
49-
for i, page := range f.Pages {
50-
lastPage := (i == len(f.Pages)-1)
51-
handler(&ssm.GetParametersByPathOutput{Parameters: page}, lastPage)
54+
55+
pageNum, err := getPage(input.NextToken)
56+
if err != nil {
57+
return nil, err
58+
}
59+
if pageNum >= len(f.Pages) {
60+
return nil, errors.New("invalid page")
61+
}
62+
63+
nextPage := pageNum + 1
64+
output := &ssm.GetParametersByPathOutput{Parameters: f.Pages[pageNum]}
65+
66+
if nextPage < len(f.Pages) {
67+
output.NextToken = aws.String(strconv.Itoa(nextPage))
5268
}
53-
return nil
69+
70+
return output, nil
71+
}
72+
73+
func getPage(nextToken *string) (int, error) {
74+
pageNum := 0
75+
var err error
76+
77+
if nextToken != nil {
78+
pageNum, err = strconv.Atoi(*nextToken)
79+
if err != nil {
80+
return 0, err
81+
}
82+
}
83+
84+
return pageNum, nil
5485
}

0 commit comments

Comments
 (0)