@@ -6,9 +6,12 @@ import queue
66import sys
77import threading
88import time
9+ import copy
910
1011asg = boto3 .client ('autoscaling' )
1112ec2 = boto3 .client ('ec2' )
13+ ecs = boto3 .client ('ecs' )
14+
1215
1316def main (argv ):
1417 options = parse_arguments (argv )
@@ -108,6 +111,28 @@ 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+ info ('draining ECS container instances...' )
118+ for instance in old_instances :
119+ info ('%s - draining' , instance )
120+ ecs .update_container_instances_state (
121+ cluster = options .cluster ,
122+ containerInstances = [container_instance_id_map [instance ] for instance in old_instances ],
123+ status = 'DRAINING' )
124+
125+ draining_instances = copy .copy (old_instances )
126+ while draining_instances :
127+ time .sleep (5 )
128+ ci_info = ecs .describe_container_instances (
129+ cluster = options .cluster ,
130+ containerInstances = [container_instance_id_map [instance ] for instance in draining_instances ])
131+ for container_instance in ci_info ['containerInstances' ]:
132+ if container_instance ['runningTasksCount' ] == 0 :
133+ draining_instances .remove (container_instance ['ec2InstanceId' ])
134+ info ('%s - drained' , container_instance ['ec2InstanceId' ])
135+
111136 # Terminates the old instances that aren't necessary anymore (the ones
112137 # that were picked by the iterator).
113138 for instance in old_instances :
@@ -209,6 +234,16 @@ def filter_new_instances(instances, group_instances):
209234 new_instances .sort ()
210235 return new_instances
211236
237+ def build_container_instance_map (cluster ):
238+ container_instances = ecs .list_container_instances (cluster = cluster )
239+ full_info = ecs .describe_container_instances (cluster = cluster ,
240+ containerInstances = container_instances ['containerInstanceArns' ])
241+
242+ container_instance_map = {}
243+ for ci in full_info ['containerInstances' ]:
244+ container_instance_map [ci ['ec2InstanceId' ]] = ci ['containerInstanceArn' ]
245+ return container_instance_map
246+
212247def iter_instance_groups (instances , group_size ):
213248 while instances :
214249 n = min (group_size , len (instances ))
0 commit comments