UNPKG

2.15 kBapplication/x-shView Raw
1#!/bin/sh
2
3set -e
4
5echo "$(date) Starting task-reaper.sh"
6
7INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
8
9CLUSTER=$(grep 'ECS_CLUSTER=' /etc/ecs/ecs.config | cut -d '=' -f 2)
10
11CONTAINER_INSTANCE_ARN=$(
12 aws ecs list-container-instances \
13 --cluster "$CLUSTER" \
14 --filter "ec2InstanceId == $INSTANCE_ID" |\
15 jq -r '.containerInstanceArns[0]'
16)
17CONTAINER_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
24if [ "$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
40else
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
70fi