Eine Lambda-Funktion mit einem JSON-Ereignis ausführen

AWSBeginner
Jetzt üben

Einführung

Ein Team für den Bestellabschluss benötigt eine Funktion, die eine Bestellsumme berechnet. Du stellst einen kurzen Python-Handler bereit, sendest zwei JSON-Eingaben und ergänzt die Berechnung um eine Bearbeitungsgebühr. Verwende ganzzahlige Centbeträge, um die Rechnung einfach zu halten, und entferne anschließend deine Funktion und Logs.

Schließe zuerst Erste Schritte mit AWS auf LabEx, Temporäre Zugangsdaten mit einer IAM-Rolle verwenden und Eine fehlgeschlagene Anfrage in CloudWatch Logs finden ab. Diese neue Umgebung stellt CLI, Arbeitsbereich und Ausführungsrolle bereit.

Bezug zu Zertifizierungen

Dieses Lab bietet praktische Übungen zu den folgenden Prüfungsthemen.

Eine Bestellberechnung bereitstellen

In diesem Schritt ersetzt du einen unfertigen Handler und stellst eine Funktion bereit. AWS Lambda führt deinen Code aus, wenn du eine Funktion aufrufst. Ein Ereignis ist die Eingabe für diesen Aufruf; ein Handler ist die Python-Funktion, die Lambda damit aufruft. Die Einstellung app.handler bezeichnet die Funktion namens handler in app.py.

Wechsle in den vorbereiteten Arbeitsbereich und prüfe das Gerüst. Es gibt derzeit ein leeres Objekt zurück und kann deshalb keine Bestellung berechnen.

cd /home/labex/project
cat app.py

Python verwendet Einrückungen, um Anweisungen innerhalb einer Funktion zu gruppieren. event["quantity"] liest einen Wert aus dem eingehenden JSON-Objekt. * multipliziert die Menge mit dem Stückpreis; return sendet das berechnete Objekt an den Aufrufer. context liefert Informationen zum Aufruf, obwohl diese Berechnung sie noch nicht benötigt.

Ersetze das Gerüst durch diesen vollständigen Handler. cat > app.py schreibt die Zeilen zwischen <<'PY' und dem abschließenden PY in die Datei. Die Abschlusszeile muss allein stehen.

cat > app.py <<'PY'
import json

def handler(event, context):
    order_id = event["order_id"]
    quantity = event["quantity"]
    unit_price = event["unit_price_cents"]
    total = quantity * unit_price
    print("EVENT " + json.dumps(event))
    return {"order_id": order_id, "total_cents": total}
PY

Die print-Anweisung schreibt die Eingabe in Ausführungslogs; sie gibt nicht die Antwort zurück. Halte Kundengeheimnisse aus Logs heraus. Diese Ereignisse enthalten nur synthetische Kennungen und Zahlen.

Erstelle ein Zip-Paket, das Archiv, das Lambda bereitstellt. Lege app.py auf seiner obersten Ebene ab, damit der Handler gefunden werden kann. Die Ausführungsrolle ist die Identität, die Lambda beim Ausführen deines Codes verwendet. Diese vorbereitete Rolle unterstützt die Protokollierung; Datenzugriff konfigurierst du in einem späteren Lab. Lies ihren ARN in eine Shellvariable ein. Ein ARN identifiziert eine bestimmte Ressource; die Variable erspart dir das manuelle Kopieren.

zip -q function.zip app.py
ROLE_ARN=$(aws iam get-role --role-name labex-fn01-execution --query 'Role.Arn' --output text)

Stelle die Funktion mit der Python-3.12-Laufzeit und einem Zeitlimit von fünf Sekunden bereit. fileb:// liest das Archiv als Bytes. Die Laufzeit wählt die Sprachumgebung; der Timeout-Wert begrenzt einen Aufruf.

aws lambda create-function --function-name labex-fn01-quote --runtime python3.12 --handler app.handler --role "$ROLE_ARN" --zip-file fileb://function.zip --timeout 5 --query '{Name:FunctionName,Runtime:Runtime,Handler:Handler,Timeout:Timeout,CodeSize:CodeSize}'

