Skip to main content

An easy interface to query the EC2 metadata API, with caching.

Project description

https://img.shields.io/travis/adamchainz/ec2-metadata/master.svg https://img.shields.io/pypi/v/ec2-metadata.svg https://img.shields.io/badge/code%20style-black-000000.svg

An easy interface to query the EC2 metadata API (version 2), with caching.

A quick example:

>>> from ec2_metadata import ec2_metadata
>>> print(ec2_metadata.region)
us-east-1
>>> print(ec2_metadata.instance_id)
i-123456

Installation

Use pip:

python -m pip install ec2-metadata

Python 3.5 to 3.8 supported.

Why?

boto came with a utility function to retrieve the instance metadata as a lazy loading dictionary, boto.utils.get_instance_metadata, but this has not been ported to boto3, as per this issue. I thought that rather than building a new version inside boto3 it would work well as a standalone library.

Instance Metadata Service Version 2

In November 2019, AWS released version 2 of the instance metadata service. It’s more secure against Server Side Request Forgery (SSRF) attacks.

ec2-metadata now uses it exclusively. You can therefore consider disabling version 1, as per AWS’ guide.

API

EC2Metadata(session=None)

A container that represents the data available on the EC2 metadata service. Attributes don’t entirely correspond to the paths in the metadata service - they have been ‘cleaned up’. You may also want to refer to the metadata service docs to understand the exact contents.

There’s a singleton instance of it at the name ec2_metadata which should cover 90% of use cases. Use it like:

from ec2_metadata import ec2_metadata
ec2_metadata.region

The session argument, if provided, should be an instance of requests.Session, allowing you to customize the way requests are made.

Most of the attributes are cached, except where noted below. This is because they are mostly immutable, or at least require an instance stop to change. However some cached attributes do represent things that can change without an instance stop, but rarely do, such as network devices.

The caching is done with @cached_property, so they cache on first access. If you want to clear the cache of one attribute you can just del it:

del ec2_metadata.network_interfaces

To clear all, use the clear_all() method as per below.

account_id: str

The current AWS account ID, e.g. '123456789012'.

ami_id: str

The ID of the AMI used to launch the instance, e.g. 'ami-123456'.

availability_zone: str

The name of the current AZ e.g. 'eu-west-1a'.

ami_launch_index: int

The index of the instance in the launch request, zero-based, e.g. 0.

ami_manifest_path: str

The path to the AMI manifest file in Amazon S3, or '(unknown)' on EBS-backed AMI’s.

clear_all() -> None

Clear all the cached attributes on the class, meaning their next access will re-fetch the data from the metadata API. This includes clearing the token used to authenticate with the service.

iam_info: dict

A dictionary of data for the IAM role attached to the instance, or None if no role is attached.

instance_action: str

Uncached. A state that notifies if the instance will reboot in preparation for bundling. See the AWS docs section “Instance Metadata Categories” for the valid values.

instance_id: str

The current instance’s ID, e.g. 'i-123456'

instance_identity_document: dict

A dictionary of dynamic data - see AWS docs page “Instance Identity Documents”.

instance_profile_arn: str

The ARN of the IAM role/instance profile attached to the instance, taken from iam_info, or None if no role is attached.

instance_profile_id: str

The ID of the IAM role/instance profile attached to the instance, taken from iam_info, or None if no role is attached.

instance_type: str

The current instance’s type, e.g. 't2.nano'

kernel_id: str

The current instance’s kernel ID, or None if it doesn’t have one, e.g. 'aki-dc9ed9af'.

mac : str

The instance’s MAC address, e.g. '0a:d2:ae:4d:f3:12'

network_interfaces: Dict[str, NetworkInterface]

A dictionary of mac address to NetworkInterface, which represents the data available on a network interface - see below. E.g. {'01:23:45:67:89:ab': NetworkInterface('01:23:45:67:89:ab')}

private_hostname : str

The private IPv4 DNS hostname of the instance, e.g. 'ip-172-30-0-0.eu-west-1.compute.internal' .

private_ipv4: str

The private IPv4 of the instance, e.g. '172.30.0.0'.

public_hostname : str

The public DNS hostname of the instance, or None if the instance is not public, e.g. 'ec2-1-2-3-4.compute-1.amazonaws.com'.

public_ipv4: str

The public IPv4 address of the instance, or None if the instance is not public, e.g. '1.2.3.4'.

region: str

The region the instance is running in, e.g. 'eu-west-1'.

reservation_id: str

The ID of the reservation used to launch the instance, e.g. 'r-12345678901234567'.

security_groups : List[str]

List of security groups by name, e.g. ['ssh-access', 'custom-sg-1'].

user_data: bytes

The raw user data assigned to the instance (not base64 encoded), or None if there is none.

NetworkInterface

Represents a single network interface, as retrieved from EC2Metadata.network_interfaces. Again like EC2Metadata all its attributes cache on first access, and can be cleared with del or its clear_all() method.

device_number: int

The unique device number associated with that interface, e.g. 0.

interface_id: str

The unique id used to identify the Elastic Network Interface, e.g. 'eni-12345'.

ipv4_associations: Dict[str, List[str]]

A dictionary mapping public IP addresses on the interface to the list of private IP addresses associated with that public IP, for each public IP that is associated with the interface, e.g. {'54.0.0.1': ['172.30.0.0']}.

ipv6s: List[str]

The IPv6 addresses associated with the interface, e.g. ['2001:db8:abcd:ef00::1234'].

mac: str

The MAC address of the interface, e.g. '01:23:45:67:89:ab'.

owner_id: str

The AWS Account ID of the owner of the network interface, e.g. '123456789012'.

