@@ -10,18 +10,11 @@ import (
1010 "sync"
1111 "time"
1212
13- awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
14- "github.com/aws/aws-sdk-go-v2/aws/ratelimit"
15- "github.com/aws/aws-sdk-go-v2/aws/retry"
1613 "github.com/aws/aws-sdk-go-v2/config"
1714 "github.com/aws/aws-sdk-go-v2/credentials"
1815 ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types"
1916 "github.com/aws/aws-sdk-go-v2/service/sts"
2017
21- smithymiddleware "github.com/aws/smithy-go/middleware"
22- "sigs.k8s.io/aws-load-balancer-controller/pkg/aws/throttle"
23- "sigs.k8s.io/aws-load-balancer-controller/pkg/version"
24-
2518 "github.com/aws/aws-sdk-go-v2/aws"
2619 "github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
2720 "github.com/aws/aws-sdk-go-v2/service/ec2"
@@ -35,7 +28,6 @@ import (
3528)
3629
3730const (
38- userAgent = "elbv2.k8s.aws"
3931 cacheTTLBufferTime = 30 * time .Second
4032)
4133
@@ -81,29 +73,11 @@ func NewCloud(cfg CloudConfig, clusterName string, metricsCollector *aws_metrics
8173 }
8274 cfg .Region = region
8375 }
84- awsConfig , err := config .LoadDefaultConfig (context .TODO (),
85- config .WithRegion (cfg .Region ),
86- config .WithRetryer (func () aws.Retryer {
87- return retry .NewStandard (func (o * retry.StandardOptions ) {
88- o .RateLimiter = ratelimit .None
89- o .MaxAttempts = cfg .MaxRetries
90- })
91- }),
92- config .WithEC2IMDSEndpointMode (ec2IMDSEndpointMode ),
93- config .WithAPIOptions ([]func (stack * smithymiddleware.Stack ) error {
94- awsmiddleware .AddUserAgentKeyValue (userAgent , version .GitVersion ),
95- }),
96- )
97-
98- if cfg .ThrottleConfig != nil {
99- throttler := throttle .NewThrottler (cfg .ThrottleConfig )
100- awsConfig .APIOptions = append (awsConfig .APIOptions , func (stack * smithymiddleware.Stack ) error {
101- return throttle .WithSDKRequestThrottleMiddleware (throttler )(stack )
102- })
103- }
10476
105- if metricsCollector != nil {
106- awsConfig .APIOptions = aws_metrics .WithSDKMetricCollector (metricsCollector , awsConfig .APIOptions )
77+ awsConfigGenerator := NewAWSConfigGenerator (cfg , ec2IMDSEndpointMode , metricsCollector )
78+ awsConfig , err := awsConfigGenerator .GenerateAWSConfig ()
79+ if err != nil {
80+ return nil , errors .Wrap (err , "Unable to generate AWS config" )
10781 }
10882
10983 if awsClientsProvider == nil {
@@ -132,6 +106,8 @@ func NewCloud(cfg CloudConfig, clusterName string, metricsCollector *aws_metrics
132106 shield : services .NewShield (awsClientsProvider ),
133107 rgt : services .NewRGT (awsClientsProvider ),
134108
109+ awsConfigGenerator : awsConfigGenerator ,
110+
135111 assumeRoleElbV2Cache : cache .NewExpiring (),
136112
137113 awsClientsProvider : awsClientsProvider ,
@@ -229,6 +205,8 @@ type defaultCloud struct {
229205
230206 clusterName string
231207
208+ awsConfigGenerator AWSConfigGenerator
209+
232210 // A cache holding elbv2 clients that are assuming a role.
233211 assumeRoleElbV2Cache * cache.Expiring
234212 // assumeRoleElbV2CacheMutex protects assumeRoleElbV2Cache
@@ -251,31 +229,33 @@ func (c *defaultCloud) GetAssumedRoleELBV2(ctx context.Context, assumeRoleArn st
251229 if exists {
252230 return assumedRoleELBV2 .(services.ELBV2 ), nil
253231 }
254- c .logger .Info ("awsCloud" , "method" , "GetAssumedRoleELBV2 " , "AssumeRoleArn" , assumeRoleArn , "externalId" , externalId )
232+ c .logger .Info ("Constructing new elbv2 client " , "AssumeRoleArn" , assumeRoleArn , "externalId" , externalId )
255233
256- existingAwsConfig , _ := c .awsClientsProvider .GetAWSConfig (ctx , "GetAWSConfigForIAMRoleImpersonation" )
234+ stsClient , err := c .awsClientsProvider .GetSTSClient (ctx , "AssumeRole" )
235+ if err != nil {
236+ // This should never happen, but let's be forward-looking.
237+ return nil , err
238+ }
257239
258- sourceAccount := sts .NewFromConfig (* existingAwsConfig )
259- response , err := sourceAccount .AssumeRole (ctx , & sts.AssumeRoleInput {
240+ response , err := stsClient .AssumeRole (ctx , & sts.AssumeRoleInput {
260241 RoleArn : aws .String (assumeRoleArn ),
261242 RoleSessionName : aws .String (generateAssumeRoleSessionName (c .clusterName )),
262243 ExternalId : aws .String (externalId ),
263244 })
264245 if err != nil {
265- c .logger .Error (err , "Unable to assume target role, %v" )
246+ c .logger .Error (err , "Unable to assume target role" , "roleArn" , assumeRoleArn )
266247 return nil , err
267248 }
268249 assumedRoleCreds := response .Credentials
269250 newCreds := credentials .NewStaticCredentialsProvider (* assumedRoleCreds .AccessKeyId , * assumedRoleCreds .SecretAccessKey , * assumedRoleCreds .SessionToken )
270- newAwsConfig , err := config . LoadDefaultConfig ( ctx , config . WithRegion ( c . cfg . Region ), config .WithCredentialsProvider (newCreds ))
251+ newAwsConfig , err := c . awsConfigGenerator . GenerateAWSConfig ( config .WithCredentialsProvider (newCreds ))
271252 if err != nil {
272- c .logger .Error (err , "Unable to load static credentials for service client config, %v. Attempting to use default client" )
253+ c .logger .Error (err , "Create new service client config service client config" , "roleArn" , assumeRoleArn )
273254 return nil , err
274255 }
275256
276257 cacheTTL := assumedRoleCreds .Expiration .Sub (time .Now ())
277- existingAwsConfig .Credentials = newAwsConfig .Credentials
278- elbv2WithAssumedRole := services .NewELBV2 (c .awsClientsProvider , c )
258+ elbv2WithAssumedRole := services .NewELBV2FromStaticClient (c .awsClientsProvider .GenerateNewELBv2Client (newAwsConfig ), c )
279259
280260 c .assumeRoleElbV2CacheMutex .Lock ()
281261 defer c .assumeRoleElbV2CacheMutex .Unlock ()
0 commit comments