@@ -160,9 +160,49 @@ def detect(cls):
160160class AWSUtilization (CommonUtilization ):
161161 EXPECTED_KEYS = ('availabilityZone' , 'instanceId' , 'instanceType' )
162162 METADATA_HOST = '169.254.169.254'
163- METADATA_PATH = '/2016-09-02/dynamic/instance-identity/document'
163+ METADATA_PATH = '/latest/dynamic/instance-identity/document'
164+ METADATA_TOKEN_PATH = '/latest/api/token'
165+ HEADERS = {'X-aws-ec2-metadata-token-ttl-seconds' : '21600' }
164166 VENDOR_NAME = 'aws'
165167
168+ @classmethod
169+ def fetchAuthToken (cls ):
170+ try :
171+ with cls .CLIENT_CLS (cls .METADATA_HOST ,
172+ timeout = cls .FETCH_TIMEOUT ) as client :
173+ resp = client .send_request (method = 'PUT' ,
174+ path = cls .METADATA_TOKEN_PATH ,
175+ params = cls .METADATA_QUERY ,
176+ headers = cls .HEADERS )
177+ if not 200 <= resp [0 ] < 300 :
178+ raise ValueError (resp [0 ])
179+ return resp [1 ]
180+ except Exception as e :
181+ _logger .debug ('Unable to fetch %s data from %s%s: %r' ,
182+ cls .VENDOR_NAME , cls .METADATA_HOST , cls .METADATA_PATH , e )
183+ return None
184+
185+ @classmethod
186+ def fetch (cls ):
187+ try :
188+ authToken = cls .fetchAuthToken ()
189+ if authToken == None :
190+ return
191+ cls .HEADERS = {"X-aws-ec2-metadata-token" : authToken }
192+ with cls .CLIENT_CLS (cls .METADATA_HOST ,
193+ timeout = cls .FETCH_TIMEOUT ) as client :
194+ resp = client .send_request (method = 'GET' ,
195+ path = cls .METADATA_PATH ,
196+ params = cls .METADATA_QUERY ,
197+ headers = cls .HEADERS )
198+ if not 200 <= resp [0 ] < 300 :
199+ raise ValueError (resp [0 ])
200+ return resp [1 ]
201+ except Exception as e :
202+ _logger .debug ('Unable to fetch %s data from %s%s: %r' ,
203+ cls .VENDOR_NAME , cls .METADATA_HOST , cls .METADATA_PATH , e )
204+ return None
205+
166206
167207class AzureUtilization (CommonUtilization ):
168208 METADATA_HOST = '169.254.169.254'
0 commit comments