private_hostname: str

The interface’s local/private hostname, e.g. 'ip-172-30-0-0.eu-west-1.compute.internal'.

private_ipv4s: List[str]

The private IPv4 addresses associated with the interface, e.g. ['172.30.0.0'].

public_hostname: str

The interface’s public DNS (IPv4), e.g. 'ec2-54-0-0-0.compute-1.amazonaws.com'.

public_ipv4s: List[str]

The Elastic IP addresses associated with the interface, e.g. ['54.0.0.0'].

security_groups: List[str]

The names of the security groups to which the network interface belongs, e.g. ['ssh-access', 'custom-sg-1'].

security_group_ids: List[str]

The names of the security groups to which the network interface belongs, e.g. ['sg-12345678', 'sg-12345679'].

subnet_id: str

The ID of the subnet in which the interface resides, e.g. 'subnet-12345678'.

subnet_ipv4_cidr_block: str

The IPv4 CIDR block of the subnet in which the interface resides, e.g. '172.30.0.0/24'.

subnet_ipv6_cidr_blocks: List[str]

The list of IPv6 CIDR blocks of the subnet in which the interface resides, e.g. ['2001:db8:abcd:ef00::/64']. If the subnet does not have any IPv6 CIDR blocks or the instance isn’t in a VPC, the list will be empty, e.g. [].

vpc_id: str

The ID of the VPC in which the interface resides, e.g. 'vpc-12345678'.

vpc_ipv4_cidr_block: str

The IPv4 CIDR block of the VPC, or None if the instance isn’t in a VPC, e.g. '172.30.0.0/16'.

vpc_ipv4_cidr_blocks: List[str]

The list of IPv4 CIDR blocks, or None if the instance isn’t in a VPC, e.g. ['172.30.0.0/16'].

vpc_ipv6_cidr_blocks: List[str]

The list of IPv6 CIDR blocks of the VPC in which the interface resides, e.g. ['2001:db8:abcd:ef00::/56']. If the VPC does not have any IPv6 CIDR blocks or the instance isn’t in a VPC, the list will be empty, e.g. [].

History

2.2.0 (2020-03-12)

  • Move to use Instance Metadata Service version 2. See the README for a note on its increased security and porting to lock down the less secure version 1.

2.1.0 (2019-12-19)

  • Update Python support to 3.5-3.8, as 3.4 has reached its end of life.

  • Converted setuptools metadata to configuration file. This meant removing the __version__ attribute from the package. If you want to inspect the installed version, use importlib.metadata.version("ec2-metadata") (docs / backport).

2.0.0 (2019-02-02)

  • Drop Python 2 support, only Python 3.4+ is supported now.

1.8.0 (2018-10-21)

  • Use timeout of 1 second for requests to the metadata API.

1.7.1 (2018-09-17)

  • Fix doucmentation rendering on PyPI.

1.7.0 (2018-09-17)

  • Add interface_id to NetworkInterface.

1.6.0 (2017-11-20)

  • Add ipv6s, subnet_ipv6_cidr_blocks, and vpc_ipv6_cidr_blocks attributes to NetworkInterface.

1.5.0 (2017-10-29)

  • Add instance_action and kernel_id attributes.

1.4.0 (2017-10-24)

  • Add iam_info, instance_profile_arn and instance_profile_id attributes.

  • Refactor handling non-200 responses to be more strict for attributes where 404’s are allowed.

1.3.1 (2017-10-17)

  • Fix rendering of docs on PyPI.

1.3.0 (2017-10-17)

  • All methods can now raise requests.exceptions.HTTPError if the metadata API returns a bad response, rather than failing during parsing or silently returning data from non-200 responses.

  • EC2Metadata can now be passed a requests.Session object for customization of the way requests are made.

1.2.1 (2017-08-31)

  • Make public_* properties return None for instances that aren’t public.

1.2.0 (2017-08-26)

  • Add network_interfaces attribute which is a list of NetworkInterface instances, which have many attributes themselves.

1.1.0 (2017-08-07)

  • Add security_groups and user_data attributes.

1.0.0 (2017-06-16)

  • First release on PyPI, featuring ec2_metadata object.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ec2-metadata-2.2.0.tar.gz (41.0 kB view details)

Uploaded Source

Built Distribution

ec2_metadata-2.2.0-py3-none-any.whl (8.1 kB view details)

Uploaded Python 3

File details

Details for the file ec2-metadata-2.2.0.tar.gz.

File metadata

  • Download URL: ec2-metadata-2.2.0.tar.gz
  • Upload date:
  • Size: 41.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.41.1 CPython/3.8.1

File hashes

Hashes for ec2-metadata-2.2.0.tar.gz
Algorithm Hash digest
SHA256 9ac9ebe974b1f31f69a49e06e81654fe26c6448d4d5ced91478519028875bacd
MD5 279138446d40ea5a2c5fe144de405dd9
BLAKE2b-256 d0cf165432d8137ef0f0231296a97cc51ca52a674b9fdbfc6f215f4a38b35546

See more details on using hashes here.

File details

Details for the file ec2_metadata-2.2.0-py3-none-any.whl.

File metadata

  • Download URL: ec2_metadata-2.2.0-py3-none-any.whl
  • Upload date:
  • Size: 8.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.41.1 CPython/3.8.1

File hashes

Hashes for ec2_metadata-2.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 609c70891766ff1cc51f12da777873741ebd11e6b1bf266eca86e691db63ff12
MD5 91f646347ed1c079632cdf3e7629dd91
BLAKE2b-256 dbca29a0b920f0cb4518768a929428105b5c7275af921b920c06ba0c632e630f

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page