@@ -535,8 +535,8 @@ func (p awsProvider) TerminateResources(resources *types.ResourceContainer) []er
535535 log .Debug ("[AWS] Delete resources" )
536536 elbClients := p .getElbClientsByRegion ()
537537 ec2Clients , _ := p .getEc2AndCTClientsByRegion ()
538+ deleteLoadBalancersErr := deleteLoadBalancers (elbClients , ec2Clients , resources .Get (p .GetCloudType ()))
538539 deleteVpcsErr := deleteVpcs (ec2Clients , resources .Get (p .GetCloudType ()))
539- deleteLoadBalancersErr := deleteLoadBalancers (elbClients , resources .Get (p .GetCloudType ()))
540540 return append (deleteVpcsErr , deleteLoadBalancersErr ... )
541541}
542542
@@ -580,7 +580,7 @@ func deleteVpcs(ec2Clients map[string]ec2Client, resources []*types.Resource) []
580580 return errs
581581}
582582
583- func deleteLoadBalancers (elbClients map [string ]elbClient , resources []* types.Resource ) []error {
583+ func deleteLoadBalancers (elbClients map [string ]elbClient , ec2Clients map [ string ] ec2Client , resources []* types.Resource ) []error {
584584 regionLoadBalancers := map [string ][]* types.Resource {}
585585 for _ , resource := range resources {
586586 if resource .ResourceType == types .LoadBalancer {
@@ -593,7 +593,7 @@ func deleteLoadBalancers(elbClients map[string]elbClient, resources []*types.Res
593593 wg .Add (len (regionLoadBalancers ))
594594
595595 for r , lb := range regionLoadBalancers {
596- go func (region string , elbClient elbClient , loadBalancers []* types.Resource ) {
596+ go func (region string , elbClient elbClient , ec2Client ec2Client , loadBalancers []* types.Resource ) {
597597 defer wg .Done ()
598598 for _ , loadBalancer := range loadBalancers {
599599 if ctx .DryRun {
@@ -603,6 +603,23 @@ func deleteLoadBalancers(elbClients map[string]elbClient, resources []*types.Res
603603 if elbExistsErr != nil {
604604 errChan <- elbExistsErr
605605 } else if elbExists {
606+ log .Infof ("[AWS] Deleting endpoint services of load balancer: %s in region: %s" , loadBalancer .ID , region )
607+ endpointServices , err := ec2Client .DescribeVpcEndpointServiceConfigurations (& ec2.DescribeVpcEndpointServiceConfigurationsInput {})
608+ if err != nil {
609+ log .Errorf ("[AWS] Failed to list endpoint services of load balancer: %s, err: %s" , loadBalancer .ID , err )
610+ errChan <- err
611+ }
612+ for _ , endpointService := range endpointServices .ServiceConfigurations {
613+ if containsID (endpointService .NetworkLoadBalancerArns , & loadBalancer .ID ) {
614+ _ , err = ec2Client .DeleteVpcEndpointServiceConfigurations (& ec2.DeleteVpcEndpointServiceConfigurationsInput {
615+ ServiceIds : []* string {endpointService .ServiceId },
616+ })
617+ if err != nil {
618+ log .Errorf ("[AWS] Failed to delete endpoint service: %s, err: %s" , * endpointService .ServiceId , err )
619+ errChan <- err
620+ }
621+ }
622+ }
606623 deleteErr := deleteLoadBalancer (elbClient , "N/A" , loadBalancer .ID , region )
607624 if deleteErr != nil {
608625 errChan <- deleteErr
@@ -612,7 +629,7 @@ func deleteLoadBalancers(elbClients map[string]elbClient, resources []*types.Res
612629 }
613630 }
614631 }
615- }(r , elbClients [r ], lb )
632+ }(r , elbClients [r ], ec2Clients [ r ], lb )
616633 }
617634
618635 go func () {
@@ -711,7 +728,7 @@ func (p awsProvider) StopInstances(instances *types.InstanceContainer) []error {
711728 for _ , inst := range instanceChunk {
712729 if inst .Ephemeral {
713730 // could be that the instance is already removed due to failed suspend API call
714- if containsInstanceID (instanceIDs , & inst .ID ) {
731+ if containsID (instanceIDs , & inst .ID ) {
715732 log .Infof ("[AWS] Spot instance will be terminated: %s:%s" , inst .ID , instIDNames [inst .ID ])
716733 spotInstanceIDs = append (spotInstanceIDs , & inst .ID )
717734 instanceIDs = removeInstance (instanceIDs , & inst .ID )
@@ -1094,6 +1111,56 @@ func deleteVpcWithDependencies(ec2Client ec2Client, stackName string, vpcId stri
10941111 }
10951112 }
10961113
1114+ log .Infof ("[AWS] Deleting NAT gateways of VPC: %s in stack: %s, region: %s" , vpcId , stackName , region )
1115+
1116+ natGateways , err := ec2Client .DescribeNatGateways (& ec2.DescribeNatGatewaysInput {
1117+ Filter : []* ec2.Filter {vpcIdFilter },
1118+ })
1119+
1120+ if err != nil {
1121+ log .Errorf ("[AWS] Failed to list NAT gateways of VPC: %s in stack: %s, err: %s" , vpcId , stackName , err )
1122+ return err
1123+ }
1124+ for _ , natGateway := range natGateways .NatGateways {
1125+ _ , err = ec2Client .DeleteNatGateway (& ec2.DeleteNatGatewayInput {
1126+ NatGatewayId : natGateway .NatGatewayId ,
1127+ })
1128+ if err != nil {
1129+ log .Errorf ("[AWS] Failed to delete NAT gateway: %s in stack: %s, err: %s" , * natGateway .NatGatewayId , stackName , err )
1130+ return err
1131+ }
1132+ }
1133+
1134+ log .Infof ("[AWS] Deleting network interface IDs of VPC: %s in stack: %s, region: %s" , vpcId , stackName , region )
1135+
1136+ networkInterfaceIds , err := ec2Client .DescribeNetworkInterfaces (& ec2.DescribeNetworkInterfacesInput {
1137+ Filters : []* ec2.Filter {vpcIdFilter },
1138+ })
1139+
1140+ if err != nil {
1141+ log .Errorf ("[AWS] Failed to list network interface IDs of VPC: %s in stack: %s, err: %s" , vpcId , stackName , err )
1142+ return err
1143+ }
1144+ for _ , eni := range networkInterfaceIds .NetworkInterfaces {
1145+ if eni .Attachment != nil && eni .Attachment .AttachmentId != nil {
1146+ _ , err = ec2Client .DetachNetworkInterface (& ec2.DetachNetworkInterfaceInput {
1147+ AttachmentId : eni .Attachment .AttachmentId ,
1148+ Force : aws .Bool (true ),
1149+ })
1150+ if err != nil {
1151+ log .Errorf ("[AWS] Failed to detach network interface ID: %s in stack: %s, err: %s" , * eni .NetworkInterfaceId , stackName , err )
1152+ return err
1153+ }
1154+ }
1155+ _ , err = ec2Client .DeleteNetworkInterface (& ec2.DeleteNetworkInterfaceInput {
1156+ NetworkInterfaceId : eni .NetworkInterfaceId ,
1157+ })
1158+ if err != nil {
1159+ log .Errorf ("[AWS] Failed to delete network interface ID: %s in stack: %s, err: %s" , * eni .NetworkInterfaceId , stackName , err )
1160+ return err
1161+ }
1162+ }
1163+
10971164 log .Infof ("[AWS] Deleting internet gateways of VPC: %s in stack: %s, region: %s" , vpcId , stackName , region )
10981165
10991166 attachmentVpcIdFilter := & ec2.Filter {}
@@ -1126,6 +1193,26 @@ func deleteVpcWithDependencies(ec2Client ec2Client, stackName string, vpcId stri
11261193 }
11271194 }
11281195
1196+ log .Infof ("[AWS] Deleting egress-only internet gateways of VPC: %s in stack: %s, region: %s" , vpcId , stackName , region )
1197+
1198+ eigws , err := ec2Client .DescribeEgressOnlyInternetGateways (& ec2.DescribeEgressOnlyInternetGatewaysInput {
1199+ Filters : []* ec2.Filter {attachmentVpcIdFilter },
1200+ })
1201+ if err != nil {
1202+ log .Errorf ("[AWS] Failed to list egress-only internet gateways of VPC: %s in stack: %s, err: %s" , vpcId , stackName , err )
1203+ return err
1204+ }
1205+
1206+ for _ , eigw := range eigws .EgressOnlyInternetGateways {
1207+ _ , err = ec2Client .DeleteEgressOnlyInternetGateway (& ec2.DeleteEgressOnlyInternetGatewayInput {
1208+ EgressOnlyInternetGatewayId : eigw .EgressOnlyInternetGatewayId ,
1209+ })
1210+ if err != nil {
1211+ log .Errorf ("[AWS] Failed to delete egress-only internet gateway: %s in stack: %s, err: %s" , * eigw .EgressOnlyInternetGatewayId , stackName , err )
1212+ return err
1213+ }
1214+ }
1215+
11291216 log .Infof ("[AWS] Deleting route tables of VPC: %s in stack: %s, region: %s" , vpcId , stackName , region )
11301217
11311218 rts , err := ec2Client .DescribeRouteTables (& ec2.DescribeRouteTablesInput {
@@ -1214,9 +1301,30 @@ func deleteVpcWithDependencies(ec2Client ec2Client, stackName string, vpcId stri
12141301 log .Errorf ("[AWS] Failed to list security groups of VPC: %s in stack: %s, err: %s" , vpcId , stackName , err )
12151302 return err
12161303 }
1304+ for _ , securityGroup := range securityGroups .SecurityGroups {
1305+ if len (securityGroup .IpPermissions ) > 0 {
1306+ _ , err := ec2Client .RevokeSecurityGroupIngress (& ec2.RevokeSecurityGroupIngressInput {
1307+ GroupId : securityGroup .GroupId ,
1308+ IpPermissions : securityGroup .IpPermissions ,
1309+ })
1310+ if err != nil {
1311+ log .Errorf ("[AWS] Failed to revoke ingress rules for security group: %s in stack: %s, err: %s" , * securityGroup .GroupId , stackName , err )
1312+ return err
1313+ }
1314+ }
1315+ if len (securityGroup .IpPermissionsEgress ) > 0 {
1316+ _ , err := ec2Client .RevokeSecurityGroupEgress (& ec2.RevokeSecurityGroupEgressInput {
1317+ GroupId : securityGroup .GroupId ,
1318+ IpPermissions : securityGroup .IpPermissionsEgress ,
1319+ })
1320+ if err != nil {
1321+ log .Errorf ("[AWS] Failed to revoke egress rules for security group: %s in stack: %s, err: %s" , * securityGroup .GroupId , stackName , err )
1322+ return err
1323+ }
1324+ }
1325+ }
12171326 for _ , securityGroup := range securityGroups .SecurityGroups {
12181327 if * securityGroup .GroupName == "default" {
1219- // the default subnet can not be deleted
12201328 continue
12211329 }
12221330 _ , err = ec2Client .DeleteSecurityGroup (& ec2.DeleteSecurityGroupInput {
@@ -1580,24 +1688,35 @@ type ec2Client interface {
15801688 DetachVolume (input * ec2.DetachVolumeInput ) (* ec2.VolumeAttachment , error )
15811689 DescribeVpcs (input * ec2.DescribeVpcsInput ) (* ec2.DescribeVpcsOutput , error )
15821690 DescribeVpcEndpoints (input * ec2.DescribeVpcEndpointsInput ) (* ec2.DescribeVpcEndpointsOutput , error )
1691+ DescribeVpcEndpointServiceConfigurations (input * ec2.DescribeVpcEndpointServiceConfigurationsInput ) (* ec2.DescribeVpcEndpointServiceConfigurationsOutput , error )
15831692 DeleteVpcEndpoints (input * ec2.DeleteVpcEndpointsInput ) (* ec2.DeleteVpcEndpointsOutput , error )
1693+ DeleteVpcEndpointServiceConfigurations (input * ec2.DeleteVpcEndpointServiceConfigurationsInput ) (* ec2.DeleteVpcEndpointServiceConfigurationsOutput , error )
15841694 DeleteVpc (input * ec2.DeleteVpcInput ) (* ec2.DeleteVpcOutput , error )
15851695 DescribeSubnets (input * ec2.DescribeSubnetsInput ) (* ec2.DescribeSubnetsOutput , error )
15861696 DeleteSubnet (input * ec2.DeleteSubnetInput ) (* ec2.DeleteSubnetOutput , error )
15871697 DescribeInternetGateways (input * ec2.DescribeInternetGatewaysInput ) (* ec2.DescribeInternetGatewaysOutput , error )
1698+ DescribeEgressOnlyInternetGateways (input * ec2.DescribeEgressOnlyInternetGatewaysInput ) (* ec2.DescribeEgressOnlyInternetGatewaysOutput , error )
1699+ DescribeNatGateways (input * ec2.DescribeNatGatewaysInput ) (* ec2.DescribeNatGatewaysOutput , error )
1700+ DescribeNetworkInterfaces (input * ec2.DescribeNetworkInterfacesInput ) (* ec2.DescribeNetworkInterfacesOutput , error )
15881701 DetachInternetGateway (input * ec2.DetachInternetGatewayInput ) (* ec2.DetachInternetGatewayOutput , error )
1702+ DetachNetworkInterface (input * ec2.DetachNetworkInterfaceInput ) (* ec2.DetachNetworkInterfaceOutput , error )
15891703 DeleteInternetGateway (input * ec2.DeleteInternetGatewayInput ) (* ec2.DeleteInternetGatewayOutput , error )
1704+ DeleteEgressOnlyInternetGateway (input * ec2.DeleteEgressOnlyInternetGatewayInput ) (* ec2.DeleteEgressOnlyInternetGatewayOutput , error )
15901705 DescribeRouteTables (input * ec2.DescribeRouteTablesInput ) (* ec2.DescribeRouteTablesOutput , error )
15911706 DeleteRouteTable (input * ec2.DeleteRouteTableInput ) (* ec2.DeleteRouteTableOutput , error )
1707+ DeleteNatGateway (input * ec2.DeleteNatGatewayInput ) (* ec2.DeleteNatGatewayOutput , error )
15921708 DescribeNetworkAcls (input * ec2.DescribeNetworkAclsInput ) (* ec2.DescribeNetworkAclsOutput , error )
15931709 DeleteNetworkAcl (input * ec2.DeleteNetworkAclInput ) (* ec2.DeleteNetworkAclOutput , error )
1710+ DeleteNetworkInterface (input * ec2.DeleteNetworkInterfaceInput ) (* ec2.DeleteNetworkInterfaceOutput , error )
15941711 DescribeSecurityGroups (input * ec2.DescribeSecurityGroupsInput ) (* ec2.DescribeSecurityGroupsOutput , error )
15951712 DeleteSecurityGroup (input * ec2.DeleteSecurityGroupInput ) (* ec2.DeleteSecurityGroupOutput , error )
15961713 DisassociateRouteTable (input * ec2.DisassociateRouteTableInput ) (* ec2.DisassociateRouteTableOutput , error )
15971714 TerminateInstances (input * ec2.TerminateInstancesInput ) (* ec2.TerminateInstancesOutput , error )
15981715 WaitUntilInstanceTerminated (input * ec2.DescribeInstancesInput ) error
15991716 DescribeAddresses (input * ec2.DescribeAddressesInput ) (* ec2.DescribeAddressesOutput , error )
16001717 ReleaseAddress (input * ec2.ReleaseAddressInput ) (* ec2.ReleaseAddressOutput , error )
1718+ RevokeSecurityGroupIngress (input * ec2.RevokeSecurityGroupIngressInput ) (* ec2.RevokeSecurityGroupIngressOutput , error )
1719+ RevokeSecurityGroupEgress (input * ec2.RevokeSecurityGroupEgressInput ) (* ec2.RevokeSecurityGroupEgressOutput , error )
16011720}
16021721
16031722type cfClient interface {
@@ -2412,7 +2531,7 @@ func removeInstance(originalIDs []*string, instanceID *string) (instanceIDs []*s
24122531 return
24132532}
24142533
2415- func containsInstanceID (instanceIDs []* string , instanceID * string ) bool {
2534+ func containsID (instanceIDs []* string , instanceID * string ) bool {
24162535 found := false
24172536 for _ , ID := range instanceIDs {
24182537 if * ID == * instanceID {
0 commit comments