Skip to content

Commit 7c2d0b5

Browse files
committed
Allow garbage collector to delete ec2 instances
Signed-off-by: Vince Prignano <[email protected]>
1 parent 0abb2b0 commit 7c2d0b5

File tree

4 files changed

+44
-0
lines changed

4 files changed

+44
-0
lines changed

api/v1beta2/types.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ const (
8383
type GCTask string
8484

8585
var (
86+
// GCTaskEC2Instance defines a task to cleaning up resources for AWS EC2 instances.
87+
GCTaskEC2Instance = GCTask("instance")
88+
8689
// GCTaskLoadBalancer defines a task to cleaning up resources for AWS load balancers.
8790
GCTaskLoadBalancer = GCTask("load-balancer")
8891

pkg/cloud/services/gc/cleanup.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ func (s *Service) deleteResources(ctx context.Context) error {
7272

7373
if val, found := annotations.Get(s.scope.InfraCluster(), infrav1.ExternalResourceGCTasksAnnotation); found {
7474
var gcTaskToFunc = map[infrav1.GCTask]ResourceCleanupFunc{
75+
infrav1.GCTaskEC2Instance: s.deleteEC2Instances,
7576
infrav1.GCTaskLoadBalancer: s.deleteLoadBalancers,
7677
infrav1.GCTaskTargetGroup: s.deleteTargetGroups,
7778
infrav1.GCTaskSecurityGroup: s.deleteSecurityGroups,

pkg/cloud/services/gc/ec2.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,45 @@ import (
2828
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/filter"
2929
)
3030

31+
func (s *Service) deleteEC2Instances(ctx context.Context, resources []*AWSResource) error {
32+
for _, resource := range resources {
33+
if !s.isEC2InstanceToDelete(resource) {
34+
s.scope.Debug("Resource not an EC2 instance for deletion", "arn", resource.ARN.String())
35+
continue
36+
}
37+
38+
instanceID := strings.ReplaceAll(resource.ARN.Resource, "instance/", "")
39+
if err := s.deleteEC2Instance(ctx, instanceID); err != nil {
40+
return fmt.Errorf("deleting EC2 instance %s: %w", instanceID, err)
41+
}
42+
}
43+
s.scope.Debug("Finished processing resources for EC2 instance deletion")
44+
45+
return nil
46+
}
47+
48+
func (s *Service) isEC2InstanceToDelete(resource *AWSResource) bool {
49+
if !s.isMatchingResource(resource, ec2.ServiceName, "instance") {
50+
return false
51+
}
52+
if eksClusterName := resource.Tags[eksClusterNameTag]; eksClusterName != "" {
53+
s.scope.Debug("EC2 instance was created by EKS directly", "arn", resource.ARN.String(), "check", "instance", "cluster_name", eksClusterName)
54+
return false
55+
}
56+
s.scope.Debug("Resource is an EC2 instance to delete", "arn", resource.ARN.String(), "check", "instance")
57+
return true
58+
}
59+
60+
func (s *Service) deleteEC2Instance(ctx context.Context, instanceID string) error {
61+
input := ec2.TerminateInstancesInput{
62+
InstanceIds: []*string{aws.String(instanceID)},
63+
}
64+
if _, err := s.ec2Client.TerminateInstancesWithContext(ctx, &input); err != nil {
65+
return fmt.Errorf("terminating EC2 instance: %w", err)
66+
}
67+
return nil
68+
}
69+
3170
func (s *Service) deleteSecurityGroups(ctx context.Context, resources []*AWSResource) error {
3271
for _, resource := range resources {
3372
if !s.isSecurityGroupToDelete(resource) {

pkg/cloud/services/gc/service.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ func NewService(clusterScope cloud.ClusterScoper, opts ...ServiceOption) *Servic
6262

6363
func addDefaultCleanupFuncs(s *Service) {
6464
s.cleanupFuncs = []ResourceCleanupFunc{
65+
s.deleteEC2Instances,
6566
s.deleteLoadBalancers,
6667
s.deleteTargetGroups,
6768
s.deleteSecurityGroups,

0 commit comments

Comments
 (0)