37

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?

BMW
  • 42,880
  • 12
  • 99
  • 116
user2123288
  • 1,103
  • 1
  • 13
  • 22

3 Answers3

18

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.

Community
  • 1
  • 1
Nath
  • 748
  • 4
  • 16
3

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
Jason
  • 9,408
  • 5
  • 36
  • 36
barbasa
  • 675
  • 4
  • 22
2

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.

Steven
  • 2,050
  • 23
  • 20
  • This does not work fir IMDSv2 enforced enviroments. as a third argument `token=IMDSFetcher()._fetch_metadata_token()` must be given. otherwise this is the only valid answer to the origin question! – Markus Jan 18 '23 at 08:20