Erwarte Name labex-fn01-quote, Runtime python3.12, Handler app.handler, Timeout 5 und eine positive CodeSize. Das Erstellen der Funktion stellt Code bereit; es ruft den Handler nicht auf.

AWS View zeigt Funktion, Handler und Code-Fingerabdruck. Die Aufruflogs sind noch leer. Die Referenz-Log-Gruppe enthält unbeteiligte Plattformdaten und muss unverändert bleiben.

Zwei JSON-Ereignisse aufrufen

In diesem Schritt rufst du die bereitgestellte Funktion mit zwei unterschiedlichen Bestellungen auf und interpretierst ihre Antworten. JSON stellt ein Objekt mit benannten Feldern dar. Zahlen haben keine Anführungszeichen; Zeichenketten schon. Jeder Aufruf erhält sein eigenes Ereignis.

Die Bereitstellung speichert dein Codepaket; ein Aufruf liefert ein Ereignis und führt seinen Handler aus.

Schreibe das erste Ereignis: zwei Artikel zu je 375 Cent.

cat > small.json <<'JSON'
{"order_id":"fn01-small","quantity":2,"unit_price_cents":375}
JSON

Rufe die Funktion auf und speichere ihre Antwort. --cli-binary-format raw-in-base64-out ermöglicht der CLI, gewöhnliches JSON als Nutzdaten anzunehmen. file:// liest den Ereignistext; der abschließende Dateiname nimmt die zurückgegebenen Nutzdaten auf.

aws lambda invoke --function-name labex-fn01-quote --cli-binary-format raw-in-base64-out --payload file://small.json small-response.json
cat small-response.json

Der Befehl meldet StatusCode 200. Die Antwortdatei sollte {"order_id":"fn01-small","total_cents":750} enthalten. Der Status der Dienstanfrage und die vom Handler zurückgegebenen Daten sind unterschiedliche Nachweise; prüfe auch die Nutzdaten.

Sende eine zweite Bestellung, ohne den Code erneut bereitzustellen. Fünf Artikel zu 120 Cent sollten eine andere Summe ergeben.

cat > large.json <<'JSON'
{"order_id":"fn01-large","quantity":5,"unit_price_cents":120}
JSON
aws lambda invoke --function-name labex-fn01-quote --cli-binary-format raw-in-base64-out --payload file://large.json large-response.json
cat large-response.json

Erwarte {"order_id":"fn01-large","total_cents":600}. Die Eingabewerte bestimmen die Berechnung derselben Funktion.

Vergleiche in AWS View Bestell-IDs, Mengen, Preise und Summen. Die Funktionskonfiguration bleibt gleich, während sich die Aufrufeinträge ändern. Öffne Show logs für eine der Bestellungen, um ihre Eingabe und das zurückgegebene Ergebnis zu sehen.

Den Code aktualisieren und sein Ergebnis nachverfolgen

In diesem Schritt ergänzt du eine Bearbeitungsgebühr von 100 Cent und bestätigst, dass ein neuer Aufruf die aktualisierte Berechnung ausführt. Eine Änderung der lokalen Datei app.py ändert den bereitgestellten Code nicht; aktualisiere das Paket und sende es an Lambda.

Ersetze den Handler durch diese Überarbeitung. Nur die Berechnung ändert sich: + 100 addiert die Gebühr nach der Multiplikation.

cat > app.py <<'PY'
import json

def handler(event, context):
    order_id = event["order_id"]
    quantity = event["quantity"]
    unit_price = event["unit_price_cents"]
    total = quantity * unit_price + 100
    print("EVENT " + json.dumps(event))
    return {"order_id": order_id, "total_cents": total}
PY
zip -q function.zip app.py
aws lambda update-function-code --function-name labex-fn01-quote --zip-file fileb://function.zip --query '{Name:FunctionName,CodeSHA:CodeSha256}'

Die Bereitstellung gibt den Namen und einen SHA-Fingerabdruck des Codes zurück. AWS View zeigt den geänderten Fingerabdruck; frühere Aufrufergebnisse bleiben in Logs erhalten.

