def terminate(self, aws_tags: List[Dict]) -> None: """Aws spot instance scheduler function. Terminate spot instances by using the defined tag. :param list[map] aws_tags: Aws tags to use for filter resources. For example: [ { 'Key': 'string', 'Values': [ 'string', ] } ] """ tag_key = aws_tags[0]["Key"] tag_value = "".join(aws_tags[0]["Values"]) for spot_instance in self.list_spot(tag_key, tag_value): try: self.ec2.terminate_instances(InstanceIds=[spot_instance]) print("Terminate spot instance {0}".format(spot_instance)) except ClientError as exc: ec2_exception("spot instance", spot_instance, exc)
def start(self, aws_tags: List[Dict]) -> None: """Aws ec2 instance start function. Start ec2 instances with defined tags. Aws tags to use for filter resources Aws tags to use for filter resources. For example: [ { 'Key': 'string', 'Values': [ 'string', ] } ] """ for instance_arn in self.tag_api.get_resources("ec2:instance", aws_tags): instance_id = instance_arn.split("/")[-1] try: if not self.asg.describe_auto_scaling_instances( InstanceIds=[instance_id])["AutoScalingInstances"]: self.ec2.start_instances(InstanceIds=[instance_id]) print("Start instances {0}".format(instance_id)) except ClientError as exc: ec2_exception("instance", instance_id, exc)
def instance_running(self, instance_ids: List[str]) -> None: """Aws waiter for instance running. Wait ec2 instances are in running state. :param list instance_ids: The instance IDs to wait. """ if instance_ids: try: instance_waiter = self.ec2.get_waiter("instance_running") instance_waiter.wait( InstanceIds=instance_ids, WaiterConfig={"Delay": 15, "MaxAttempts": 15}, ) except ClientError as exc: ec2_exception("waiter", instance_waiter, exc)
def start(self, aws_tags: List[Dict]) -> None: """Aws autoscaling resume function. Resume autoscaling group and start its instances with defined tag. :param list[map] aws_tags: Aws tags to use for filter resources For example: [ { 'Key': 'string', 'Values': [ 'string', ] } ] """ tag_key = aws_tags[0]["Key"] tag_value = "".join(aws_tags[0]["Values"]) asg_name_list = self.list_groups(tag_key, tag_value) instance_id_list = self.list_instances(asg_name_list) instance_running_ids = [] # Start autoscaling instance for instance_id in instance_id_list: try: self.ec2.start_instances(InstanceIds=[instance_id]) print("Start autoscaling instances {0}".format(instance_id)) except ClientError as exc: ec2_exception("instance", instance_id, exc) else: instance_running_ids.append(instance_id) self.waiter.instance_running(instance_ids=instance_running_ids) for asg_name in asg_name_list: try: self.asg.resume_processes(AutoScalingGroupName=asg_name) print("Resume autoscaling group {0}".format(asg_name)) except ClientError as exc: ec2_exception("autoscaling group", asg_name, exc)
def stop(self, aws_tags: List[Dict]) -> None: """Aws autoscaling suspend function. Suspend autoscaling group and stop its instances with defined tag. :param list[map] aws_tags: Aws tags to use for filter resources. For example: [ { 'Key': 'string', 'Values': [ 'string', ] } ] """ tag_key = aws_tags[0]["Key"] tag_value = "".join(aws_tags[0]["Values"]) asg_name_list = self.list_groups(tag_key, tag_value) instance_id_list = self.list_instances(asg_name_list) for asg_name in asg_name_list: try: self.asg.suspend_processes(AutoScalingGroupName=asg_name) print("Suspend autoscaling group {0}".format(asg_name)) except ClientError as exc: ec2_exception("instance", asg_name, exc) # Stop autoscaling instance for instance_id in instance_id_list: try: self.ec2.stop_instances(InstanceIds=[instance_id]) print("Stop autoscaling instances {0}".format(instance_id)) except ClientError as exc: ec2_exception("autoscaling group", instance_id, exc)