Created
November 15, 2017 07:24
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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