一个简单的接口,用于查询带有缓存的EC2元数据API。
项目描述
一个简单的接口,用于查询(版本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文档部分。
user_data: bytes | None
分配给实例的原始用户数据(非base64编码),如果没有则返回 None。
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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2c02c8f724cfbbf7a25cbfe18e0034454f9ad9be2cfb44c4daef5af3db55b94a |
|
MD5 | f0dff7189876f20e238d78bf6c468039 |
|
BLAKE2b-256 | fdb1a5768b216e8b847a5dadecc06ea7653b5f8395f1a0fca3b542bc15318afb |
ec2_metadata-2.13.0-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9615ec916a1a68b19a11f94b1c8e90c448b198ecbdbd938f822adf33e50595cd |
|
MD5 | 50d011e7f10db7be3ca790c7611386b3 |
|
BLAKE2b-256 | e5c4fcff71841f9258bb5e909c80e65614d4236e8060749ab819ee84fe55bb96 |