args = parser.parse_args() try: # Step 1: Configuring AWS h1("Step 1: Configuring AWS") ecs = ECSService(access_key=args.key, secret_key=args.secret, region=args.region) success("Configuring AWS succeeded") # Step 2: Check ECS cluster h1("Step 2: Check ECS cluster") ecs.describe_cluster(cluster=args.cluster_name) success("Checking cluster '%s' succeeded" % args.cluster_name) # Step 3: Check ECS Service h1("Step 3: Check ECS Service") response = ecs.describe_service(cluster=args.cluster_name, service=args.service_name) original_running_count = (response.get('services')[0]).get('runningCount') success("Checking service '%s' succeeded (%d tasks running)" % (args.service_name, original_running_count)) # Step 4: Register New Task Definition h1("Step 4: Register New Task Definition") response = ecs.register_task_definition(file=args.task_definition_file) task_definition_arn = response.get('taskDefinition').get('taskDefinitionArn') success("Registering task definition '%s' succeeded" % task_definition_arn) # Step 5: Downscale ECS Service if necessary if original_running_count >= args.minimum_running_tasks: h1("Step 5: Downscale ECS Service") response = ecs.downscale_service(cluster=args.cluster_name, service=args.service_name) downscale_running_count = (response.get('services')[0]).get('runningCount') success("Downscaling service '%s' (from %d to %d tasks) succeeded"
# Step: Configuring AWS h1("Step: Configuring AWS") ecs = ECSService(access_key=args.key, secret_key=args.secret, region=args.region) success("Configuring AWS succeeded") # Step: Check ECS cluster h1("Step: Check ECS cluster") ecs.describe_cluster(cluster=args.cluster_name) success("Checking cluster '%s' succeeded" % args.cluster_name) # Step: Check ECS Service if serviceMode: h1("Step: Check ECS Service") response = ecs.describe_service(cluster=args.cluster_name, service=args.service_name) original_running_count = ( response.get('services')[0]).get('runningCount') success("Checking service '%s' succeeded (%d tasks running)" % (args.service_name, original_running_count)) # Step: Register New Task Definition h1("Step: Register New Task Definition") response = ecs.register_task_definition(family=args.task_definition_name, file=args.task_definition_file) task_definition_arn = response.get('taskDefinition').get( 'taskDefinitionArn') success("Registering task definition '%s' succeeded" % task_definition_arn) if serviceMode:
class AwsProcess(Thread): def __init__(self, key, secret, region): super().__init__() self.ecs_service = ECSService(access_key=key, secret_key=secret, region=region) def run(self): while True: try: service, mode = task_queue.get_nowait() except Empty: time.sleep(1) continue try: self.process(service, mode) except: service.status = ProcessStatus.error error("Unexpected error. service: %s.\n%s" % (service.service_name, traceback.format_exc())) finally: task_queue.task_done() def process(self, service, mode): if service.status == ProcessStatus.error: error("service '%s' previous process error. skipping." % service.service_name) return if mode == ProcessMode.registerTask: response = self.ecs_service.register_task_definition(task_definition=service.task_definition) service.task_definition_arn = response.get('taskDefinition').get('taskDefinitionArn') success("Registering task definition '%s' succeeded (arn: '%s')" % (service.task_name, service.task_definition_arn)) # for register task rate limit time.sleep(3) elif mode == ProcessMode.checkService: try: response = self.ecs_service.describe_service(service.task_environment.cluster_name, service.service_name) except ServiceNotFoundException: error("Service '%s' not Found." % (service.service_name)) return if response['services'][0]['status'] == 'INACTIVE': error("Service '%s' status is INACTIVE." % (service.service_name)) return service.original_task_definition = (response.get('services')[0]).get('taskDefinition') service.original_running_count = (response.get('services')[0]).get('runningCount') service.original_desired_count = (response.get('services')[0]).get('desiredCount') service.desired_count = service.original_desired_count service.service_exists = True success("Checking service '%s' succeeded (%d tasks running)" % (service.service_name, service.original_running_count)) elif mode == ProcessMode.createService: response = self.ecs_service.create_service(cluster=service.task_environment.cluster_name, service=service.service_name, taskDefinition=service.task_definition_arn, desiredCount=service.task_environment.desired_count, maximumPercent=service.task_environment.maximum_percent, minimumHealthyPercent=service.task_environment.minimum_healthy_percent) service.original_running_count = (response.get('services')[0]).get('runningCount') service.original_desired_count = (response.get('services')[0]).get('desiredCount') service.desired_count = service.original_desired_count success("Create service '%s' succeeded (%d tasks running)" % (service.service_name, service.original_running_count)) elif mode == ProcessMode.updateService: response = self.ecs_service.update_service(cluster=service.task_environment.cluster_name, service=service.service_name, taskDefinition=service.task_definition_arn, maximumPercent=service.task_environment.maximum_percent, minimumHealthyPercent=service.task_environment.minimum_healthy_percent, desiredCount=service.task_environment.desired_count) service.running_count = response.get('services')[0].get('runningCount') service.desired_count = response.get('services')[0].get('desiredCount') success("Update service '%s' with task definition '%s' succeeded" % (service.service_name, service.task_definition_arn)) elif mode == ProcessMode.waitForStable: retryCount = 0 while True: try: response = self.ecs_service.wait_for_stable(cluster=service.task_environment.cluster_name, service=service.service_name) except WaiterError: if retryCount > 2: break retryCount = retryCount + 1 continue break service.running_count = response.get('services')[0].get('runningCount') service.desired_count = response.get('services')[0].get('desiredCount') self.ecs_service.deregister_task_definition(service.original_task_definition) success("service '%s' (%d tasks) update completed" % (service.service_name, service.running_count))