1import json 2from pyquery import PyQuery as pq 3import requests 4 5 6class FetchError(Exception): 7 pass 8 9 10def fetch_endpoints(): 11 # We utilize what the Java SDK publishes as a baseline. 12 resp = requests.get('https://raw2.github.com/aws/aws-sdk-java/master/src/main/resources/etc/regions.xml') 13 14 if int(resp.status_code) != 200: 15 raise FetchError("Failed to fetch the endpoints. Got {0}: {1}".format( 16 resp.status, 17 resp.body 18 )) 19 20 return resp.text 21 22 23def parse_xml(raw_xml): 24 return pq(raw_xml, parser='xml') 25 26 27def build_data(doc): 28 data = {} 29 30 # Run through all the regions. These have all the data we need. 31 for region_elem in doc('Regions').find('Region'): 32 region = pq(region_elem, parser='xml') 33 region_name = region.find('Name').text() 34 35 for endp in region.find('Endpoint'): 36 service_name = endp.find('ServiceName').text 37 endpoint = endp.find('Hostname').text 38 39 data.setdefault(service_name, {}) 40 data[service_name][region_name] = endpoint 41 42 return data 43 44 45def main(): 46 raw_xml = fetch_endpoints() 47 doc = parse_xml(raw_xml) 48 data = build_data(doc) 49 print(json.dumps(data, indent=4, sort_keys=True)) 50 51 52if __name__ == '__main__': 53 main() 54