Stellen Sie sich ein kleines Programm vor, das nur laufen soll, wenn jemand es aufruft: die Meldung entgegennehmen, dass ein Kunde bezahlt hat, ein Kontaktformular verarbeiten, ein Bild umwandeln. Dafür wollen Sie keinen Server, der 24 Stunden eingeschaltet ist. Dafür gibt es Lambda: Sie geben Amazon Ihren Code, und Amazon führt ihn nur dann aus, wenn es nötig ist, und berechnet Ihnen nur diese Zeit. Keine Maschinen, die gepflegt werden müssen.
Die Frage ist: Wie rufen Sie ihn auf? Das Universellste ist, ihm eine Webadresse zu geben, eine URL wie https://algo.on.aws/, sodass jeder Browser oder jedes Programm sie „öffnen“ kann und Ihr Code antwortet. Diese Anleitung macht genau das mit der Option, die Lambda von Haus aus mitbringt und Funktions-URL heißt. Es muss nichts weiter installiert oder gebucht werden.
Bevor Sie anfangen: was die Begriffe bedeuten
- Lambda-Funktion
- Ein Stück Code von Ihnen (in Python, Node.js usw.), das bei Amazon gespeichert ist, ausgeführt wird, wenn etwas es aufruft, und sich danach abschaltet. Sie zahlen pro Ausführung, nicht dafür, dass etwas eingeschaltet ist.
- URL
- Eine Webadresse, das, was man in die Adresszeile des Browsers schreibt. Hier: die Adresse, über die Ihre Funktion aufgerufen werden kann.
- Anfrage und Antwort
- Wenn ein Browser oder ein Programm eine URL öffnet, schickt er eine „Anfrage“ (was er will) und erhält eine „Antwort“ (was zurückgegeben wird). Ihre Funktion erhält die Anfrage und erzeugt die Antwort.
- Webhook
- Eine automatische Meldung, die ein Dienst (zum Beispiel Ihr Zahlungsanbieter) an eine URL von Ihnen schickt, wenn etwas passiert. Um sie zu empfangen, brauchen Sie eine URL, die antwortet: Diese Anleitung gibt sie Ihnen.
- API Gateway
- Ein anderer Dienst von Amazon, umfangreicher und komplexer, mit dem man ebenfalls eine Webadresse vor eine Funktion setzen kann. Jahrelang war er die einzige Option. Heute ist er für die meisten einfachen Fälle nicht nötig, und diese Anleitung verwendet ihn nicht.
- CORS
- Eine Sicherheitsregel der Browser: Eine Webseite darf Adressen anderer Websites nur aufrufen, wenn diese es ausdrücklich erlauben. Wenn Ihre Funktion von einer eigenen Webseite aufgerufen werden soll, müssen Sie Lambda sagen, welche Seiten das dürfen.
- Protokolle (Logs)
- Das Tagebuch dessen, was Ihre Funktion bei jeder Ausführung tut: wie lange sie gebraucht hat, ob sie fehlgeschlagen ist und warum. Sie werden in einem anderen Dienst namens CloudWatch gespeichert.
Schritt für Schritt
Prüfen Sie, ob Ihre Funktion auf eine Webanfrage antworten kann
Wenn die Funktion über ihre Webadresse aufgerufen wird, übergibt Lambda ihr ein Datenpaket mit der Anfrage (was angefragt wurde, mit welchen Daten) und erwartet, dass Ihr Code eine Antwort mit zwei Dingen zurückgibt: einem Statuscode (200 bedeutet „alles in Ordnung“) und einem Body (der Text oder die Daten, die Sie zurückgeben). Wenn Ihre Funktion für einen anderen Zweck geschrieben wurde, muss sie angepasst werden. Ein Minimalbeispiel in Node.js, das „hallo, Welt“ antwortet:
export const handler = async (event) => ({ statusCode: 200, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ hola: "mundo" }) });Wenn Sie nicht selbst programmieren, geben Sie diesen Absatz an die Person weiter, die es tut: Sie wird wissen, was gemeint ist.
Entscheiden Sie, wer die Funktion aufrufen darf
Das ist die einzige wichtige Entscheidung dieser Anleitung, und man sollte sie gut verstehen. Es gibt zwei Optionen:
- Nur mit AWS-Anmeldedaten (die Option heißt
AWS_IAM): Nur ein Programm von Ihnen, das Berechtigungen in Ihrem Amazon-Konto hat, kann sie aufrufen. Das ist die sicherste, aber ein normaler Browser oder ein externer Dienst können sie nicht nutzen. - Offen (die Option heißt
NONE): Jeder, der die Adresse kennt, kann sie aufrufen. Das brauchen Sie, wenn ein externer Dienst (ein Webhook) oder eine Webseite sie aufrufen soll. Im Gegenzug muss Ihr Code für die Sicherheit sorgen: bei jedem Aufruf ein Passwort oder eine Signatur prüfen. Das sehen wir im letzten Schritt.
Einfache Regel: Wenn Sie nicht wissen, welche Sie wählen sollen, nehmen Sie die erste. Wenn die Funktion Aufrufe von außerhalb Ihres Kontos empfangen muss, nehmen Sie die zweite und überspringen Sie den letzten Schritt nicht.
- Nur mit AWS-Anmeldedaten (die Option heißt
Aktivieren Sie die Webadresse
Öffnen Sie in der AWS-Konsole Lambda, öffnen Sie Ihre Funktion und klicken Sie auf den Reiter Konfiguration. Wählen Sie im Menü links Funktions-URL und klicken Sie auf Funktions-URL erstellen. Wählen Sie den Zugriffstyp aus dem vorherigen Schritt.
Wenn eine eigene Webseite von einer anderen Domain aus sie aufrufen soll, klappen Sie CORS auf und tragen Sie die Adresse dieser Seite unter „Ursprung zulassen“ ein (zum Beispiel
https://miweb.com). Wenn Sie ein Sternchen setzen, kann jede Website der Welt sie vom Browser aus aufrufen; vermeiden Sie das, außer Sie wollen genau das. Speichern. Oben erscheint die neue Adresse, die so aussieht:https://xxxxxxxx.lambda-url.eu-west-1.on.aws/. Das ist Ihre URL.Probieren Sie sie aus
Wenn Sie die offene Option gewählt haben, kopieren Sie die Adresse und fügen Sie sie in den Browser ein: Sie sollten die Antwort Ihrer Funktion sehen (im Beispiel den Text „hallo, Welt“). Sie funktioniert bereits.
Wenn Sie sie lieber aus einem Terminal testen, geben Sie in CloudShell (das Terminalsymbol in der oberen Leiste der AWS-Konsole) ein:
curl -i https://xxxxxxxx.lambda-url.eu-west-1.on.aws/Wenn Sie die Option mit Anmeldedaten gewählt haben, sagt der Browser „Forbidden“: Das ist zu erwarten, weil er keine Anmeldedaten mitschickt. Den Test muss das Programm von Ihnen machen, das sie aufrufen soll, mit den AWS-Bibliotheken, die die Anfragen bereits signieren können.
Sehen Sie sich das Tagebuch der Ausführungen an
Reiter Überwachen, Schaltfläche CloudWatch-Protokolle anzeigen. Jeder Aufruf hinterlässt einen Vermerk mit der Dauer und dem, was Ihr Code geschrieben hat. Wenn ein Aufruf einen Fehler zurückgibt, sehen Sie hier den Grund. Ein Tipp, der Geld spart: Setzen Sie in dieser Protokollgruppe eine Aufbewahrung von zum Beispiel 30 Tagen; sonst werden die Protokolle für immer gespeichert und berechnet.
Wenn Sie sie offen gelassen haben, schützen Sie sie
Offen heißt, dass jeder sie aufrufen kann, also muss Ihr Code bei jedem Aufruf etwas prüfen. Üblich ist: Der Dienst, der Ihnen den Webhook schickt, fügt jeder Meldung eine Signatur oder einen geheimen Schlüssel bei, und Ihre Funktion prüft, ob er korrekt ist, bevor sie etwas tut. Diesen Schlüssel speichern Sie in den Umgebungsvariablen der Funktion (Reiter Konfiguration), nicht im Code.
Und setzen Sie eine Obergrenze, wie oft sie gleichzeitig laufen darf (reservierte Parallelität, unter Konfiguration): Wenn jemand die Adresse bombardiert, verhindert die Obergrenze, dass die Rechnung explodiert.
Was schiefgehen kann
Die Webseite meldet etwas mit „CORS“ und bekommt keine Antwort
Das ist der Browser, der den Benutzer schützt: Ihre Funktion hat nicht gesagt, dass diese Seite sie aufrufen darf. Bearbeiten Sie die Funktions-URL, Abschnitt CORS, und fügen Sie die genaue Adresse Ihrer Seite und die Art der Anfrage hinzu, die sie verwendet (GET, POST). Wenn Ihr Code zusätzlich selbst CORS-Header zurückgibt, entfernen Sie sie an einer der beiden Stellen: doppelt schlagen sie ebenfalls fehl.
Sie gibt „Forbidden“ zurück, obwohl ich sie offen gelassen habe
Der Funktion fehlt die Berechtigung, die jeden aufrufen lässt. Beim Erstellen der URL über die Konsole wird sie automatisch hinzugefügt; wenn ein Programm oder ein Skript sie erstellt hat, bitten Sie die Person, die das getan hat, die Berechtigung lambda:InvokeFunctionUrl für die Öffentlichkeit (Principal *) hinzuzufügen.
Der erste Aufruf dauert mehrere Sekunden, danach geht es schnell
Das nennt sich „Kaltstart“: Wenn die Funktion eine Weile nicht benutzt wurde, muss Amazon sie neu laden. Für einen Webhook ist das egal. Für eine Website mit wartenden Benutzern lässt es sich verringern, indem man die Funktion kleiner macht oder dafür zahlt, dass sie immer bereit ist (bereitgestellte Parallelität).
Ich brauche die Adresse unter meiner Domain, oder will steuern, wer wie oft aufruft
Dafür braucht es dann API Gateway, den umfangreicheren Dienst, den wir am Anfang erwähnt haben, oder CloudFront davor. Die Funktions-URL ist der kurze Weg und reicht für die meisten; wenn sie nicht mehr ausreicht, werden Sie es merken.
In Simplio
In Simplio erscheinen Ihre Lambda-Funktionen mit ihrem Status und ihren Protokollen in einer Liste; wenn sie in Python, Node.js oder Ruby geschrieben sind, können Sie den Code bearbeiten, mit dem zweiten Faktor speichern und sie sofort testen und dabei die Antwort sehen. Und ihnen eine Webadresse zu geben ist ein Klick, mit klar erklärtem Zugriffstyp. Jede Person in Ihrem Team sieht nur die Funktionen, die Sie ihr zuweisen.
Dasselbe, in AWS und in Simplio
| In der AWS-Konsole | In Simplio | |
|---|---|---|
| Der Funktion die Webadresse geben | Lambda, Konfiguration, Funktions-URL, Zugriffstyp, CORS: 5 Schritte | Schaltfläche „Öffentliche URL“ an der Funktion, mit erklärtem Zugriffstyp: 1 Klick |
| Sie testen und sehen, was sie zurückgegeben hat | Browser oder curl, und CloudWatch für die Protokolle | Aus Simplio testen und Antwort und Protokolle auf derselben Seite sehen |
| Den Code ändern | Lambda-Editor, ohne Kontrolle, wer ihn angefasst hat | Editor mit zweitem Faktor beim Speichern und Aktivitätsprotokoll |