Ich habe 2 Lambda-Funktionen - eine, die ein Angebot erstellt, und eine, die ein Angebot in eine Bestellung umwandelt. Ich möchte, dass die Order Lambda-Funktion die Quote-Funktion aufruft, um das Angebot neu zu generieren, anstatt es nur von einem nicht vertrauenswürdigen Client zu erhalten.
Ich habe überall gesucht, wo ich mir vorstellen kann - aber ich kann nicht sehen, wie ich die Funktionen verketten oder aufrufen würde ... das gibt es sicherlich!
Antworten:
Ich habe einen Weg gefunden mit dem
aws-sdk
.Sie finden das Dokument hier: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html
quelle
InvocationType: 'Event'
Parameters zum Laufen bringen (nachFunctionName
und hinzufügenPayload
). Aus den Dokumenten: "Sie können optional eine asynchrone Ausführung anfordern, indem Sie Event als InvocationType angeben." Bei der asynchronen Ausführung wird die Rückruffunktion zuverlässig aufgerufen, ohne jedoch warten zu müssen, bis das aufgerufene Lambda die Ausführung beendet hat.AWSLambdaRole
. Sie können der vorhandenen Richtlinie Ihrer Rolle auch das folgende Anweisungsobjekt hinzufügen: '{"Effekt": "Zulassen", "Aktion": ["Lambda: InvokeFunction"], "Ressource": ["*"]} `Sie sollten Ihre
Lambda functions
Via verkettenSNS
. Dieser Ansatz bietet eine gute Leistung, Latenz und Skalierbarkeit bei minimalem Aufwand.Ihr erster
Lambda
veröffentlicht Nachrichten an SieSNS Topic
und der zweiteLambda
hat dieses Thema abonniert. Sobald Nachrichten im Thema eintreffen, wird der zweiteLambda
mit der Nachricht als Eingabeparameter ausgeführt.Siehe Aufrufen von Lambda-Funktionen mithilfe von Amazon SNS-Benachrichtigungen .
Sie können diesen Ansatz auch verwenden, um kontenübergreifende Lambda-Funktionen über SNS aufzurufen .
quelle
Hier ist ein Beispielcode für Python:
Übrigens müssten Sie Ihrer Lambda-Rolle auch eine solche Richtlinie hinzufügen
quelle
datetime.now()
in einen String konvertieren (oder irgendwie damit umgehen). Andernfalls erhalten Sie den Fehlerdatetime.datetime(2017, 9, 11, 14, 40, 53, 23834) is not JSON serializable
InvocationType
sollte sein :RequestResponse
. Um die Antwort von dem Lambda zu erhalten, das Sie aufrufen möchten.Seit diese Frage gestellt wurde, hat Amazon Step Functions ( https://aws.amazon.com/step-functions/ ) veröffentlicht.
Eines der Grundprinzipien von AWS Lambda ist, dass Sie sich mehr auf die Geschäftslogik und weniger auf die Anwendungslogik konzentrieren können, die alles miteinander verbindet. Mit Step-Funktionen können Sie komplexe Interaktionen zwischen Funktionen orchestrieren, ohne dafür den Code schreiben zu müssen.
quelle
Diese Lösung wird mit boto3 und Python durchgeführt:
quelle
Ich wollte SNS ausschneiden, bis ich dies in den Lambda-Client-Dokumenten (Java-Version) sah :
SNS hat also einen offensichtlichen Vorteil: Es ist asynchron. Ihr Lambda wartet nicht auf den Abschluss des nachfolgenden Lambda.
quelle
Amazon hat 2016 in AWS Lambda Stufenfunktionen eingeführt. Ich denke, jetzt ist es bequemer, die Stufenfunktion zu verwenden, da sie wirklich einfach zu verwenden ist. Sie können eine Zustandsmaschine mit zwei Lambda-Funktionen erstellen:
Sie können dies einfach wie folgt tun:
Hier können Sie den ersten Status für die Erstellung eines Angebots und einen weiteren für die Reihenfolge festlegen
Mit den Steps-Funktionen können Sie ganz einfach mehrere Lambda-Funktionen schreiben und nacheinander oder parallel ausführen. Sie können weitere Informationen über Lambda - Schritte - Funktionen erhalten hier: Steps Funktionen
quelle
Ich arbeite mit der Antwort zur Verfügung gestellt von Blueskin aber ich konnte die Payload Antwort nicht lesen , weil die InvocationType = ‚Ereignis‘ ist async , so dass ich als InvocationType geändert = ‚Requestresponse‘ und jetzt funktioniert alles gut.
quelle
In Java können wir Folgendes tun:
Hier ist Payload Ihr String- Java-Objekt, das als Json-Objekt an ein anderes Lambda übergeben werden muss, falls Sie einige Informationen vom Aufruf von Lambda an das aufgerufene Lambda übergeben müssen.
quelle
Möglicherweise können Sie die Async.js-Wasserfallfunktion verwenden. Ein Beispiel finden Sie im unteren Teil des großen Codeblocks in Schritt 3 dieses Dokuments:
https://aws.amazon.com/blogs/compute/better-together-amazon-ecs-and-aws-lambda/
quelle
Sie können direkt Lambda - Funktion aufrufen (zumindest über Java) unter Verwendung von
AWSLambdaClient
wie in dem Blog der AWS Post .quelle
Ich habe das gleiche Problem, aber die von mir implementierte Lambda-Funktion fügt einen Eintrag in DynamoDB ein, sodass meine Lösung DynamoDB-Trigger verwendet.
Ich lasse die DB für jede Einfügung / Aktualisierung in der Tabelle eine Lambda-Funktion aufrufen, wodurch die Implementierung von zwei Lambda-Funktionen getrennt wird.
Die Dokumentation finden Sie hier: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.html
Hier ist eine Anleitung: https://aws.amazon.com/blogs/aws/dynamodb-update-triggers-streams-lambda-cross-region-replication-app/
quelle
Eine Art Kreisverkehrslösung, aber ich rufe nur den API-Endpunkt für meine Lambda-Funktionen auf, wenn ich sie verketten muss. Auf diese Weise können Sie beim Codieren entscheiden, ob sie asynchron sein sollen oder nicht.
Wenn Sie keine POST-Anforderung einrichten möchten, können Sie einfach eine einfache GET-Anforderung mit einigen oder gar keinen Abfragezeichenfolgenparametern einrichten, um die Ereignisübergabe zu vereinfachen.
- Bearbeiten -
Siehe: https://docs.aws.amazon.com/apigateway/api-reference/making-http-requests/
und: http://docs.aws.amazon.com/lambda/latest/dg/with-on-demand-https-example.html
quelle
Andere wiesen darauf hin, SQS- und Schrittfunktionen zu verwenden. Beide Lösungen verursachen jedoch zusätzliche Kosten. Schritt Funktionszustandsübergänge sind angeblich sehr teuer.
AWS Lambda bietet eine Wiederholungslogik. Wo es 3 mal was versucht. Ich bin nicht sicher, ob dies noch gültig ist, wenn Sie es über die API auslösen.
quelle
Hier ist das Python-Beispiel für den Aufruf einer anderen Lambda-Funktion, die ihre Antwort erhält. Es gibt zwei Aufrufarten 'RequestResponse' und 'Event' . Verwenden Sie 'RequestResponse', wenn Sie die Antwort der Lambda-Funktion erhalten möchten, und verwenden Sie 'Event', um die Lambda-Funktion asynchron aufzurufen. Es stehen also sowohl asynchrone als auch synchrone Möglichkeiten zur Verfügung.
quelle
Sie können die AWS_REGION-Umgebung festlegen.
quelle