Skip to content

Commit 3d58d28

Browse files
Robert Prastumaannamalai
andauthored
Upgrade AWS metadata to IMDSv2 (#481)
* Upgrade AWS metadata to IMDSv2 * Add minor changes to IMDS v2 upgrade PR. Co-authored-by: Uma Annamalai <[email protected]>
1 parent c420a0c commit 3d58d28

File tree

1 file changed

+41
-1
lines changed

1 file changed

+41
-1
lines changed

newrelic/common/utilization.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,49 @@ def detect(cls):
160160
class 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

167207
class AzureUtilization(CommonUtilization):
168208
METADATA_HOST = '169.254.169.254'

0 commit comments

Comments
 (0)