#python #amazon-web-services #amazon-ec2 #python-requests #boto3
Вопрос:
Я использую учетные записи EC2 для аутентификации API в среде AWS. Экземпляр EC2 имеет прикрепленную роль IAM, и роль IAM имеет разрешение на выполнение API.
Ниже сценарий получает учетные данные IAM из метаданных EC2 и вызывает API. Каким-то образом учетные данные аутентификации не могут выполнить вызов. мы пытаемся выполнить этот API из
import json
import sys
import requests
from aws_requests_auth.aws_auth import AWSRequestsAuth
import boto3
from ec2_metadata import ec2_metadata
def get_auth_token():
iam_role=requests.get('http://169.254.169.254/latest/meta-data/iam/security-credentials/')
print(iam_role.text)
response = requests.get('http://169.254.169.254/latest/meta-data/iam/security-credentials/' iam_role.text)
credentials = response.json()
print(credentials)
#print(credentials['AccessKeyId'])
#print(credentials['SecretAccessKey'])
#print(credentials['Token'])
return credentials
output = {}
try:
'''
Authenticate API
@param access_key, secret_key,host, region, service: Token
'''
auth = get_auth_token()
'''
@sample:
Execute API
@param method, url, headers, body, auth: response
'''
response = requests.request(method,jsonInput['url'],auth=auth, data=body,headers=headers) #jsonInput['body']
json_data = response.json().get('status')
# If *********** API Executed Successfully ****
if response.status_code == 202 and response.json().get('status') == 'success':
output['status_code']=response.status_code
output['status']=response.json().get('status')
output['message']=response.json().get('message')
output['headers']=response.headers['Location']
#print (json.dumps(output))
# If *********** API Execution Unsuccessful ************
else:
output['status_code']=response.status_code
output['status']=response.json().get('status')
output['message']=response.json().get('message')
#print (json.dumps(output))
# *********** Exception Caught **********
except requests.exceptions.Timeout as et:
output['status_code']= 'Timeout'
output['status']='failed'
output['message']= str(et)
#print("Timeout: ",et)
except requests.exceptions.HTTPError as eh:
output['status_code']='HTTPError'
output['status']='failed'
output['message'] = str(eh)
#print("HTTPError: ",eh)
except requests.exceptions.ConnectionError as errc:
output['status_code']= 'ConnectionError '
output['status']='failed'
output['message'] = (str(errc))
#print ("Error Connecting:",errc)
except requests.exceptions.RequestException as err:
output['status_code']='GENErr'
output['status']='failed'
output['message'] = str(err)
print (json.dumps(output))
получение ниже ошибки
response = requests.request(method,jsonInput['url'],auth=auth, data=body,headers=headers) #jsonInput['body']
File "C:Program FilesPython39libsite-packagesrequestsapi.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "C:Program FilesPython39libsite-packagesrequestssessions.py", line 528, in request
prep = self.prepare_request(req)
File "C:Program FilesPython39libsite-packagesrequestssessions.py", line 456, in prepare_request
p.prepare(
File "C:Program FilesPython39libsite-packagesrequestsmodels.py", line 320, in prepare
self.prepare_auth(auth, url)
File "C:Program FilesPython39libsite-packagesrequestsmodels.py", line 551, in prepare_auth
r = auth(self)
TypeError: 'dict' object is not callable
Комментарии:
1. Чего вы на самом деле хотите достичь (то есть чего , а не как )? Похоже, вы хотите выполнить вызов API с использованием учетных данных AWS, но что вы пытаетесь вызвать? Что такое «API в среде AWS» — это сервис AWS или что-то, работающее на вашем собственном экземпляре Amazon EC2?
2. Чтение роли из метаданных экземпляра происходит по умолчанию при инициализации boto3. Вам не нужно ничего делать вручную.
3.
boto3.client('someservice')
это все, что требуется для аутентификации и использования службы с профилем экземпляра IAM.