aws: Terminate ASG instances in batches of 100 instances

This commit is contained in:
Ciprian Hacman 2024-01-13 11:00:46 +02:00
parent baf021b484
commit d71879f023
1 changed files with 27 additions and 22 deletions

View File

@ -318,24 +318,28 @@ func matchesIAMTags(tags map[string]string, actual []*iam.Tag) bool {
return true return true
} }
//type DeletableResource interface { func DeleteInstances(cloud fi.Cloud, t []*resources.Resource) error {
// Delete(cloud fi.Cloud) error
//}
func DeleteInstance(cloud fi.Cloud, t *resources.Resource) error {
c := cloud.(awsup.AWSCloud) c := cloud.(awsup.AWSCloud)
id := t.ID var ids []*string
klog.V(2).Infof("Deleting EC2 instance %q", id) for i, instance := range t {
request := &ec2.TerminateInstancesInput{ ids = append(ids, &instance.ID)
InstanceIds: []*string{&id}, if len(ids) < 100 && i < len(t)-1 {
} continue
_, err := c.EC2().TerminateInstances(request) }
if err != nil {
if awsup.AWSErrorCode(err) == "InvalidInstanceID.NotFound" { klog.Infof("Terminating %d EC2 instances", len(ids))
klog.V(2).Infof("Got InvalidInstanceID.NotFound error deleting instance %q; will treat as already-deleted", id) request := &ec2.TerminateInstancesInput{
} else { InstanceIds: ids,
return fmt.Errorf("error deleting Instance %q: %v", id, err) }
ids = []*string{}
_, err := c.EC2().TerminateInstances(request)
if err != nil {
if awsup.AWSErrorCode(err) == "InvalidInstanceID.NotFound" {
klog.V(2).Infof("Got InvalidInstanceID.NotFound error terminating instances; will treat as already terminated")
} else {
return fmt.Errorf("error terminating instances: %v", err)
}
} }
} }
return nil return nil
@ -360,12 +364,13 @@ func ListInstances(cloud fi.Cloud, vpcID, clusterName string) ([]*resources.Reso
id := aws.StringValue(instance.InstanceId) id := aws.StringValue(instance.InstanceId)
resourceTracker := &resources.Resource{ resourceTracker := &resources.Resource{
Name: FindName(instance.Tags), Name: FindName(instance.Tags),
ID: id, ID: id,
Type: ec2.ResourceTypeInstance, Type: ec2.ResourceTypeInstance,
Deleter: DeleteInstance, GroupDeleter: DeleteInstances,
Dumper: DumpInstance, GroupKey: fi.ValueOf(instance.SubnetId),
Obj: instance, Dumper: DumpInstance,
Obj: instance,
} }
var blocks []string var blocks []string