Skip to content

Commit 21d2f53

Browse files
committed
feat: migrate AWS SDK from v1 to v2
aws-sdk-go v1 reached EOL at the end of July 2025. Replace aws-sdk-go v1.44.114 with aws-sdk-go-v2 modules and update AWS Secrets Manager implementation to use v2 patterns with context support and custom interfaces. Signed-off-by: Ville Vesilehto <[email protected]>
1 parent 523f1ce commit 21d2f53

File tree

4 files changed

+77
-27
lines changed

4 files changed

+77
-27
lines changed

go.mod

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ require (
1111
github.com/agext/levenshtein v1.2.3
1212
github.com/antchfx/xpath v1.1.11 // indirect
1313
github.com/armon/go-metrics v0.4.1 // indirect
14-
github.com/aws/aws-sdk-go v1.44.114
14+
github.com/aws/aws-sdk-go-v2 v1.37.2
15+
github.com/aws/aws-sdk-go-v2/config v1.30.3
16+
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.37.0
1517
github.com/cenkalti/backoff/v3 v3.2.2 // indirect
1618
github.com/dylanmei/iso8601 v0.1.0 // indirect
1719
github.com/dylanmei/winrmtest v0.0.0-20210303004826-fbc9ae56efb6
@@ -89,6 +91,18 @@ require (
8991
github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect
9092
github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect
9193
github.com/armon/go-radix v1.0.0 // indirect
94+
github.com/aws/aws-sdk-go v1.44.114 // indirect
95+
github.com/aws/aws-sdk-go-v2/credentials v1.18.3 // indirect
96+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.2 // indirect
97+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.2 // indirect
98+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.2 // indirect
99+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect
100+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect
101+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.2 // indirect
102+
github.com/aws/aws-sdk-go-v2/service/sso v1.27.0 // indirect
103+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.32.0 // indirect
104+
github.com/aws/aws-sdk-go-v2/service/sts v1.36.0 // indirect
105+
github.com/aws/smithy-go v1.22.5 // indirect
92106
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect
93107
github.com/bgentry/speakeasy v0.2.0 // indirect
94108
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect

go.sum

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,34 @@ github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI=
5252
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
5353
github.com/aws/aws-sdk-go v1.44.114 h1:plIkWc/RsHr3DXBj4MEw9sEW4CcL/e2ryokc+CKyq1I=
5454
github.com/aws/aws-sdk-go v1.44.114/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
55+
github.com/aws/aws-sdk-go-v2 v1.37.2 h1:xkW1iMYawzcmYFYEV0UCMxc8gSsjCGEhBXQkdQywVbo=
56+
github.com/aws/aws-sdk-go-v2 v1.37.2/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg=
57+
github.com/aws/aws-sdk-go-v2/config v1.30.3 h1:utupeVnE3bmB221W08P0Moz1lDI3OwYa2fBtUhl7TCc=
58+
github.com/aws/aws-sdk-go-v2/config v1.30.3/go.mod h1:NDGwOEBdpyZwLPlQkpKIO7frf18BW8PaCmAM9iUxQmI=
59+
github.com/aws/aws-sdk-go-v2/credentials v1.18.3 h1:ptfyXmv+ooxzFwyuBth0yqABcjVIkjDL0iTYZBSbum8=
60+
github.com/aws/aws-sdk-go-v2/credentials v1.18.3/go.mod h1:Q43Nci++Wohb0qUh4m54sNln0dbxJw8PvQWkrwOkGOI=
61+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.2 h1:nRniHAvjFJGUCl04F3WaAj7qp/rcz5Gi1OVoj5ErBkc=
62+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.2/go.mod h1:eJDFKAMHHUvv4a0Zfa7bQb//wFNUXGrbFpYRCHe2kD0=
63+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.2 h1:sPiRHLVUIIQcoVZTNwqQcdtjkqkPopyYmIX0M5ElRf4=
64+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.2/go.mod h1:ik86P3sgV+Bk7c1tBFCwI3VxMoSEwl4YkRB9xn1s340=
65+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.2 h1:ZdzDAg075H6stMZtbD2o+PyB933M/f20e9WmCBC17wA=
66+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.2/go.mod h1:eE1IIzXG9sdZCB0pNNpMpsYTLl4YdOQD3njiVN1e/E4=
67+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=
68+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo=
69+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM=
70+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44=
71+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.2 h1:oxmDEO14NBZJbK/M8y3brhMFEIGN4j8a6Aq8eY0sqlo=
72+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.2/go.mod h1:4hH+8QCrk1uRWDPsVfsNDUup3taAjO8Dnx63au7smAU=
73+
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.37.0 h1:fC0s79wxfsbz/4WCvosbHLk2mb9ICjPyB+lWs6a0TGM=
74+
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.37.0/go.mod h1:6HxvKCop1trgfFlQGQmlq+WbMM5yPazMN9ClWFWGtDM=
75+
github.com/aws/aws-sdk-go-v2/service/sso v1.27.0 h1:j7/jTOjWeJDolPwZ/J4yZ7dUsxsWZEsxNwH5O7F8eEA=
76+
github.com/aws/aws-sdk-go-v2/service/sso v1.27.0/go.mod h1:M0xdEPQtgpNT7kdAX4/vOAPkFj60hSQRb7TvW9B0iug=
77+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.32.0 h1:ywQF2N4VjqX+Psw+jLjMmUL2g1RDHlvri3NxHA08MGI=
78+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.32.0/go.mod h1:Z+qv5Q6b7sWiclvbJyPSOT1BRVU9wfSUPaqQzZ1Xg3E=
79+
github.com/aws/aws-sdk-go-v2/service/sts v1.36.0 h1:bRP/a9llXSSgDPk7Rqn5GD/DQCGo6uk95plBFKoXt2M=
80+
github.com/aws/aws-sdk-go-v2/service/sts v1.36.0/go.mod h1:tgBsFzxwl65BWkuJ/x2EUs59bD4SfYKgikvFDJi1S58=
81+
github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw=
82+
github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
5583
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
5684
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
5785
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=

template/interpolate/aws/secretsmanager/secretsmanager.go

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,64 +6,73 @@
66
package secretsmanager
77

88
import (
9+
"context"
910
"encoding/json"
1011
"errors"
1112
"fmt"
1213
"strconv"
1314

14-
"github.com/aws/aws-sdk-go/aws"
15-
"github.com/aws/aws-sdk-go/aws/session"
16-
"github.com/aws/aws-sdk-go/service/secretsmanager"
17-
"github.com/aws/aws-sdk-go/service/secretsmanager/secretsmanageriface"
15+
"github.com/aws/aws-sdk-go-v2/aws"
16+
"github.com/aws/aws-sdk-go-v2/config"
17+
"github.com/aws/aws-sdk-go-v2/service/secretsmanager"
1818
)
1919

20+
// SecretsManagerAPI defines the interface for AWS Secrets Manager operations
21+
type SecretsManagerAPI interface {
22+
GetSecretValue(ctx context.Context, params *secretsmanager.GetSecretValueInput, optFns ...func(*secretsmanager.Options)) (*secretsmanager.GetSecretValueOutput, error)
23+
}
24+
2025
// Client represents an AWS Secrets Manager client
2126
type Client struct {
2227
config *AWSConfig
23-
api secretsmanageriface.SecretsManagerAPI
28+
api SecretsManagerAPI
2429
}
2530

26-
// New creates an AWS Session Manager Client
31+
// New creates an AWS Secrets Manager Client
2732
func New(config *AWSConfig) *Client {
2833
c := &Client{
2934
config: config,
3035
}
3136

32-
s := c.newSession(config)
33-
c.api = secretsmanager.New(s)
37+
cfg := c.loadConfig(config)
38+
c.api = secretsmanager.NewFromConfig(cfg)
3439
return c
3540
}
3641

37-
func (c *Client) newSession(config *AWSConfig) *session.Session {
38-
// Initialize config with error verbosity
39-
sessConfig := aws.NewConfig().WithCredentialsChainVerboseErrors(true)
42+
func (c *Client) loadConfig(awsConfig *AWSConfig) aws.Config {
43+
ctx := context.Background()
44+
45+
var opts []func(*config.LoadOptions) error
4046

41-
if config.Region != "" {
42-
sessConfig = sessConfig.WithRegion(config.Region)
47+
if awsConfig.Region != "" {
48+
opts = append(opts, config.WithRegion(awsConfig.Region))
4349
}
4450

45-
opts := session.Options{
46-
SharedConfigState: session.SharedConfigEnable,
47-
Config: *sessConfig,
51+
cfg, err := config.LoadDefaultConfig(ctx, opts...)
52+
if err != nil {
53+
// In v1, session.Must would panic on error, maintaining same behavior
54+
panic(fmt.Sprintf("failed to load AWS config: %v", err))
4855
}
4956

50-
return session.Must(session.NewSessionWithOptions(opts))
57+
return cfg
5158
}
5259

5360
// GetSecret return an AWS Secret Manager secret
5461
// in plain text from a given secret name
5562
func (c *Client) GetSecret(spec *SecretSpec, raw bool) (string, error) {
63+
ctx := context.Background()
64+
5665
params := &secretsmanager.GetSecretValueInput{
57-
SecretId: aws.String(spec.Name),
66+
SecretId: &spec.Name,
5867
VersionStage: aws.String("AWSCURRENT"),
5968
}
6069

61-
resp, err := c.api.GetSecretValue(params)
70+
resp, err := c.api.GetSecretValue(ctx, params)
6271
if err != nil {
6372
return "", err
6473
}
6574

66-
if resp.SecretString == nil {
75+
if resp == nil || resp.SecretString == nil {
6776
return "", errors.New("Secret is not string")
6877
}
6978

template/interpolate/aws/secretsmanager/secretsmanager_test.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,19 @@
44
package secretsmanager
55

66
import (
7+
"context"
78
"testing"
89

9-
"github.com/aws/aws-sdk-go/aws"
10-
"github.com/aws/aws-sdk-go/service/secretsmanager"
11-
"github.com/aws/aws-sdk-go/service/secretsmanager/secretsmanageriface"
10+
"github.com/aws/aws-sdk-go-v2/aws"
11+
"github.com/aws/aws-sdk-go-v2/service/secretsmanager"
1212
)
1313

1414
type mockedSecret struct {
15-
secretsmanageriface.SecretsManagerAPI
1615
Resp secretsmanager.GetSecretValueOutput
1716
}
1817

19-
// GetSecret return mocked secret value
20-
func (m mockedSecret) GetSecretValue(in *secretsmanager.GetSecretValueInput) (*secretsmanager.GetSecretValueOutput, error) {
18+
// GetSecretValue return mocked secret value
19+
func (m mockedSecret) GetSecretValue(ctx context.Context, in *secretsmanager.GetSecretValueInput, optFns ...func(*secretsmanager.Options)) (*secretsmanager.GetSecretValueOutput, error) {
2120
return &m.Resp, nil
2221
}
2322

0 commit comments

Comments
 (0)