Tutorial: Erstellen eines Webhook-Endpunkts mithilfe einer Lambda-Funktions-URL
In diesem Tutorial erstellen Sie eine Lambda-Funktions-URL, um einen Webhook-Endpunkt zu implementieren. Ein Webhook ist eine einfache, ereignisgesteuerte Kommunikation, die automatisch Daten zwischen Anwendungen über HTTP sendet. Sie können Webhooks verwenden, um sofortige Benachrichtigungen über Ereignisse in einem anderen System zu erhalten, z. B. wenn sich ein neuer Kunde auf einer Website registriert, eine Zahlung verarbeitet wird oder eine Datei hochgeladen wird.
Mit Lambda können Webhooks entweder über Lambda-Funktions-URLs oder API Gateway implementiert werden. Funktions-URLs sind eine gute Wahl für einfache Webhooks, die keine Funktionen wie erweiterte Autorisierung oder Anforderungsvalidierung erfordern.
Tipp
Wenn Sie sich nicht sicher sind, welche Lösung für Ihren speziellen Anwendungsfall am besten geeignet ist, lesen Sie bitte Wählen Sie eine Methode, um Ihre Lambda-Funktion über eine HTTP-Anfrage aufzurufen.
Voraussetzungen
Um dieses Tutorial durchzuführen, muss entweder Python (Version 3.8 oder höher) oder Node.js (Version 18 oder höher) auf Ihrem lokalen Rechner installiert sein.
Um den Endpunkt mit einer HTTP-Anfrage zu testen, verwendet das Tutorial curl
So erstellen Sie die Lambda-Funktion:
Erstellen Sie zunächst die Lambda-Funktion, die ausgeführt wird, wenn eine HTTP-Anfrage an Ihren Webhook-Endpunkt gesendet wird. In diesem Beispiel sendet die sendende Anwendung bei jeder Zahlung eine Aktualisierung und gibt im Hauptteil der HTTP-Anfrage an, ob die Zahlung erfolgreich war. Die Lambda-Funktion analysiert die Anfrage und ergreift entsprechend dem Status der Zahlung Maßnahmen. In diesem Beispiel gibt der Code lediglich die Bestellnummer für die Zahlung aus, aber in einer realen Anwendung würden Sie die Bestellung möglicherweise einer Datenbank hinzufügen oder eine Benachrichtigung senden.
Die Funktion implementiert auch die gängigste Authentifizierungsmethode für Webhooks, die hashbasierte Nachrichtenauthentifizierung (HMAC). Bei dieser Methode teilen sich sowohl die sendende als auch die empfangende Anwendung einen geheimen Schlüssel. Die sendende Anwendung verwendet einen Hash-Algorithmus, um anhand dieses Schlüssels und des Nachrichteninhalts eine eindeutige Signatur zu generieren, und fügt die Signatur als HTTP-Header in die Webhook-Anfrage ein. Die empfangende Anwendung wiederholt diesen Schritt, generiert die Signatur unter Verwendung des geheimen Schlüssels und vergleicht den resultierenden Wert mit der im Anfrage-Header gesendeten Signatur. Stimmt das Ergebnis überein, wird die Anfrage als legitim angesehen.
Erstellen Sie die Funktion mithilfe der Lambda-Konsole mit der Python- oder Node.js-Laufzeit.
Erstellen des geheimen Schlüssels
Damit die Lambda-Funktion die Webhook-Anfrage authentifizieren kann, verwendet sie einen geheimen Schlüssel, den sie mit der aufrufenden Anwendung teilt. In diesem Beispiel wird der Schlüssel in einer Umgebungsvariablen gespeichert. Schließen Sie in einer Produktionsanwendung keine sensiblen Informationen wie Passwörter in Ihren Funktionscode ein. Erstellen Sie stattdessen ein AWS Secrets Manager-Secret und verwenden Sie dann die AWS-Parameter und Secrets-Lambda-Erweiterung, um Ihre Anmeldeinformationen in Ihrer Lambda-Funktion abzurufen.
Erstellen und Speichern des geheimen Webhook-Schlüssels
-
Generieren Sie eine lange, zufällige Zeichenfolge mit einem kryptografisch sicheren Zufallszahlengenerator. Sie können die folgenden Codeausschnitte in Python oder Node.js verwenden, um einen 32-stelligen geheimen Schlüssel zu generieren und auszudrucken, oder Ihre eigene bevorzugte Methode verwenden.
-
Speichern Sie Ihre generierte Zeichenfolge als Umgebungsvariable für Ihre Funktion:
-
Wählen Sie auf der Registerkarte Konfiguration für Ihre Funktion die Option Umgebungsvariablen aus.
-
Wählen Sie Bearbeiten aus.
-
Wählen Sie Umgebungsvariablen hinzufügen aus.
-
Geben Sie für Schlüssel
WEBHOOK_SECRETein und dann für Wert den geheimen Schlüssel, den Sie im vorherigen Schritt generiert haben. -
Wählen Sie Speichern.
-
Sie werden diesen geheimen Schlüssel später im Tutorial erneut verwenden müssen, um Ihre Funktion zu testen. Notieren Sie ihn sich daher jetzt.
Erstellen des Funktions-URL-Endpunkts
Erstellen Sie einen Endpunkt für Ihren Webhook mithilfe einer Lambda-Funktions-URL. Da Sie den Authentifizierungstyp NONE verwenden, um einen Endpunkt mit öffentlichem Zugriff zu erstellen, kann jeder, der über die URL verfügt, Ihre Funktion aufrufen. Weitere Informationen zum Steuern des Zugriffs auf Funktions-URLs finden Sie unter Kontrolle des Zugriffs auf Lambda-Funktions-URLs. Wenn Sie erweiterte Authentifizierungsoptionen für Ihren Webhook benötigen, sollten Sie die Verwendung von API Gateway in Betracht ziehen.
Erstellen des Funktions-URL-Endpunkts
-
Wählen Sie auf der Registerkarte Konfiguration Ihrer Funktion die Option Funktions-URL aus.
-
Wählen Sie Funktions-URL erstellen.
-
Wählen Sie als Authentifizierungstyp die Option KEINEN aus.
-
Wählen Sie Speichern.
Der Endpunkt für die Funktions-URL, die Sie gerade erstellt haben, wird im Bereich Funktions-URL angezeigt. Kopieren Sie den Endpunkt, um ihn später im Tutorial zu verwenden.
Testen der Funktion in der Konsole
Bevor Sie eine HTTP-Anfrage verwenden, um Ihre Funktion über den URL-Endpunkt aufzurufen, testen Sie sie in der Konsole, um sicherzustellen, dass Ihr Code wie erwartet funktioniert.
Um die Funktion in der Konsole zu überprüfen, berechnen Sie zunächst eine Webhook-Signatur unter Verwendung des zuvor im Tutorial generierten geheimen Schlüssels mit den folgenden Test-JSON-Nutzdaten:
{ "type": "payment.success", "orderId": "1234", "amount": "99.99" }
Verwenden Sie eines der folgenden Python- oder Node.js-Codebeispiele, um die Webhook-Signatur mit Ihrem eigenen geheimen Schlüssel zu berechnen.
Sie können Ihren Funktionscode jetzt mit einer Test-HTTP-Anfrage in der Konsole testen.
Testen der Funktion in der Konsole
-
Wählen Sie die Registerkarte Code für Ihre Funktion aus.
-
Wählen Sie im Abschnitt TESTEREIGNISSE die Option Neues Testereignis erstellen aus.
-
Geben Sie als Event name (Ereignisname) die Zeichenfolge
myEventein. -
Ersetzen Sie das vorhandene JSON, indem Sie Folgendes kopieren und in den Bereich Ereignis-JSON einfügen. Ersetzen Sie die Webhook-Signatur durch den im vorherigen Schritt berechneten Wert.
{ "headers": { "Content-Type": "application/json", "x-webhook-signature": "2d672e7a0423fab740fbc040e801d1241f2df32d2ffd8989617a599486553e2a" }, "body": "{\"type\": \"payment.success\", \"orderId\": \"1234\", \"amount\": \"99.99\"}" } -
Wählen Sie Speichern.
-
Wählen Sie Invoke aus.
Die Ausgabe sollte folgendermaßen oder ähnlich aussehen:
Testen der Funktion mit einer HTTP-Anfrage
Testen Sie Ihren Webhook-Endpunkt mit dem Befehlszeilentool curl.
Testen der Funktion mit HTTP-Anfragen
-
Führen Sie in einem Terminal- oder Shell-Programm den folgenden curl-Befehl aus. Ersetzen Sie die URL durch den Wert für Ihren eigenen Funktions-URL-Endpunkt und ersetzen Sie die Webhook-Signatur durch die Signatur, die Sie mit Ihrem eigenen geheimen Schlüssel berechnet haben.
curl -X POSThttps://ryqgmbx5xjzxahif6frvzikpre0bpvpf.lambda-url.us-west-2.on.aws/\ -H "Content-Type: application/json" \ -H "x-webhook-signature:d5f52b76ffba65ff60ea73da67bdf1fc5825d4db56b5d3ffa0b64b7cb85ef48b" \ -d '{"type": "payment.success", "orderId": "1234", "amount": "99.99"}'Die Ausgabe sollte folgendermaßen aussehen:
{"received": true} -
Überprüfen Sie die CloudWatch-Protokolle für Ihre Funktion, um sicherzustellen, dass die Nutzdaten korrekt analysiert wurde. Gehen Sie dazu wie folgt vor:
-
Öffnen Sie in der Amazon-CloudWatch-Konsole die Seite Protokollgruppe
. -
Wählen Sie die Protokollgruppe Ihrer Funktion (
/aws/lambda/myLambdaWebhook). -
Wählen Sie den neuesten Protokoll-Stream.
In den Protokollen Ihrer Funktion sollte eine Ausgabe ähnlich der folgenden zu sehen sein:
-
-
Überprüfen Sie, ob Ihr Code eine ungültige Signatur erkennt, indem Sie den folgenden curl-Befehl ausführen. Ersetzen Sie die URL durch Ihren eigenen Funktions-URL-Endpunkt.
curl -X POSThttps://ryqgmbx5xjzxahif6frvzikpre0bpvpf.lambda-url.us-west-2.on.aws/\ -H "Content-Type: application/json" \ -H "x-webhook-signature: abcdefg" \ -d '{"type": "payment.success", "orderId": "1234", "amount": "99.99"}'Die Ausgabe sollte folgendermaßen aussehen:
{"error": "Invalid signature"}
Bereinigen Ihrer Ressourcen
Sie können jetzt die Ressourcen, die Sie für dieses Tutorial erstellt haben, löschen, es sei denn, Sie möchten sie behalten. Durch das Löschen von AWS-Ressourcen, die Sie nicht mehr verwenden, können Sie verhindern, dass unnötige Gebühren in Ihrem AWS-Konto-Konto anfallen.
So löschen Sie die Lambda-Funktion:
-
Öffnen Sie die Seite Funktionen
der Lambda-Konsole. -
Wählen Sie die Funktion aus, die Sie erstellt haben.
-
Wählen Sie Actions, Delete.
-
Geben Sie
confirmin das Texteingabefeld ein und wählen Sie Delete (Löschen) aus.
Als Sie die Lambda-Funktion in der Konsole erstellt haben, hat Lambda auch eine Ausführungsrolle für Ihre Funktion erstellt.
So löschen Sie die Ausführungsrolle
-
Öffnen Sie die Seite Roles (Rollen)
in der IAM-Konsole. -
Wählen Sie die von Lambda erstellte Ausführungsrolle aus. Die Rolle weist das Benennungsformat
myLambdaWebhook-role-<random string>auf. -
Wählen Sie Löschen aus.
-
Geben Sie den Namen der Rolle in das Texteingabefeld ein und wählen Sie Delete (Löschen) aus.