Source code for infrahouse_core.aws.asg_instance

"""
Module for ASGInstance class - a class to describe and work with
an instance that is a part of an Autoscaling group.
"""

from logging import getLogger

from cached_property import cached_property_with_ttl

from infrahouse_core.aws import get_client
from infrahouse_core.aws.ec2_instance import EC2Instance

LOG = getLogger(__name__)


[docs] class ASGInstance(EC2Instance): """ ASGInstance is an EC2 instance that is a part of an autoscaling group. Because it's an EC2 instance, ASGInstance inherits EC2Instance. """ def __init__(self, instance_id=None, **kwargs): super().__init__(instance_id=instance_id, **kwargs) self._autoscaling_client_instance = None @property def lifecycle_state(self) -> str: """ :return: Lifecycle state of the instance. See https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-lifecycle.html for possible values. """ return self._describe_auto_scaling_instance["LifecycleState"] @property def asg_name(self) -> str: """ :return: Name of an autoscaling group that this instance is a part of. """ return self.tags["aws:autoscaling:groupName"]
[docs] def mark_unhealthy(self): """Tell the autoscaling group that this instance is not healthy and should be replaced.""" self._autoscaling_client.set_instance_health( InstanceId=self.instance_id, HealthStatus="Unhealthy", )
[docs] def protect(self): """Protect the instance from a scale-in event.""" self._autoscaling_client.set_instance_protection( InstanceIds=[ self.instance_id, ], AutoScalingGroupName=self.asg_name, ProtectedFromScaleIn=True, )
[docs] def unprotect(self): """Release protection the instance from a scale-in event.""" self._autoscaling_client.set_instance_protection( InstanceIds=[ self.instance_id, ], AutoScalingGroupName=self.asg_name, ProtectedFromScaleIn=False, )
@property def _autoscaling_client(self): if self._autoscaling_client_instance is None: if self._session is not None: self._autoscaling_client_instance = self._session.client("autoscaling", region_name=self._region) else: self._autoscaling_client_instance = get_client( "autoscaling", region=self._region, role_arn=self._role_arn ) LOG.debug("Created autoscaling client in %s region", self._autoscaling_client_instance.meta.region_name) return self._autoscaling_client_instance @cached_property_with_ttl(ttl=10) def _describe_auto_scaling_instance(self): return self._autoscaling_client.describe_auto_scaling_instances( InstanceIds=[ self.instance_id, ], )[ "AutoScalingInstances" ][0]