跳转到主要内容

一个简单的接口,用于查询带有缓存的EC2元数据API。

项目描述

https://img.shields.io/github/actions/workflow/status/adamchainz/ec2-metadata/main.yml?branch=main&style=for-the-badge https://img.shields.io/badge/Coverage-100%25-success?style=for-the-badge https://img.shields.io/pypi/v/ec2-metadata.svg?style=for-the-badge https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge pre-commit

一个简单的接口,用于查询(版本2)EC2元数据API,并带有缓存。

快速示例

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

安装

使用 pip

python -m pip install ec2-metadata

支持Python 3.8至3.12。


在Django项目中工作? 通过 我的书籍之一 提升你的技能。


为什么?

boto 随带一个用于检索实例元数据的懒加载字典的实用函数, boto.utils.get_instance_metadata,但这个功能尚未移植到 boto3,如 此问题 所述。我认为,与其在 boto3 内构建新版本,不如将其作为独立库使用。

实例元数据服务版本2

2019年11月,AWS发布了实例元数据服务的第2版本,您可以在这里找到更多信息:版本2。它能够更有效地防御服务器端请求伪造(SSRF)攻击。

ec2-metadata现在仅使用这个版本。因此,您可以考虑按照AWS指南禁用版本1。

注意:实例元数据服务v2的默认IP跳数限制为1。这意味着您可能会在Docker容器中看到requests.exceptions.ReadTimeout错误。为了解决这个问题,请重新配置EC2实例的元数据选项,使用aws ec2 modify-instance-metadata-options允许三个跳数。

aws ec2 modify-instance-metadata-options  --instance-id <instance-id> --http-put-response-hop-limit 3

API

EC2Metadata(session=None)

这是一个表示EC2元数据服务上可用数据的容器。属性并不完全对应于元数据服务中的路径 - 它们已经被“清理”。您还可以参考元数据服务文档来了解确切的内容。

在名称ec2_metadata下有一个此类实例的单一实例,应该可以覆盖90%的使用场景。使用方法如下

from ec2_metadata import ec2_metadata

ec2_metadata.region

如果提供了session参数,则应该是一个requests.Session实例,允许您自定义请求的发送方式。

大多数属性都是缓存的,除非以下说明。这是因为它们大多是不可变的,或者至少需要停止实例才能更改。然而,一些缓存的属性确实表示可以在不停止实例的情况下更改的事情,但这种情况很少见,例如网络设备。

使用@cached_property进行缓存,因此它们在第一次访问时缓存。如果您想清除某个属性的缓存,只需执行del操作即可。

del ec2_metadata.network_interfaces

要清除所有缓存,请使用以下clear_all()方法。

account_id: str

当前AWS账户ID,例如'123456789012'

ami_id: str

启动实例使用的AMI的ID,例如'ami-123456'

autoscaling_target_lifecycle_state: str | None

未缓存。实例正在过渡到的目标自动扩展生命周期状态,或者如果实例不在自动扩展组中则为None。请参阅AWS文档页面通过实例元数据检索目标生命周期状态

availability_zone: str

当前可用区的名称,例如'eu-west-1a'

availability_zone_id: str | None

当前可用区的唯一、跨账户ID,例如'use1-az6'。请参阅AWS文档页面AWS资源的AZ ID

ami_launch_index: int

实例在启动请求中的索引,基于零,例如0

ami_manifest_path: str

Amazon S3中AMI清单文件的路径,或者对于基于EBS的AMI为'(unknown)'

clear_all() -> None

清除类上的所有缓存的属性,这意味着它们下一次访问将重新从元数据API获取数据。这包括清除用于与该服务进行身份验证的令牌。

domain: str

区域AWS资源的域名。例如,对于标准AWS区域和GovCloud (US)为'amazonaws.com',对于中国为'amazonaws.com.cn'

iam_info: IamInfoDict | None

实例附加的 IAM 角色的数据字典,或者如果没有附加角色则为 None。该字典类型基于元数据服务返回的内容。

