Skip to content

Commit 9768ab4

Browse files
authored
Merge pull request #5198 from sl1pm4t/mm/unmanaged-lb-sg-rule
🐛 fix(securitygroups): Look up unmanaged NAT Gateway IPs, so provider doesn't add 0.0.0.0/0 SG rule
2 parents cc7ae37 + eeeb979 commit 9768ab4

File tree

2 files changed

+59
-34
lines changed

2 files changed

+59
-34
lines changed

controllers/awscluster_controller_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -776,6 +776,17 @@ func mockedDeleteInstanceCalls(m *mocks.MockEC2APIMockRecorder) {
776776
}
777777

778778
func mockedVPCCallsForExistingVPCAndSubnets(m *mocks.MockEC2APIMockRecorder) {
779+
m.DescribeNatGatewaysPagesWithContext(context.TODO(), gomock.Eq(&ec2.DescribeNatGatewaysInput{
780+
Filter: []*ec2.Filter{
781+
{
782+
Name: aws.String("vpc-id"),
783+
Values: []*string{aws.String("vpc-exists")},
784+
},
785+
{
786+
Name: aws.String("state"),
787+
Values: aws.StringSlice([]string{ec2.VpcStatePending, ec2.VpcStateAvailable}),
788+
},
789+
}}), gomock.Any()).Return(nil)
779790
m.CreateTagsWithContext(context.TODO(), gomock.Eq(&ec2.CreateTagsInput{
780791
Resources: aws.StringSlice([]string{"subnet-1"}),
781792
Tags: []*ec2.Tag{

pkg/cloud/services/network/natgateways.go

Lines changed: 48 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ import (
4141
func (s *Service) reconcileNatGateways() error {
4242
if s.scope.VPC().IsUnmanaged(s.scope.Name()) {
4343
s.scope.Trace("Skipping NAT gateway reconcile in unmanaged mode")
44+
_, err := s.updateNatGatewayIPs(s.scope.TagUnmanagedNetworkResources())
45+
if err != nil {
46+
return err
47+
}
4448
return nil
4549
}
4650

@@ -66,44 +70,11 @@ func (s *Service) reconcileNatGateways() error {
6670
return nil
6771
}
6872

69-
existing, err := s.describeNatGatewaysBySubnet()
73+
subnetIDs, err := s.updateNatGatewayIPs(true)
7074
if err != nil {
7175
return err
7276
}
7377

74-
natGatewaysIPs := []string{}
75-
subnetIDs := []string{}
76-
77-
for _, sn := range s.scope.Subnets().FilterPublic().FilterNonCni() {
78-
if sn.GetResourceID() == "" {
79-
continue
80-
}
81-
82-
if ngw, ok := existing[sn.GetResourceID()]; ok {
83-
if len(ngw.NatGatewayAddresses) > 0 && ngw.NatGatewayAddresses[0].PublicIp != nil {
84-
natGatewaysIPs = append(natGatewaysIPs, *ngw.NatGatewayAddresses[0].PublicIp)
85-
}
86-
// Make sure tags are up to date.
87-
if err := wait.WaitForWithRetryable(wait.NewBackoff(), func() (bool, error) {
88-
buildParams := s.getNatGatewayTagParams(*ngw.NatGatewayId)
89-
tagsBuilder := tags.New(&buildParams, tags.WithEC2(s.EC2Client))
90-
if err := tagsBuilder.Ensure(converters.TagsToMap(ngw.Tags)); err != nil {
91-
return false, err
92-
}
93-
return true, nil
94-
}, awserrors.ResourceNotFound); err != nil {
95-
record.Warnf(s.scope.InfraCluster(), "FailedTagNATGateway", "Failed to tag managed NAT Gateway %q: %v", *ngw.NatGatewayId, err)
96-
return errors.Wrapf(err, "failed to tag nat gateway %q", *ngw.NatGatewayId)
97-
}
98-
99-
continue
100-
}
101-
102-
subnetIDs = append(subnetIDs, sn.GetResourceID())
103-
}
104-
105-
s.scope.SetNatGatewaysIPs(natGatewaysIPs)
106-
10778
// Batch the creation of NAT gateways
10879
if len(subnetIDs) > 0 {
10980
// set NatGatewayCreationStarted if the condition has never been set before
@@ -133,6 +104,49 @@ func (s *Service) reconcileNatGateways() error {
133104
return nil
134105
}
135106

107+
func (s *Service) updateNatGatewayIPs(updateTags bool) ([]string, error) {
108+
existing, err := s.describeNatGatewaysBySubnet()
109+
if err != nil {
110+
return nil, err
111+
}
112+
113+
natGatewaysIPs := []string{}
114+
subnetIDs := []string{}
115+
116+
for _, sn := range s.scope.Subnets().FilterPublic().FilterNonCni() {
117+
if sn.GetResourceID() == "" {
118+
continue
119+
}
120+
121+
if ngw, ok := existing[sn.GetResourceID()]; ok {
122+
if len(ngw.NatGatewayAddresses) > 0 && ngw.NatGatewayAddresses[0].PublicIp != nil {
123+
natGatewaysIPs = append(natGatewaysIPs, *ngw.NatGatewayAddresses[0].PublicIp)
124+
}
125+
if updateTags {
126+
// Make sure tags are up to date.
127+
if err := wait.WaitForWithRetryable(wait.NewBackoff(), func() (bool, error) {
128+
buildParams := s.getNatGatewayTagParams(*ngw.NatGatewayId)
129+
tagsBuilder := tags.New(&buildParams, tags.WithEC2(s.EC2Client))
130+
if err := tagsBuilder.Ensure(converters.TagsToMap(ngw.Tags)); err != nil {
131+
return false, err
132+
}
133+
return true, nil
134+
}, awserrors.ResourceNotFound); err != nil {
135+
record.Warnf(s.scope.InfraCluster(), "FailedTagNATGateway", "Failed to tag managed NAT Gateway %q: %v", *ngw.NatGatewayId, err)
136+
return nil, errors.Wrapf(err, "failed to tag nat gateway %q", *ngw.NatGatewayId)
137+
}
138+
}
139+
140+
continue
141+
}
142+
143+
subnetIDs = append(subnetIDs, sn.GetResourceID())
144+
}
145+
146+
s.scope.SetNatGatewaysIPs(natGatewaysIPs)
147+
return subnetIDs, nil
148+
}
149+
136150
func (s *Service) deleteNatGateways() error {
137151
if s.scope.VPC().IsUnmanaged(s.scope.Name()) {
138152
s.scope.Trace("Skipping NAT gateway deletion in unmanaged mode")

0 commit comments

Comments
 (0)