'boto3 equivalent to boto.utils.get_instance_metadata()?
In regular boto 2.38 I used to access instance metadata (e.g. get current stack-name), through boto's
boto.utils.get_instance_metadata()
Is there an equivalent in boto3, or do I need to go to the down level direct http address to fetch metadata about the running instance?
Solution 1:[1]
Nope, still no equivalent in boto3, just hit this gap myself.
They have an open feature request for this https://github.com/boto/boto3/issues/313 that references this question.
As for workarounds,
you can continue to use boto.utils or use urllib/urllib2 to do the HTTP requests manually ie.
# 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()
see What is the quickest way to HTTP GET in Python? for a quick intro on urllib and http://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-instance-metadata.html#instancedata-data-categories for the URI structure of the metadata service.
Solution 2:[2]
You could use the third-party library ec2-metadata.
Here an example from the docs showing how to get your EC2 region:
pip install ec2-metadata
>>> from ec2_metadata import ec2_metadata
>>> print(ec2_metadata.region)
us-east-1
Solution 3:[3]
You can fetch specific metadata from the the IMDSFetcher in botocore:
from botocore.utils import IMDSFetcher
IMDSFetcher()._get_request("/latest/meta-data/instance-type", None).text
This will also work on instances where IMDSv2 is enforced.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Community |
| Solution 2 | Jason |
| Solution 3 |