class IamInfoDict(TypedDict):
    InstanceProfileArn: str
    InstanceProfileId: str
    LastUpdated: str

iam_security_credentials: IamSecurityCredentialsDict | None

与实例附加的 IAM 角色关联的安全凭证的数据字典,或者如果没有附加角色则为 None。有关详细信息,请参阅AWS 文档中“从实例元数据检索安全凭证”部分。该字典类型基于该文档。

class IamSecurityCredentialsDict(TypedDict):
    LastUpdated: str
    Type: str
    AccessKeyId: str
    SecretAccessKey: str
    Token: str
    Expiration: str

instance_action: str

未缓存。一个表示实例将重启以准备打包的状态。请参阅AWS 文档中“实例元数据类别”部分以获取有效值。

instance_id: str

当前实例的 ID,例如 'i-123456'

instance_identity_document: InstanceIdentityDocumentDict

关于实例的动态数据字典。请参阅AWS 文档中“实例身份证明文件”页面以了解内容解释。该字典类型基于该文档。

class InstanceIdentityDocumentDict(TypedDict):
    accountId: str
    architecture: Literal["i386", "x86_64", "arm64"]
    availabilityZone: str
    billingProducts: list[str] | None
    marketplaceProductCodes: list[str] | None
    imageId: str
    instanceId: str
    instanceType: str
    kernelId: str | None
    pendingTime: str
    privateIp: str
    ramdiskId: str | None
    region: str
    version: str

instance_profile_arn: str | None

实例附加的 IAM 角色或实例配置文件的 ARN,取自 iam_info,或者如果没有附加角色则为 None

instance_profile_id: str | None

实例附加的 IAM 角色或实例配置文件的 ID,取自 iam_info,或者如果没有附加角色则为 None

instance_profile_name: str | None

实例配置文件名称,从 instance_profile_arn 中提取,或者如果没有附加角色则为 None

instance_type: str

当前实例的类型,例如 't2.nano'

kernel_id: str | None

当前实例的内核 ID,如果没有则为 None,例如 'aki-dc9ed9af'

mac: str

实例的 MAC 地址,例如 '0a:d2:ae:4d:f3:12'

network_interfaces: dict[str, NetworkInterface]

一个从 MAC 地址到 NetworkInterface 的字典,表示网络接口上的数据 - 请见下文。例如 {'01:23:45:67:89:ab': NetworkInterface('01:23:45:67:89:ab')}}

partition: str

实例正在运行的 AWS 分区。例如,对于标准 AWS 区域为 'aws',对于美国政府云为 'aws-us-gov',对于中国为 'aws-cn'

private_hostname: str

实例的私有 IPv4 DNS 主机名,例如 'ip-172-30-0-0.eu-west-1.compute.internal'

private_ipv4: str

实例的私有 IPv4 地址,例如 '172.30.0.0'

public_hostname: str | None

实例的公共 DNS 主机名,如果实例不是公共的则为 None,例如 'ec2-1-2-3-4.compute-1.amazonaws.com'

public_ipv4: str | None

实例的公共 IPv4 地址,如果实例不是公共的则为 None,例如 '1.2.3.4'

region: str

实例正在运行的区域,例如 'eu-west-1'

reservation_id: str

用于启动实例的预订ID,例如 'r-12345678901234567'

security_groups : 列表[str]

按名称列出的安全组列表,例如 ['ssh-access', 'custom-sg-1']

spot_instance_action: SpotInstanceAction | None

未缓存。 描述即将对该spot实例执行的操作的对象。如果实例不是spot实例,或者未标记为终止,则返回 None

SpotInstanceAction对象有两个属性

  • action: str - 即将执行的操作,可以是 "hibernate""stop""terminate" 之一。

  • time: datetime - 动作发生的UTC时间的大致日期和时间。

有关更多信息,请参阅AWS文档部分

tags: InstanceTags

实例标签的类似字典映射(如下所述)。这需要您为实例显式启用功能。如果未启用此功能,访问此属性将引发错误。

