Skip to content

Commit e349279

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

File tree

4 files changed

+60
-4
lines changed

4 files changed

+60
-4
lines changed

pkg/aws/aws_config.go

Lines changed: 8 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,6 +19,8 @@ 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

2126
func NewAWSConfigGenerator(cfg CloudConfig, ec2IMDSEndpointMode imds.EndpointModeState, metricsCollector *awsmetrics.Collector) AWSConfigGenerator {
@@ -42,6 +47,9 @@ func (gen *awsConfigGeneratorImpl) GenerateAWSConfig(optFns ...func(*config.Load
4247

4348
defaultOpts := []func(*config.LoadOptions) error{
4449
config.WithRegion(gen.cfg.Region),
50+
config.WithHTTPClient(&http.Client{
51+
Timeout: defaultAWSSDKClientTimeout,
52+
}),
4553
config.WithRetryer(func() aws.Retryer {
4654
return retry.NewStandard(func(o *retry.StandardOptions) {
4755
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: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"k8s.io/apimachinery/pkg/util/cache"
77
"net"
8+
"net/http"
89
"os"
910
"strings"
1011
"sync"
@@ -53,10 +54,10 @@ func NewCloud(cfg CloudConfig, clusterName string, metricsCollector *aws_metrics
5354
ec2IMDSEndpointMode = imds.EndpointModeStateIPv4
5455
}
5556
endpointsResolver := epresolver.NewResolver(cfg.AWSEndpoints)
56-
ec2MetadataCfg, err := config.LoadDefaultConfig(context.TODO(),
57-
config.WithRetryMaxAttempts(cfg.MaxRetries),
58-
config.WithEC2IMDSEndpointMode(ec2IMDSEndpointMode),
59-
)
57+
ec2MetadataCfg, err := buildEC2MetadataConfig(cfg.MaxRetries, ec2IMDSEndpointMode)
58+
if err != nil {
59+
return nil, errors.Wrap(err, "failed to build EC2 metadata config")
60+
}
6061
ec2Metadata := services.NewEC2Metadata(ec2MetadataCfg, endpointsResolver)
6162

6263
if len(cfg.Region) == 0 {
@@ -314,3 +315,13 @@ func (c *defaultCloud) Region() string {
314315
func (c *defaultCloud) VpcID() string {
315316
return c.cfg.VpcID
316317
}
318+
319+
func buildEC2MetadataConfig(maxRetries int, ec2IMDSEndpointMode imds.EndpointModeState) (aws.Config, error) {
320+
return config.LoadDefaultConfig(context.TODO(),
321+
config.WithHTTPClient(&http.Client{
322+
Timeout: defaultAWSSDKClientTimeout,
323+
}),
324+
config.WithRetryMaxAttempts(maxRetries),
325+
config.WithEC2IMDSEndpointMode(ec2IMDSEndpointMode),
326+
)
327+
}

pkg/aws/cloud_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ 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"
@@ -136,3 +138,13 @@ func Test_getVpcID(t *testing.T) {
136138
})
137139
}
138140
}
141+
142+
func Test_buildEC2MetadataConfig_SetsHTTPClientTimeout(t *testing.T) {
143+
cfg, err := buildEC2MetadataConfig(3, imds.EndpointModeStateIPv4)
144+
assert.NoError(t, err)
145+
assert.NotNil(t, cfg.HTTPClient)
146+
147+
httpClient, ok := cfg.HTTPClient.(*http.Client)
148+
assert.True(t, ok, "HTTPClient should be *http.Client")
149+
assert.Equal(t, defaultAWSSDKClientTimeout, httpClient.Timeout)
150+
}

0 commit comments

Comments
 (0)