Source code for infrahouse_toolkit.aws.ec2_instance

"""
Module for EC2Instance class - a class tha represents an EC2 instance.
"""

from logging import getLogger

from cached_property import cached_property_with_ttl
from ec2_metadata import ec2_metadata

from infrahouse_toolkit.aws import get_client

LOG = getLogger()


[docs]class EC2Instance: """ EC2Instance represents an EC2 instance. :param instance_id: Instance id. If omitted, the local instance is read from metadata. :type instance_id: str """ def __init__(self, instance_id: str = None): self._instance_id = instance_id @property def availability_zone(self) -> str: """ :return: Availability zone where this instance is hosted. """ return ec2_metadata.availability_zone @property def instance_id(self) -> str: """ :return: The instance's instance_id. It's read from metadata if the class instance was created w/o specifying it. """ if self._instance_id is None: self._instance_id = ec2_metadata.instance_id return self._instance_id @property def state(self) -> str: """ :return: EC2 instance state e.g. ``Running``, ``Terminated``, etc. """ return self._describe_instance["State"]["Name"] @property def tags(self) -> dict: """ :return: A dictionary with the instance tags. Keys are tag names, and values - the tag values. """ return {tag["Key"]: tag["Value"] for tag in self._describe_instance["Tags"]} @property def _ec2_client(self): return get_client("ec2") @cached_property_with_ttl(ttl=10) def _describe_instance(self): return self._ec2_client.describe_instances( InstanceIds=[ self.instance_id, ], )[ "Reservations" ][0][ "Instances" ][0]