1 | #!/bin/sh
|
2 |
|
3 | set -e
|
4 |
|
5 | echo "$(date) Starting task-reaper.sh"
|
6 |
|
7 | INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
|
8 |
|
9 | CLUSTER=$(grep 'ECS_CLUSTER=' /etc/ecs/ecs.config | cut -d '=' -f 2)
|
10 |
|
11 | CONTAINER_INSTANCE_ARN=$(
|
12 | aws ecs list-container-instances \
|
13 | --cluster "$CLUSTER" \
|
14 | --filter "ec2InstanceId == $INSTANCE_ID" |\
|
15 | jq -r '.containerInstanceArns[0]'
|
16 | )
|
17 | CONTAINER_INSTANCE_STATUS=$(
|
18 | aws ecs describe-container-instances \
|
19 | --cluster "$CLUSTER" \
|
20 | --container-instances "$CONTAINER_INSTANCE_ARN" |\
|
21 | jq -r .containerInstances[0].status
|
22 | )
|
23 |
|
24 | if [ "$CONTAINER_INSTANCE_STATUS" = 'ACTIVE' ]; then
|
25 | LIFECYCLE_STATE=$(
|
26 | aws autoscaling describe-auto-scaling-instances \
|
27 | --instance-ids "$INSTANCE_ID" |\
|
28 | jq -r '.AutoScalingInstances[0].LifecycleState'
|
29 | )
|
30 |
|
31 | if [ "$LIFECYCLE_STATE" = 'Terminating:Wait' ]; then
|
32 | echo "Draining ${INSTANCE_ID}"
|
33 | aws ecs update-container-instances-state \
|
34 | --cluster "$CLUSTER" \
|
35 | --container-instances "$CONTAINER_INSTANCE_ARN" \
|
36 | --status DRAINING
|
37 | else
|
38 | echo "Nothing to be done, exiting"
|
39 | fi
|
40 | else
|
41 | TASKS_COUNT=$(
|
42 | aws ecs list-tasks \
|
43 | --cluster "$CLUSTER" \
|
44 | --container-instance "$CONTAINER_INSTANCE_ARN" |\
|
45 | jq -r '.taskArns | length'
|
46 | )
|
47 | ASG_NAME=$(
|
48 | aws autoscaling describe-auto-scaling-instances \
|
49 | --instance-ids "$INSTANCE_ID" |\
|
50 | jq -r '.AutoScalingInstances[0].AutoScalingGroupName'
|
51 | )
|
52 |
|
53 | if [ "$TASKS_COUNT" -eq "0" ]; then
|
54 | echo "Removing $INSTANCE_ID from the $CLUSTER cluster"
|
55 | aws ecs deregister-container-instance \
|
56 | --cluster "$CLUSTER" \
|
57 | --container-instance "$CONTAINER_INSTANCE_ARN"
|
58 | aws autoscaling complete-lifecycle-action \
|
59 | --auto-scaling-group-name "$ASG_NAME" \
|
60 | --instance-id "$INSTANCE_ID" \
|
61 | --lifecycle-action-result CONTINUE \
|
62 | --lifecycle-hook-name "$LIFECYCLE_HOOK_NAME"
|
63 | else
|
64 | echo "Draining, still waiting for $TASKS_COUNT tasks to finish"
|
65 | aws autoscaling record-lifecycle-action-heartbeat \
|
66 | --auto-scaling-group-name "$ASG_NAME" \
|
67 | --instance-id "$INSTANCE_ID" \
|
68 | --lifecycle-hook-name "$LIFECYCLE_HOOK_NAME"
|
69 | fi
|
70 | fi
|