Zum Vergleich mit der Konsole zeigt das offizielle Beispiel die Python-Datei neben den Bedienelementen Deploy und Test. Seine lambda_function.py und lambda_handler entsprechen app.py und handler in diesem Lab; fahre hier mit dem Terminal-Arbeitsablauf fort.

Offizielles Beispiel der Lambda-Konsole mit einer Python-Datei und Bedienelementen für die Bereitstellung.

Quelle: AWS-Lambda-Leitfaden.

Verwende die Mengen der ersten Bestellung mit einer neuen Zuordnungs-ID.

cat > revised.json <<'JSON'
{"order_id":"fn01-revised","quantity":2,"unit_price_cents":375}
JSON
aws lambda invoke --function-name labex-fn01-quote --cli-binary-format raw-in-base64-out --payload file://revised.json revised-response.json
cat revised-response.json

Erwarte {"order_id":"fn01-revised","total_cents":850}: 750 Cent für Artikel plus die Gebühr von 100 Cent. Die erste Antwort bleibt 750; das Aktualisieren des Codes schreibt den Verlauf nicht um.

Ausführungslogs werden in /aws/lambda/<function-name> gespeichert. Rufe Nachrichten mit dieser Bestell-ID ab, um ihr Ereignis mit der berechneten Antwort zu verbinden.

aws logs filter-log-events --log-group-name /aws/lambda/labex-fn01-quote --filter-pattern '"fn01-revised"' --query 'events[].message'

Erwarte die EVENT-Eingabe und das zurückgegebene Objekt mit der Summe 850. Vollständige Streams enthalten außerdem Aufrufbeginn, Aufrufende und Laufzeitberichte, getrennt von der Bestellantwort.

Kehre zu AWS View zurück. Vergleiche die drei tatsächlichen Einträge, öffne Show logs für fn01-revised und ordne seine Eingabe dem Ergebnis von 850 Cent zu. Die Referenz bleibt unverändert.

Die bereitgestellte Überarbeitung gibt 850 Cent zurück, während die früheren berechneten Summen und Referenz-Logs unverändert bleiben.

Die Funktion entfernen und Referenz-Logs erhalten

In diesem Schritt löschst du nur die Funktion und ihre Ausführungs-Log-Gruppe und bestätigst anschließend, dass die unbeteiligte Referenz erhalten bleibt. Funktion und Log-Gruppe sind separate Ressourcen; das Löschen der Funktion allein entfernt gespeicherte Logs nicht.

Lösche genau die Funktion und rufe anschließend erfolgreich den Bestand ab.

aws lambda delete-function --function-name labex-fn01-quote
aws lambda list-functions --query 'Functions[].FunctionName'

Erwarte eine leere Liste. Ein Authentifizierungs- oder Verbindungsfehler würde die Löschung nicht belegen.

Entferne die eigenen Ausführungslogs und liste die verbleibenden Gruppen auf.

aws logs delete-log-group --log-group-name /aws/lambda/labex-fn01-quote
aws logs describe-log-groups --query 'logGroups[].logGroupName'

Nur /labex/labex-fn01-reference sollte erhalten bleiben. Lies ihre Nachricht, um nachzuweisen, dass die Bereinigung unbeteiligte Daten erhalten hat.

aws logs get-log-events --log-group-name /labex/labex-fn01-reference --log-stream-name platform --query 'events[].message'

Erwarte INFO platform reference keep unchanged. AWS View zeigt keine bereitgestellte Funktion oder Aufruflogs, während die Referenz erhalten bleibt. Die vorbereitete Rolle und Identität sind Bestandteile der Umgebung; der Widerruf von Zugangsdaten und das Herunterfahren folgen auf die Ressourcenprüfungen.

Zusammenfassung

Du hast einen Python-Handler geschrieben, ein Zip-Paket bereitgestellt und Summen aus zwei JSON-Ereignissen berechnet. Du hast die bereitgestellte Berechnung aktualisiert, ihr neues Ergebnis Ausführungslogs zugeordnet und ausschließlich die Funktion sowie ihre Log-Gruppe gelöscht, während Referenzdaten erhalten geblieben sind.