in infra/modules/lambda/ecs-scaledown-lambda/index.py [0:0]
def checkContainerInstanceTaskStatus(Ec2InstanceId):
containerInstanceId = None
clusterName = None
tmpMsgAppend = None
# Describe instance attributes and get the Clustername from userdata section which would have set ECS_CLUSTER name
ec2Resp = ec2Client.describe_instance_attribute(InstanceId=Ec2InstanceId, Attribute='userData')
userdataEncoded = ec2Resp['UserData']
userdataDecoded = base64.b64decode(userdataEncoded['Value'])
logger.debug("Describe instance attributes response %s", ec2Resp)
tmpList = userdataDecoded.split()
for token in tmpList:
if token.find("ECS_CLUSTER") > -1:
# Split and get the cluster name
clusterName = token.split('=')[1]
logger.info("Cluster name %s",clusterName)
# Get list of container instance IDs from the clusterName
clusterListResp = ecsClient.list_container_instances(cluster=clusterName)
containerDetResp = ecsClient.describe_container_instances(cluster=clusterName, containerInstances=clusterListResp[
'containerInstanceArns'])
logger.debug("describe container instances response %s",containerDetResp)
for containerInstances in containerDetResp['containerInstances']:
logger.debug("Container Instance ARN: %s and ec2 Instance ID %s",containerInstances['containerInstanceArn'],
containerInstances['ec2InstanceId'])
if containerInstances['ec2InstanceId'] == Ec2InstanceId:
logger.info("Container instance ID of interest : %s",containerInstances['containerInstanceArn'])
containerInstanceId = containerInstances['containerInstanceArn']
# Check if the instance state is set to DRAINING. If not, set it, so the ECS Cluster will handle de-registering instance, draining tasks and draining them
containerStatus = containerInstances['status']
if containerStatus == 'DRAINING':
logger.info("Container ID %s with EC2 instance-id %s is draining tasks",containerInstanceId,
Ec2InstanceId)
tmpMsgAppend = {"containerInstanceId": containerInstanceId}
else:
# Make ECS API call to set the container status to DRAINING
logger.info("Make ECS API call to set the container status to DRAINING...")
ecsResponse = ecsClient.update_container_instances_state(cluster=clusterName,containerInstances=[containerInstanceId],status='DRAINING')
# When you set instance state to draining, append the containerInstanceID to the message as well
tmpMsgAppend = {"containerInstanceId": containerInstanceId}
# Using container Instance ID, get the task list, and task running on that instance.
if containerInstanceId != None:
# List tasks on the container instance ID, to get task Arns
listTaskResp = ecsClient.list_tasks(cluster=clusterName, containerInstance=containerInstanceId)
logger.debug("Container instance task list %s",listTaskResp['taskArns'])
# If the chosen instance has tasks
if len(listTaskResp['taskArns']) > 0:
logger.info("Tasks are on this instance...%s",Ec2InstanceId)
return 1, tmpMsgAppend
else:
logger.info("NO tasks are on this instance...%s",Ec2InstanceId)
return 0, tmpMsgAppend
else:
logger.info("NO tasks are on this instance....%s",Ec2InstanceId)
return 0, tmpMsgAppend