@@ -20,10 +20,12 @@ import (
2020 "context"
2121 "fmt"
2222 "sync"
23+ "time"
2324
2425 "github.com/aws/aws-sdk-go-v2/aws"
2526 "github.com/aws/aws-sdk-go-v2/aws/middleware"
2627 "github.com/aws/aws-sdk-go-v2/aws/retry"
28+ awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http"
2729 awsConfig "github.com/aws/aws-sdk-go-v2/config"
2830 stscredsv2 "github.com/aws/aws-sdk-go-v2/credentials/stscreds"
2931 "github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
@@ -40,6 +42,12 @@ import (
4042 "k8s.io/klog/v2"
4143)
4244
45+ // defaultHTTPClient is shared across all AWS SDK clients to enforce an explicit
46+ // HTTP request timeout and reuse connection pools. Without a timeout, a single
47+ // slow response can trigger the Go SDK's clock skew overcorrection and break all
48+ // subsequent API calls.
49+ var defaultHTTPClient = awshttp .NewBuildableClient ().WithTimeout (30 * time .Second )
50+
4351type awsSDKProvider struct {
4452 creds aws.CredentialsProvider
4553 cfg awsCloudConfigProvider
@@ -77,6 +85,13 @@ func (p *awsSDKProvider) AddMiddleware(ctx context.Context, regionName string, c
7785 }
7886
7987 p .addAPILoggingMiddleware (cfg )
88+
89+ // Record AWS API response status codes and error codes as metrics.
90+ cfg .APIOptions = append (cfg .APIOptions ,
91+ func (stack * smithymiddleware.Stack ) error {
92+ return stack .Deserialize .Add (awsAPIMetricsMiddleware (), smithymiddleware .After )
93+ },
94+ )
8095}
8196
8297// Adds logging middleware for AWS SDK Go V2 clients
@@ -114,6 +129,7 @@ func (p *awsSDKProvider) getCrossRequestRetryDelay(regionName string) *CrossRequ
114129func (p * awsSDKProvider ) Compute (ctx context.Context , regionName string , assumeRoleProvider * stscredsv2.AssumeRoleProvider ) (iface.EC2 , error ) {
115130 cfg , err := awsConfig .LoadDefaultConfig (ctx , awsConfig .WithDefaultsMode (aws .DefaultsModeInRegion ),
116131 awsConfig .WithRegion (regionName ),
132+ awsConfig .WithHTTPClient (defaultHTTPClient ),
117133 )
118134 if assumeRoleProvider != nil {
119135 cfg .Credentials = aws .NewCredentialsCache (assumeRoleProvider )
@@ -142,6 +158,7 @@ func (p *awsSDKProvider) Compute(ctx context.Context, regionName string, assumeR
142158func (p * awsSDKProvider ) LoadBalancing (ctx context.Context , regionName string , assumeRoleProvider * stscredsv2.AssumeRoleProvider ) (ELB , error ) {
143159 cfg , err := awsConfig .LoadDefaultConfig (ctx , awsConfig .WithDefaultsMode (aws .DefaultsModeInRegion ),
144160 awsConfig .WithRegion (regionName ),
161+ awsConfig .WithHTTPClient (defaultHTTPClient ),
145162 )
146163 if assumeRoleProvider != nil {
147164 cfg .Credentials = aws .NewCredentialsCache (assumeRoleProvider )
@@ -167,6 +184,7 @@ func (p *awsSDKProvider) LoadBalancing(ctx context.Context, regionName string, a
167184func (p * awsSDKProvider ) LoadBalancingV2 (ctx context.Context , regionName string , assumeRoleProvider * stscredsv2.AssumeRoleProvider ) (ELBV2 , error ) {
168185 cfg , err := awsConfig .LoadDefaultConfig (ctx , awsConfig .WithDefaultsMode (aws .DefaultsModeInRegion ),
169186 awsConfig .WithRegion (regionName ),
187+ awsConfig .WithHTTPClient (defaultHTTPClient ),
170188 )
171189 if assumeRoleProvider != nil {
172190 cfg .Credentials = aws .NewCredentialsCache (assumeRoleProvider )
@@ -190,7 +208,9 @@ func (p *awsSDKProvider) LoadBalancingV2(ctx context.Context, regionName string,
190208}
191209
192210func (p * awsSDKProvider ) Metadata (ctx context.Context ) (config.EC2Metadata , error ) {
193- cfg , err := awsConfig .LoadDefaultConfig (context .TODO (), awsConfig .WithDefaultsMode (aws .DefaultsModeInRegion ))
211+ cfg , err := awsConfig .LoadDefaultConfig (context .TODO (), awsConfig .WithDefaultsMode (aws .DefaultsModeInRegion ),
212+ awsConfig .WithHTTPClient (defaultHTTPClient ),
213+ )
194214 if err != nil {
195215 return nil , fmt .Errorf ("unable to initialize AWS config: %v" , err )
196216 }
@@ -226,6 +246,7 @@ func (p *awsSDKProvider) Metadata(ctx context.Context) (config.EC2Metadata, erro
226246func (p * awsSDKProvider ) KeyManagement (ctx context.Context , regionName string , assumeRoleProvider * stscredsv2.AssumeRoleProvider ) (KMS , error ) {
227247 cfg , err := awsConfig .LoadDefaultConfig (ctx , awsConfig .WithDefaultsMode (aws .DefaultsModeInRegion ),
228248 awsConfig .WithRegion (regionName ),
249+ awsConfig .WithHTTPClient (defaultHTTPClient ),
229250 )
230251 if assumeRoleProvider != nil {
231252 cfg .Credentials = aws .NewCredentialsCache (assumeRoleProvider )
0 commit comments