Skip to content

Commit 70bdc20

Browse files
authored
Upgrade to AWS SDK for Go v2 (#809)
aws-sdk-go has reached end-of-support on July 31st 2025. This commit replaces it with aws-sdk-go-v2.
1 parent 5dddb37 commit 70bdc20

6 files changed

Lines changed: 100 additions & 57 deletions

File tree

go.mod

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ require (
66
github.com/Masterminds/semver/v3 v3.4.0
77
github.com/Masterminds/sprig v2.22.0+incompatible
88
github.com/ahmetb/gen-crd-api-reference-docs v0.3.0
9-
github.com/aws/aws-sdk-go v1.55.7
9+
github.com/aws/aws-sdk-go-v2 v1.39.0
10+
github.com/aws/aws-sdk-go-v2/config v1.31.8
11+
github.com/aws/aws-sdk-go-v2/credentials v1.18.12
12+
github.com/aws/aws-sdk-go-v2/service/s3 v1.88.1
1013
github.com/coreos/butane v0.24.0
1114
github.com/coreos/go-systemd/v22 v22.5.0
1215
github.com/gardener/etcd-druid/api v0.32.0
@@ -49,6 +52,21 @@ require (
4952
github.com/PaesslerAG/jsonpath v0.1.2-0.20240726212847-3a740cf7976f // indirect
5053
github.com/andybalholm/brotli v1.2.0 // indirect
5154
github.com/antlr4-go/antlr/v4 v4.13.0 // indirect
55+
github.com/aws/aws-sdk-go v1.55.6 // indirect
56+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1 // indirect
57+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.7 // indirect
58+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.7 // indirect
59+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.7 // indirect
60+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect
61+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.7 // indirect
62+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 // indirect
63+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.7 // indirect
64+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.7 // indirect
65+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.7 // indirect
66+
github.com/aws/aws-sdk-go-v2/service/sso v1.29.3 // indirect
67+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.4 // indirect
68+
github.com/aws/aws-sdk-go-v2/service/sts v1.38.4 // indirect
69+
github.com/aws/smithy-go v1.23.0 // indirect
5270
github.com/beorn7/perks v1.0.1 // indirect
5371
github.com/blang/semver/v4 v4.0.0 // indirect
5472
github.com/brunoga/deep v1.2.5 // indirect
@@ -89,7 +107,6 @@ require (
89107
github.com/hashicorp/go-multierror v1.1.1 // indirect
90108
github.com/huandu/xstrings v1.5.0 // indirect
91109
github.com/inconshreveable/mousetrap v1.1.0 // indirect
92-
github.com/jmespath/go-jmespath v0.4.0 // indirect
93110
github.com/josharian/intern v1.0.0 // indirect
94111
github.com/jpillora/backoff v1.0.0 // indirect
95112
github.com/json-iterator/go v1.1.12 // indirect

go.sum

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,44 @@ github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8
6161
github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=
6262
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
6363
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
64-
github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE=
65-
github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
64+
github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk=
65+
github.com/aws/aws-sdk-go v1.55.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
66+
github.com/aws/aws-sdk-go-v2 v1.39.0 h1:xm5WV/2L4emMRmMjHFykqiA4M/ra0DJVSWUkDyBjbg4=
67+
github.com/aws/aws-sdk-go-v2 v1.39.0/go.mod h1:sDioUELIUO9Znk23YVmIk86/9DOpkbyyVb1i/gUNFXY=
68+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1 h1:i8p8P4diljCr60PpJp6qZXNlgX4m2yQFpYk+9ZT+J4E=
69+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1/go.mod h1:ddqbooRZYNoJ2dsTwOty16rM+/Aqmk/GOXrK8cg7V00=
70+
github.com/aws/aws-sdk-go-v2/config v1.31.8 h1:kQjtOLlTU4m4A64TsRcqwNChhGCwaPBt+zCQt/oWsHU=
71+
github.com/aws/aws-sdk-go-v2/config v1.31.8/go.mod h1:QPpc7IgljrKwH0+E6/KolCgr4WPLerURiU592AYzfSY=
72+
github.com/aws/aws-sdk-go-v2/credentials v1.18.12 h1:zmc9e1q90wMn8wQbjryy8IwA6Q4XlaL9Bx2zIqdNNbk=
73+
github.com/aws/aws-sdk-go-v2/credentials v1.18.12/go.mod h1:3VzdRDR5u3sSJRI4kYcOSIBbeYsgtVk7dG5R/U6qLWY=
74+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.7 h1:Is2tPmieqGS2edBnmOJIbdvOA6Op+rRpaYR60iBAwXM=
75+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.7/go.mod h1:F1i5V5421EGci570yABvpIXgRIBPb5JM+lSkHF6Dq5w=
76+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.7 h1:UCxq0X9O3xrlENdKf1r9eRJoKz/b0AfGkpp3a7FPlhg=
77+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.7/go.mod h1:rHRoJUNUASj5Z/0eqI4w32vKvC7atoWR0jC+IkmVH8k=
78+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.7 h1:Y6DTZUn7ZUC4th9FMBbo8LVE+1fyq3ofw+tRwkUd3PY=
79+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.7/go.mod h1:x3XE6vMnU9QvHN/Wrx2s44kwzV2o2g5x/siw4ZUJ9g8=
80+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=
81+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo=
82+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.7 h1:BszAktdUo2xlzmYHjWMq70DqJ7cROM8iBd3f6hrpuMQ=
83+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.7/go.mod h1:XJ1yHki/P7ZPuG4fd3f0Pg/dSGA2cTQBCLw82MH2H48=
84+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 h1:oegbebPEMA/1Jny7kvwejowCaHz1FWZAQ94WXFNCyTM=
85+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1/go.mod h1:kemo5Myr9ac0U9JfSjMo9yHLtw+pECEHsFtJ9tqCEI8=
86+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.7 h1:zmZ8qvtE9chfhBPuKB2aQFxW5F/rpwXUgmcVCgQzqRw=
87+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.7/go.mod h1:vVYfbpd2l+pKqlSIDIOgouxNsGu5il9uDp0ooWb0jys=
88+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.7 h1:mLgc5QIgOy26qyh5bvW+nDoAppxgn3J2WV3m9ewq7+8=
89+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.7/go.mod h1:wXb/eQnqt8mDQIQTTmcw58B5mYGxzLGZGK8PWNFZ0BA=
90+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.7 h1:u3VbDKUCWarWiU+aIUK4gjTr/wQFXV17y3hgNno9fcA=
91+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.7/go.mod h1:/OuMQwhSyRapYxq6ZNpPer8juGNrB4P5Oz8bZ2cgjQE=
92+
github.com/aws/aws-sdk-go-v2/service/s3 v1.88.1 h1:+RpGuaQ72qnU83qBKVwxkznewEdAGhIWo/PQCmkhhog=
93+
github.com/aws/aws-sdk-go-v2/service/s3 v1.88.1/go.mod h1:xajPTguLoeQMAOE44AAP2RQoUhF8ey1g5IFHARv71po=
94+
github.com/aws/aws-sdk-go-v2/service/sso v1.29.3 h1:7PKX3VYsZ8LUWceVRuv0+PU+E7OtQb1lgmi5vmUE9CM=
95+
github.com/aws/aws-sdk-go-v2/service/sso v1.29.3/go.mod h1:Ql6jE9kyyWI5JHn+61UT/Y5Z0oyVJGmgmJbZD5g4unY=
96+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.4 h1:e0XBRn3AptQotkyBFrHAxFB8mDhAIOfsG+7KyJ0dg98=
97+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.4/go.mod h1:XclEty74bsGBCr1s0VSaA11hQ4ZidK4viWK7rRfO88I=
98+
github.com/aws/aws-sdk-go-v2/service/sts v1.38.4 h1:PR00NXRYgY4FWHqOGx3fC3lhVKjsp1GdloDv2ynMSd8=
99+
github.com/aws/aws-sdk-go-v2/service/sts v1.38.4/go.mod h1:Z+Gd23v97pX9zK97+tX4ppAgqCt3Z2dIXB02CtBncK8=
100+
github.com/aws/smithy-go v1.23.0 h1:8n6I3gXzWJB2DxBDnfxgBaSX6oe0d/t10qGz7OKqMCE=
101+
github.com/aws/smithy-go v1.23.0/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
66102
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
67103
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
68104
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
@@ -249,10 +285,6 @@ github.com/ironcore-dev/ironcore v0.2.4 h1:i/RqiMIdzaptuDR6EKSX9hbeolj7AfTuT+4v1
249285
github.com/ironcore-dev/ironcore v0.2.4/go.mod h1:idYH/uyjxsIx8k3PFfXNtwfEpF9bBzBNe0aJFpIZpxs=
250286
github.com/ironcore-dev/vgopath v0.1.8 h1:1YBl1I0lPVCR2cz3R6G/6fQ8t261iiSUXmy1xypBYgM=
251287
github.com/ironcore-dev/vgopath v0.1.8/go.mod h1:yf4M1I+TYxvKPBKaximWBUrUBOgTa/+f7s3LL4UVCRs=
252-
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
253-
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
254-
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
255-
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
256288
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
257289
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
258290
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=

pkg/controller/backupentry/actuator.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ func (a *actuator) Delete(ctx context.Context, log logr.Logger, backupEntry *ext
4242
}
4343

4444
// get s3 client from s3 client secret
45-
s3Client, err := GetS3ClientFromS3ClientSecret(s3ClientSecret)
45+
s3Client, err := GetS3ClientFromS3ClientSecret(ctx, s3ClientSecret)
4646
if err != nil {
4747
return fmt.Errorf("failed to get s3 client from s3 client secret: %w", err)
4848
}
4949

50-
return DeleteObjectsWithPrefix(ctx, s3Client, backupEntry.Spec.Region, backupEntry.Spec.BucketName, fmt.Sprintf("%s/", backupEntry.Name))
50+
return DeleteObjectsWithPrefix(ctx, s3Client, backupEntry.Spec.BucketName, fmt.Sprintf("%s/", backupEntry.Name))
5151
}

pkg/controller/backupentry/actuator_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ package backupentry
66
import (
77
"fmt"
88

9-
"github.com/aws/aws-sdk-go/aws"
10-
"github.com/aws/aws-sdk-go/service/s3"
9+
"github.com/aws/aws-sdk-go-v2/aws"
10+
"github.com/aws/aws-sdk-go-v2/service/s3"
1111
"github.com/gardener/gardener/extensions/pkg/controller/backupentry/genericactuator"
1212
extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1"
1313
"github.com/go-logr/logr"
@@ -107,7 +107,7 @@ var _ = Describe("BackupEntry Delete", func() {
107107
}
108108
Expect(k8sClient.Create(ctx, backupEntry)).To(Succeed())
109109

110-
in := &s3.ListObjectsInput{
110+
in := &s3.ListObjectsV2Input{
111111
Bucket: aws.String(bucketName),
112112
Prefix: aws.String(fmt.Sprintf("%s/", backupEntry.Name)),
113113
}

pkg/controller/backupentry/backupentry.go

Lines changed: 35 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@ package backupentry
55

66
import (
77
"context"
8+
"errors"
89
"fmt"
910

10-
"github.com/aws/aws-sdk-go/aws"
11-
"github.com/aws/aws-sdk-go/aws/awserr"
12-
"github.com/aws/aws-sdk-go/aws/credentials"
13-
"github.com/aws/aws-sdk-go/aws/session"
14-
"github.com/aws/aws-sdk-go/service/s3"
11+
"github.com/aws/aws-sdk-go-v2/aws"
12+
"github.com/aws/aws-sdk-go-v2/config"
13+
"github.com/aws/aws-sdk-go-v2/credentials"
14+
"github.com/aws/aws-sdk-go-v2/service/s3"
15+
s3types "github.com/aws/aws-sdk-go-v2/service/s3/types"
1516
corev1 "k8s.io/api/core/v1"
1617

1718
"github.com/ironcore-dev/gardener-extension-provider-ironcore/pkg/ironcore"
@@ -20,53 +21,48 @@ import (
2021
//go:generate $MOCKGEN -copyright_file ../../../hack/license-header.txt -package backupentry -destination=mock_backupentry.go -source backupentry.go S3ClientGetter,S3ObjectLister
2122

2223
type s3ObjectLister interface {
23-
ListObjectsPages(ctx aws.Context, s3Client *s3.S3, input *s3.ListObjectsInput, bucketName string) error
24+
ListObjectsPages(ctx context.Context, s3Client *s3.Client, input *s3.ListObjectsV2Input, bucketName string) error
2425
}
2526

2627
type s3ObjectListerImpl struct{}
2728

2829
var objectLister s3ObjectLister = s3ObjectListerImpl{}
2930

30-
func (o s3ObjectListerImpl) ListObjectsPages(ctx aws.Context, s3Client *s3.S3, input *s3.ListObjectsInput, bucketName string) error {
31-
var delErr error
32-
if err := s3Client.ListObjectsPagesWithContext(ctx, input, func(page *s3.ListObjectsOutput, lastPage bool) bool {
33-
objectIDs := make([]*s3.ObjectIdentifier, 0)
34-
for _, key := range page.Contents {
35-
obj := &s3.ObjectIdentifier{
36-
Key: key.Key,
37-
}
38-
objectIDs = append(objectIDs, obj)
31+
func (o s3ObjectListerImpl) ListObjectsPages(ctx context.Context, s3Client *s3.Client, input *s3.ListObjectsV2Input, bucketName string) error {
32+
paginator := s3.NewListObjectsV2Paginator(s3Client, input)
33+
for paginator.HasMorePages() {
34+
objectIDs := make([]s3types.ObjectIdentifier, 0)
35+
output, err := paginator.NextPage(ctx)
36+
if err != nil {
37+
return err
38+
}
39+
for _, object := range output.Contents {
40+
identifier := s3types.ObjectIdentifier{Key: object.Key}
41+
objectIDs = append(objectIDs, identifier)
3942
}
40-
4143
if len(objectIDs) != 0 {
42-
if _, delErr = s3Client.DeleteObjectsWithContext(ctx, &s3.DeleteObjectsInput{
44+
if _, err = s3Client.DeleteObjects(ctx, &s3.DeleteObjectsInput{
4345
Bucket: aws.String(bucketName),
44-
Delete: &s3.Delete{
46+
Delete: &s3types.Delete{
4547
Objects: objectIDs,
4648
Quiet: aws.Bool(true),
4749
},
48-
}); delErr != nil {
49-
return false
50+
}); err != nil {
51+
var nsk *s3types.NoSuchKey
52+
if errors.As(err, &nsk) {
53+
return nil
54+
}
55+
return err
5056
}
5157
}
52-
return !lastPage
53-
}); err != nil {
54-
return fmt.Errorf("error listing objects pages from bucket %s: %w", bucketName, err)
55-
}
56-
57-
if delErr != nil {
58-
if aerr, ok := delErr.(awserr.Error); ok && aerr.Code() == s3.ErrCodeNoSuchKey {
59-
return nil
60-
}
61-
return delErr
6258
}
6359
return nil
6460
}
6561

6662
// DeleteObjectsWithPrefix deletes the s3 objects with the specific <prefix>
6763
// from <bucket>. If it does not exist, no error is returned.
68-
func DeleteObjectsWithPrefix(ctx context.Context, s3Client *s3.S3, region, bucketName, prefix string) error {
69-
in := &s3.ListObjectsInput{
64+
func DeleteObjectsWithPrefix(ctx context.Context, s3Client *s3.Client, bucketName, prefix string) error {
65+
in := &s3.ListObjectsV2Input{
7066
Bucket: aws.String(bucketName),
7167
Prefix: aws.String(prefix),
7268
}
@@ -80,7 +76,7 @@ func DeleteObjectsWithPrefix(ctx context.Context, s3Client *s3.S3, region, bucke
8076

8177
// GetS3ClientFromS3ClientSecret creates s3Client from bucket access key ID
8278
// and secret access key.
83-
func GetS3ClientFromS3ClientSecret(secret *corev1.Secret) (*s3.S3, error) {
79+
func GetS3ClientFromS3ClientSecret(ctx context.Context, secret *corev1.Secret) (*s3.Client, error) {
8480
if secret.Data == nil {
8581
return nil, fmt.Errorf("secret does not contain any data")
8682
}
@@ -100,18 +96,16 @@ func GetS3ClientFromS3ClientSecret(secret *corev1.Secret) (*s3.S3, error) {
10096
return nil, fmt.Errorf("missing %q field in secret", ironcore.Endpoint)
10197
}
10298

99+
awsCredentials := credentials.NewStaticCredentialsProvider(string(accessKeyID), string(secretAccessKey), "")
103100
endpointStr := string(endpoint)
104-
awsConfig := &aws.Config{
105-
Credentials: credentials.NewStaticCredentials(string(accessKeyID), string(secretAccessKey), ""),
106-
Endpoint: &endpointStr,
107-
}
108101

109-
s, err := session.NewSession(awsConfig)
102+
cfg, err := config.LoadDefaultConfig(ctx, config.WithCredentialsProvider(awsCredentials), config.WithBaseEndpoint(endpointStr))
110103
if err != nil {
111-
return nil, fmt.Errorf("failed to create session: %w", err)
104+
return nil, fmt.Errorf("failed to create AWS config: %w", err)
112105
}
113-
config := &aws.Config{Region: aws.String("region")} //TODO: hardcoded the region for now, consider making it configurable if necessary
114-
s3Client := s3.New(s, config)
106+
s3Client := s3.NewFromConfig(cfg, func(o *s3.Options) {
107+
o.Region = "region" //TODO: hardcoded the region for now, consider making it configurable if necessary
108+
})
115109

116110
return s3Client, nil
117111
}

pkg/controller/backupentry/mock_backupentry.go

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)