Skip to content

Instantly share code, notes, and snippets.

@monkut
Created November 15, 2017 07:24
Show Gist options
  • Save monkut/01ea8492b8a07ea427fc20c3ec490af9 to your computer and use it in GitHub Desktop.
Save monkut/01ea8492b8a07ea427fc20c3ec490af9 to your computer and use it in GitHub Desktop.
Provides a simple (top-level only) wrapper around the AWS ec2 instance metadata interface
import requests
METADATA_URL = 'http://169.254.169.254/latest/meta-data/'
class AmiMetaDataManager:
"""
Provides a simple wrapper around the AWS ec2 instance metadata interface
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
"""
def __init__(self, url=METADATA_URL):
self._url = url
self._metadata_fields = self.get_metadata_fields(url)
# creates a function for returning each metadata fieldname value
for field in self._metadata_fields:
def createfunc(fieldname):
def func():
return self.get_field_value(fieldname)
return func
created_function = createfunc(field)
setattr(self.__class__, 'get_{}'.format(field), staticmethod(created_function))
def get_metadata_fields(self, url=METADATA_URL):
response = requests.get(url)
lines = response.text.split('\n')
# available attributes are returned as a list of lines
fields = [field.strip() for field in lines if field and not field.endswith('/')]
return fields
def get_field_value(self, fieldname):
url = '{}{}'.format(self._url, fieldname)
response = requests.get(url)
return response.text.strip()
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('-l', '--list-fields',
dest='list_fields',
action='store_true',
help='If given, fields will be listed')
parser.add_argument('-f', '--field',
help='Get field value for given field')
args = parser.parse_args()
metamgr = AmiMetaDataManager()
available_fields = metamgr.get_metadata_fields()
if args.list_fields:
print('Available Fields:')
for f in available_fields:
print('\t{}'.format(f))
elif args.field in available_fields:
result = metamgr.get_field_value(args.field)
print(result)
else:
print('ERROR -- ({}) not in: {}'.format(args.field, ', '.join(available_fields)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment