Skip to content

Commit 18019d0

Browse files
authored
Query IMDS over IPv6 if no IPv4 interface address (#2453)
1 parent ff56785 commit 18019d0

File tree

1 file changed

+30
-3
lines changed

1 file changed

+30
-3
lines changed

pkg/aws/cloud.go

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package aws
22

33
import (
4+
"net"
5+
"os"
6+
"strings"
7+
48
"github.com/aws/aws-sdk-go/aws"
59
"github.com/aws/aws-sdk-go/aws/endpoints"
610
"github.com/aws/aws-sdk-go/aws/session"
711
"github.com/pkg/errors"
812
"github.com/prometheus/client_golang/prometheus"
9-
"os"
1013
epresolver "sigs.k8s.io/aws-load-balancer-controller/pkg/aws/endpoints"
1114
"sigs.k8s.io/aws-load-balancer-controller/pkg/aws/metrics"
1215
"sigs.k8s.io/aws-load-balancer-controller/pkg/aws/services"
@@ -44,9 +47,28 @@ type Cloud interface {
4447

4548
// NewCloud constructs new Cloud implementation.
4649
func NewCloud(cfg CloudConfig, metricsRegisterer prometheus.Registerer) (Cloud, error) {
50+
hasIPv4 := true
51+
addrs, err := net.InterfaceAddrs()
52+
if err == nil {
53+
hasIPv4 = false
54+
for _, addr := range addrs {
55+
str := addr.String()
56+
if !strings.HasPrefix(str, "127.") && !strings.Contains(str, ":") {
57+
hasIPv4 = true
58+
break
59+
}
60+
}
61+
}
62+
4763
endpointsResolver := epresolver.NewResolver(cfg.AWSEndpoints)
4864
metadataCFG := aws.NewConfig().WithEndpointResolver(endpointsResolver)
49-
metadataSess := session.Must(session.NewSession(metadataCFG))
65+
opts := session.Options{}
66+
opts.Config.MergeIn(metadataCFG)
67+
if !hasIPv4 {
68+
opts.EC2IMDSEndpointMode = endpoints.EC2IMDSEndpointModeStateIPv6
69+
}
70+
71+
metadataSess := session.Must(session.NewSessionWithOptions(opts))
5072
metadata := services.NewEC2Metadata(metadataSess)
5173
if len(cfg.VpcID) == 0 {
5274
vpcId, err := metadata.VpcID()
@@ -72,7 +94,12 @@ func NewCloud(cfg CloudConfig, metricsRegisterer prometheus.Registerer) (Cloud,
7294
cfg.Region = region
7395
}
7496
awsCFG := aws.NewConfig().WithRegion(cfg.Region).WithSTSRegionalEndpoint(endpoints.RegionalSTSEndpoint).WithMaxRetries(cfg.MaxRetries).WithEndpointResolver(endpointsResolver)
75-
sess := session.Must(session.NewSession(awsCFG))
97+
opts = session.Options{}
98+
opts.Config.MergeIn(awsCFG)
99+
if !hasIPv4 {
100+
opts.EC2IMDSEndpointMode = endpoints.EC2IMDSEndpointModeStateIPv6
101+
}
102+
sess := session.Must(session.NewSessionWithOptions(opts))
76103
injectUserAgent(&sess.Handlers)
77104

78105
if cfg.ThrottleConfig != nil {

0 commit comments

Comments
 (0)