Учетные данные метаданных EC2 для выполнения API

#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.