(似乎还有一个错误,如果启用了该功能然后又禁用,元数据服务会返回一个空响应。这无法与“没有标签”区分开来,所以请注意,在这种情况下,InstanceTags 将仅看起来像一个空映射。)

user_data: bytes | None

分配给实例的原始用户数据(非base64编码),如果没有则返回 None

InstanceTags

标签名称到值的类似字典映射(两者都是 str)。为了减少不必要的请求,映射是懒加载的:仅在需要时获取值。(名称在构建时已知,来自 EC2Metadata.tags 的第一个请求。)

元数据服务将在某些实例类型上接收标签更新,如AWS文档中所述

如果您添加或删除实例标签,对于基于Nitro系统构建的实例,实例元数据将在实例运行时更新,无需停止然后启动实例。对于所有其他实例,要更新实例元数据中的标签,您必须停止然后启动实例。

由于InstanceTags是缓存的,因此它不会反映Nitro实例上的此类更新,除非您首先清除它

del ec2_metadata.tags
ec2_metadata.tags["Name"]  # fresh

NetworkInterface

表示从EC2Metadata.network_interfaces检索到的单个网络接口。同样,与EC2Metadata一样,其所有属性在第一次访问时缓存,可以使用del或其clear_all()方法清除。

device_number: int

与该接口关联的唯一设备号,例如 0

interface_id: str

用于识别弹性网络接口的唯一ID,例如 'eni-12345'

ipv4_associations: dict[str, list[str]]

将接口上的公共IP地址映射到与该公共IP关联的私有IP地址列表的字典,对于与接口关联的每个公共IP,例如 {'54.0.0.1': ['172.30.0.0']}

ipv6s: list[str]

与接口关联的IPv6地址,例如 ['2001:db8:abcd:ef00::1234']

mac: str

接口的MAC地址,例如 '01:23:45:67:89:ab'

owner_id: str

网络接口所有者的AWS账户ID,例如:'123456789012'

private_hostname: str

接口的本地/私有主机名,例如:'ip-172-30-0-0.eu-west-1.compute.internal'

private_ipv4s: list[str]

与接口关联的私有IPv4地址,例如:['172.30.0.0']

public_hostname: str | None

接口的公共DNS(IPv4),例如:'ec2-54-0-0-0.compute-1.amazonaws.com'

public_ipv4s: list[str]

与接口关联的弹性IP地址,例如:['54.0.0.0']

security_groups: list[str]

网络接口所属的安全组名称,例如:['ssh-access', 'custom-sg-1']

security_group_ids: list[str]

网络接口所属的安全组名称,例如:['sg-12345678', 'sg-12345679']

subnet_id: str

接口所在的子网ID,例如:'subnet-12345678'

subnet_ipv4_cidr_block: str | None

接口所在的子网的IPv4 CIDR块,如果没有则为None,例如:'172.30.0.0/24'

subnet_ipv6_cidr_blocks: list[str]

接口所在的子网的IPv6 CIDR块列表,例如:['2001:db8:abcd:ef00::/64']。如果子网没有IPv6 CIDR块或实例不在VPC中,列表将为空,例如:[]

vpc_id: str

接口所在的VPC ID,例如:'vpc-12345678'

vpc_ipv4_cidr_block: str | None

VPC的IPv4 CIDR块,如果实例不在VPC中则为None,例如:'172.30.0.0/16'

vpc_ipv4_cidr_blocks: list[str]

IPv4 CIDR块列表,例如:['172.30.0.0/16']。如果接口没有此类CIDR块,列表将为空。

vpc_ipv6_cidr_blocks: list[str]

接口所在的VPC的IPv6 CIDR块列表,例如:['2001:db8:abcd:ef00::/56']。如果VPC没有IPv6 CIDR块或实例不在VPC中,列表将为空,例如:[]

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

ec2_metadata-2.13.0.tar.gz (17.3 kB 查看哈希值)

上传于 源代码

构建的发行版

ec2_metadata-2.13.0-py3-none-any.whl (10.7 kB 查看哈希值)

上传于 Python 3

由以下支持