Skip to content

Commit 8c43ce1

Browse files
committed
add timeout to AWS SDK clients
1 parent cd4514c commit 8c43ce1

File tree

4 files changed

+63
-4
lines changed

4 files changed

+63
-4
lines changed

pkg/aws/aws_config.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ package aws
22

33
import (
44
"context"
5+
"net/http"
6+
"time"
7+
58
"github.com/aws/aws-sdk-go-v2/aws"
69
awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
710
"github.com/aws/aws-sdk-go-v2/aws/ratelimit"
@@ -16,8 +19,15 @@ import (
1619

1720
const (
1821
userAgent = "elbv2.k8s.aws"
22+
// defaultAWSSDKClientTimeout is the timeout for individual HTTP requests made by AWS SDK clients.
23+
defaultAWSSDKClientTimeout = 10 * time.Second
1924
)
2025

26+
// newDefaultHTTPClient returns an http.Client with the standard AWS SDK timeout.
27+
func newDefaultHTTPClient() *http.Client {
28+
return &http.Client{Timeout: defaultAWSSDKClientTimeout}
29+
}
30+
2131
func NewAWSConfigGenerator(cfg CloudConfig, ec2IMDSEndpointMode imds.EndpointModeState, metricsCollector *awsmetrics.Collector) AWSConfigGenerator {
2232
return &awsConfigGeneratorImpl{
2333
cfg: cfg,
@@ -42,6 +52,7 @@ func (gen *awsConfigGeneratorImpl) GenerateAWSConfig(optFns ...func(*config.Load
4252

4353
defaultOpts := []func(*config.LoadOptions) error{
4454
config.WithRegion(gen.cfg.Region),
55+
config.WithHTTPClient(newDefaultHTTPClient()),
4556
config.WithRetryer(func() aws.Retryer {
4657
return retry.NewStandard(func(o *retry.StandardOptions) {
4758
o.RateLimiter = ratelimit.None

pkg/aws/aws_config_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package aws
2+
3+
import (
4+
"net/http"
5+
"testing"
6+
7+
"github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func Test_GenerateAWSConfig_SetsHTTPClientTimeout(t *testing.T) {
13+
gen := NewAWSConfigGenerator(CloudConfig{
14+
Region: "us-west-2",
15+
MaxRetries: 3,
16+
}, imds.EndpointModeStateIPv4, nil)
17+
18+
cfg, err := gen.GenerateAWSConfig()
19+
require.NoError(t, err)
20+
require.NotNil(t, cfg.HTTPClient)
21+
22+
httpClient, ok := cfg.HTTPClient.(*http.Client)
23+
require.True(t, ok, "HTTPClient should be *http.Client")
24+
assert.Equal(t, defaultAWSSDKClientTimeout, httpClient.Timeout)
25+
}

pkg/aws/cloud.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ func NewCloud(cfg CloudConfig, clusterName string, metricsCollector *aws_metrics
5353
ec2IMDSEndpointMode = imds.EndpointModeStateIPv4
5454
}
5555
endpointsResolver := epresolver.NewResolver(cfg.AWSEndpoints)
56-
ec2MetadataCfg, err := config.LoadDefaultConfig(context.TODO(),
57-
config.WithRetryMaxAttempts(cfg.MaxRetries),
58-
config.WithEC2IMDSEndpointMode(ec2IMDSEndpointMode),
59-
)
56+
ec2MetadataCfg, err := buildEC2MetadataConfig(cfg.MaxRetries, ec2IMDSEndpointMode)
57+
if err != nil {
58+
return nil, errors.Wrap(err, "failed to build EC2 metadata config")
59+
}
6060
ec2Metadata := services.NewEC2Metadata(ec2MetadataCfg, endpointsResolver)
6161

6262
if len(cfg.Region) == 0 {
@@ -314,3 +314,11 @@ func (c *defaultCloud) Region() string {
314314
func (c *defaultCloud) VpcID() string {
315315
return c.cfg.VpcID
316316
}
317+
318+
func buildEC2MetadataConfig(maxRetries int, ec2IMDSEndpointMode imds.EndpointModeState) (aws.Config, error) {
319+
return config.LoadDefaultConfig(context.TODO(),
320+
config.WithHTTPClient(newDefaultHTTPClient()),
321+
config.WithRetryMaxAttempts(maxRetries),
322+
config.WithEC2IMDSEndpointMode(ec2IMDSEndpointMode),
323+
)
324+
}

pkg/aws/cloud_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ package aws
33
import (
44
"context"
55
"fmt"
6+
"net/http"
67
"testing"
78

89
"github.com/aws/aws-sdk-go-v2/aws"
10+
"github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
911
"github.com/aws/aws-sdk-go-v2/service/ec2"
1012
ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types"
1113
"github.com/golang/mock/gomock"
1214
"github.com/stretchr/testify/assert"
15+
"github.com/stretchr/testify/require"
1316
"sigs.k8s.io/aws-load-balancer-controller/pkg/aws/services"
1417
ctrl "sigs.k8s.io/controller-runtime"
1518
)
@@ -136,3 +139,15 @@ func Test_getVpcID(t *testing.T) {
136139
})
137140
}
138141
}
142+
143+
func Test_buildEC2MetadataConfig_SetsHTTPClientTimeout(t *testing.T) {
144+
t.Setenv("AWS_REGION", "us-west-2")
145+
t.Setenv("AWS_DEFAULT_REGION", "us-west-2")
146+
cfg, err := buildEC2MetadataConfig(3, imds.EndpointModeStateIPv4)
147+
assert.NoError(t, err)
148+
assert.NotNil(t, cfg.HTTPClient)
149+
150+
httpClient, ok := cfg.HTTPClient.(*http.Client)
151+
require.True(t, ok, "HTTPClient should be *http.Client")
152+
assert.Equal(t, defaultAWSSDKClientTimeout, httpClient.Timeout)
153+
}

0 commit comments

Comments
 (0)