Skip to content

Commit fb1f93b

Browse files
authored
Merge pull request #2824 from olemarkus/vpc-from-nodename
Retrieve VPC ID from EC2 instance the controller is running on if possible
2 parents d982f5c + 882a301 commit fb1f93b

File tree

1 file changed

+50
-8
lines changed

1 file changed

+50
-8
lines changed

pkg/aws/cloud.go

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
package aws
22

33
import (
4+
"fmt"
45
"net"
56
"os"
67
"strings"
78

89
"github.com/aws/aws-sdk-go/aws"
910
"github.com/aws/aws-sdk-go/aws/endpoints"
1011
"github.com/aws/aws-sdk-go/aws/session"
12+
"github.com/aws/aws-sdk-go/service/ec2"
1113
"github.com/pkg/errors"
1214
"github.com/prometheus/client_golang/prometheus"
15+
amerrors "k8s.io/apimachinery/pkg/util/errors"
1316
epresolver "sigs.k8s.io/aws-load-balancer-controller/pkg/aws/endpoints"
1417
"sigs.k8s.io/aws-load-balancer-controller/pkg/aws/metrics"
1518
"sigs.k8s.io/aws-load-balancer-controller/pkg/aws/services"
@@ -70,13 +73,6 @@ func NewCloud(cfg CloudConfig, metricsRegisterer prometheus.Registerer) (Cloud,
7073

7174
metadataSess := session.Must(session.NewSessionWithOptions(opts))
7275
metadata := services.NewEC2Metadata(metadataSess)
73-
if len(cfg.VpcID) == 0 {
74-
vpcId, err := metadata.VpcID()
75-
if err != nil {
76-
return nil, errors.Wrap(err, "failed to introspect vpcID from EC2Metadata, specify --aws-vpc-id instead if EC2Metadata is unavailable")
77-
}
78-
cfg.VpcID = vpcId
79-
}
8076

8177
if len(cfg.Region) == 0 {
8278
region := os.Getenv("AWS_DEFAULT_REGION")
@@ -114,9 +110,19 @@ func NewCloud(cfg CloudConfig, metricsRegisterer prometheus.Registerer) (Cloud,
114110
metricsCollector.InjectHandlers(&sess.Handlers)
115111
}
116112

113+
ec2Service := services.NewEC2(sess)
114+
115+
if len(cfg.VpcID) == 0 {
116+
vpcID, err := inferVPCID(metadata, ec2Service)
117+
if err != nil {
118+
return nil, errors.Wrap(err, "failed to introspect vpcID from EC2Metadata or Node name, specify --aws-vpc-id instead if EC2Metadata is unavailable")
119+
}
120+
cfg.VpcID = vpcID
121+
}
122+
117123
return &defaultCloud{
118124
cfg: cfg,
119-
ec2: services.NewEC2(sess),
125+
ec2: ec2Service,
120126
elbv2: services.NewELBV2(sess),
121127
acm: services.NewACM(sess),
122128
wafv2: services.NewWAFv2(sess),
@@ -126,6 +132,42 @@ func NewCloud(cfg CloudConfig, metricsRegisterer prometheus.Registerer) (Cloud,
126132
}, nil
127133
}
128134

135+
func inferVPCID(metadata services.EC2Metadata, ec2Service services.EC2) (string, error) {
136+
var errList []error
137+
vpcId, err := metadata.VpcID()
138+
if err == nil {
139+
return vpcId, nil
140+
} else {
141+
errList = append(errList, errors.Wrap(err, "failed to fetch VPC ID from instance metadata"))
142+
}
143+
144+
nodeName := os.Getenv("NODENAME")
145+
if strings.HasPrefix(nodeName, "i-") {
146+
output, err := ec2Service.DescribeInstances(&ec2.DescribeInstancesInput{
147+
InstanceIds: []*string{&nodeName},
148+
})
149+
if err != nil {
150+
errList = append(errList, errors.Wrapf(err, "failed to describe instance %q", nodeName))
151+
return "", amerrors.NewAggregate(errList)
152+
}
153+
if len(output.Reservations) != 1 {
154+
errList = append(errList, fmt.Errorf("found more than one reservation for instance %q", nodeName))
155+
return "", amerrors.NewAggregate(errList)
156+
}
157+
if len(output.Reservations[0].Instances) != 1 {
158+
errList = append(errList, fmt.Errorf("found more than one instance with instance ID %q", nodeName))
159+
return "", amerrors.NewAggregate(errList)
160+
}
161+
162+
vpcID := output.Reservations[0].Instances[0].VpcId
163+
if vpcID != nil {
164+
return *vpcID, nil
165+
}
166+
167+
}
168+
return "", amerrors.NewAggregate(errList)
169+
}
170+
129171
var _ Cloud = &defaultCloud{}
130172

131173
type defaultCloud struct {

0 commit comments

Comments
 (0)