use describeInstanceHealth api

This commit is contained in:
Bronson Mirafuentes 2021-12-08 10:20:30 -08:00
parent e27d726fe5
commit 6e93352459
1 changed files with 28 additions and 15 deletions

View File

@ -115,6 +115,8 @@ const (
WellKnownAccountUbuntu = "099720109477" WellKnownAccountUbuntu = "099720109477"
) )
const instanceInServiceState = "InService"
// AWSErrCodeInvalidAction is returned in AWS partitions that don't support certain actions // AWSErrCodeInvalidAction is returned in AWS partitions that don't support certain actions
const AWSErrCodeInvalidAction = "InvalidAction" const AWSErrCodeInvalidAction = "InvalidAction"
@ -585,25 +587,36 @@ func deregisterInstanceFromClassicLoadBalancer(c AWSCloud, i *cloudinstances.Clo
// there will always be only one ASG in the DescribeAutoScalingGroups response. // there will always be only one ASG in the DescribeAutoScalingGroups response.
loadBalancerNames := asgDetails.AutoScalingGroups[0].LoadBalancerNames loadBalancerNames := asgDetails.AutoScalingGroups[0].LoadBalancerNames
klog.Infof("Deregistering instance from classic loadBalancers: %v", aws.StringValueSlice(loadBalancerNames))
for { for {
instanceDraining := false instanceDraining := false
response, err := c.ELB().DescribeLoadBalancers(&elb.DescribeLoadBalancersInput{ for _, loadBalancerName := range loadBalancerNames {
LoadBalancerNames: loadBalancerNames, response, err := c.ELB().DescribeInstanceHealth(&elb.DescribeInstanceHealthInput{
}) LoadBalancerName: loadBalancerName,
Instances: []*elb.Instance{{
InstanceId: aws.String(i.ID),
}},
})
if err != nil { if err != nil {
return fmt.Errorf("error describing load balancers %v: %v", loadBalancerNames, err) return fmt.Errorf("error describing instance health: %v", err)
} }
for _, awsLb := range response.LoadBalancerDescriptions { // describeInstanceHealth can return an empty list if the instance was already terminated.
for _, instance := range awsLb.Instances { if len(response.InstanceStates) == 0 {
if aws.StringValue(instance.InstanceId) == i.ID { continue
c.ELB().DeregisterInstancesFromLoadBalancer(&elb.DeregisterInstancesFromLoadBalancerInput{ }
LoadBalancerName: awsLb.LoadBalancerName,
Instances: []*elb.Instance{instance}, // there will be only one instance in the DescribeInstanceHealth response.
}) if aws.StringValue(response.InstanceStates[0].State) == instanceInServiceState {
instanceDraining = true c.ELB().DeregisterInstancesFromLoadBalancer(&elb.DeregisterInstancesFromLoadBalancerInput{
} LoadBalancerName: loadBalancerName,
Instances: []*elb.Instance{{
InstanceId: aws.String(i.ID),
}},
})
instanceDraining = true
} }
} }