web-dev-qa-db-de.com

Kein Modul mit dem Namen "request_aws4auth" beim Import in ein Lambda

Ich benötige mein Lambda zum Aufrufen eines API-Gateways und habe den folgenden Code als Inline-Code für das Lambda in meiner Cloud-Formationsvorlage.

from requests_aws4auth import AWS4Auth
def handler(event,context):
          client = boto3.client('sts')
          responseAssumeRole = client.assume_role(
            DurationSeconds=3600,
            RoleArn='arn',// real arn of the api gateway invocation role
            RoleSessionName='Bob',
          )
          credentials = responseAssumeRole['Credentials']
          auth = AWS4Auth(aws_access_key=responseAssumeRole['Credentials']['AccessKeyId'],
                                 aws_secret_access_key=responseAssumeRole['Credentials']['SecretAccessKey'],
                                 aws_Host='Host.execute-api.us-east-1.amazonaws.com',
                                 aws_region='us-east-1',
                                 aws_service='execute-api')
          headers= {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'}
          response = requests.get('https://Host.execute-api.us-east-1.amazonaws.com/test',
                                  auth=auth, headers=headers)

Dies gibt mir den folgenden Fehler

No module named 'requests_aws4auth'

Jede Lösung oder alternative Möglichkeit, die Authentifizierung mithilfe der aws-Anmeldeinformationen zu erstellen, ist ebenfalls willkommen.

3
SandaruMK

Packen Sie den Quellcode und die Abhängigkeiten in eine Zip-Datei, laden Sie ihn in S3 hoch und verwenden Sie dann die Eigenschaften S3Bucket und S3Keys unter Ihrer AWS :: Lambda :: Function-Ressource.

z.B. Unter Linux:

mkdir project-dir
cp myhandler.py project-dir
pip install module-name -t /path/to/project-dir

# Zip the contents of project-dir , this is your deployment package
cd project-dir
Zip -r deployme.Zip .
3
carlsborg

Sie haben den Methodenteil Ihres Codes nicht erreicht, der Fehler wurde ausgelöst, weil ein Modul fehlt, das Sie importieren möchten (in der ersten Zeile). Gehen Sie zu Ihrem Terminal und geben Sie pip install requests-aws4auth ein. Vergewissern Sie sich dann, dass die Installation fehlerfrei ist. Möglicherweise können Sie dann fortfahren.

Zu Ihrer Information, Sie sollten erwägen, Pycharm oder ein anderes IDE zu verwenden, das Sie darüber informiert, wo sich Ihr Problem befindet, und Vorschläge zur Behebung dieser Probleme enthält

1
NotSoShabby

Obwohl die akzeptierte Antwort funktioniert, möchte ich diese Ressource auch posten. Wenn Sie es nicht paketieren und auf S3 hochladen möchten und dennoch nach einem alternativen Ansatz suchen, um dieselbe Funktionalität in einem Inline-Lambda zu erhalten, ist dies hilfreich. Wenn Sie diesen Ansatz verwenden, müssen Sie zunächst nicht "request_aws4auth" verwenden.

https://docs.aws.Amazon.com/general/latest/gr/sigv4-signed-request-examples.html

Sie können Folgendes ersetzen

access_key = os.environ.get('AWS_ACCESS_KEY_ID')
secret_key = os.environ.get('AWS_SECRET_ACCESS_KEY')

mit den Werten, die Sie aus der Übernahmerollenanforderung erhalten haben

access_key=responseAssumeRole['Credentials']['AccessKeyId']
secret_key=responseAssumeRole['Credentials']['SecretAccessKey']
0
SandaruMK