Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 18717ef

Browse files
author
Daniel Fuentes
committed
[roll-ami] drain old instances before terminating:
- Put old instances in DRAINING state before terminating them, allowing ECS to drain connections and move tasks.
1 parent fe8e8c5 commit 18717ef

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

tools/roll-ami

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@ import queue
66
import sys
77
import threading
88
import time
9+
import copy
910

1011
asg = boto3.client('autoscaling')
1112
ec2 = boto3.client('ec2')
13+
ecs = boto3.client('ecs')
14+
1215

1316
def main(argv):
1417
options = parse_arguments(argv)
@@ -108,6 +111,25 @@ def run(options, step_size=1, launch_config=None, force=False, ignore_instances=
108111
info('%s - running', instance['InstanceId'])
109112
tmp_instances.remove(instance['InstanceId'])
110113

114+
container_instance_id_map = build_container_instance_map(options.cluster)
115+
116+
# Drain old instances
117+
ecs.update_container_instances_state(
118+
cluster=options.cluster,
119+
containerInstances=[container_instance_id_map[instance] for instance in old_instances],
120+
status='DRAINING')
121+
122+
draining_instances = copy.copy(old_instances)
123+
while draining_instances:
124+
time.sleep(1)
125+
ci_info = ecs.describe_container_instances(
126+
cluster=options.cluster,
127+
containerInstances=[container_instance_id_map[instance] for instance in draining_instances])
128+
for container_instance in ci_info['containerInstances']:
129+
if container_instance['runningTasksCount'] == 0:
130+
draining_instances.remove(container_instance['ec2InstanceId'])
131+
info('%s - drained', container_instance['ec2InstanceId'])
132+
111133
# Terminates the old instances that aren't necessary anymore (the ones
112134
# that were picked by the iterator).
113135
for instance in old_instances:
@@ -209,6 +231,16 @@ def filter_new_instances(instances, group_instances):
209231
new_instances.sort()
210232
return new_instances
211233

234+
def build_container_instance_map(cluster):
235+
container_instances = ecs.list_container_instances(cluster=cluster)
236+
full_info = ecs.describe_container_instances(cluster=cluster,
237+
containerInstances=container_instances['containerInstanceArns'])
238+
239+
container_instance_map = {}
240+
for ci in full_info['containerInstances']:
241+
container_instance_map[ci['ec2InstanceId']] = ci['containerInstanceArn']
242+
return container_instance_map
243+
212244
def iter_instance_groups(instances, group_size):
213245
while instances:
214246
n = min(group_size, len(instances))

0 commit comments

Comments
 (0)