34

在常规 boto 2.38 中,我曾经通过 boto 访问实例元数据(例如获取当前堆栈名称)

boto.utils.get_instance_metadata()

boto3 中是否有等价物,还是我需要转到下级直接 http 地址来获取有关正在运行的实例的元数据?

4

3 回答 3

19

不,在boto3中仍然没有等价物,我自己就打了这个差距。他们对此https://github.com/boto/boto3/issues/313
有一个开放的功能请求,它引用了这个问题。

至于变通方法,
您可以继续使用boto.utils或使用urllib/urllib2手动执行 HTTP 请求,即。

# Python2
import urllib2
instanceid = urllib2.urlopen('http://169.254.169.254/latest/meta-data/instance-id').read()

# Python3
import urllib.request
instanceid = urllib.request.urlopen('http://169.254.169.254/latest/meta-data/instance-id').read().decode()

请参阅Python 中 HTTP GET 的最快方法是什么?快速介绍 urllib 和http://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-instance-metadata.html#instancedata-data-categories元数据服务的 URI 结构。

于 2015-11-16T11:05:54.470 回答
4

您可以使用第三方库ec2-metadata

以下是文档中的一个示例,展示了如何获取您的 EC2 区域:

  pip install ec2-metadata

  >>> from ec2_metadata import ec2_metadata
  >>> print(ec2_metadata.region)
  us-east-1
于 2020-03-23T10:54:13.763 回答
1

IMDSFetcher您可以从in获取特定的元数据botocore

from botocore.utils import IMDSFetcher

IMDSFetcher()._get_request("/latest/meta-data/instance-type", None).text

这也适用于实施 IMDSv2 的实例。

于 2022-02-17T08:08:58.243 回答