Kurze Feedbackzyklen auf AWS Lambda
18.06.2024
•
Robbert Hofman
Eine Makefile, die es ermöglicht, schnell zu iterieren
Was ist AWS Lambda?
AWS Lambda ist ein Rechenservice, der Ihren Code als Reaktion auf Ereignisse [...] ausführt
Sie konfigurieren die Ereignisse, die die Ausführung Ihres Codes auslösen. Dies kann eine HTTP-Anfrage an einem API-Gateway, eine Nachricht zu einem SNS-Thema, ein Bucket-Ereignis von S3 usw. sein.
Sie liefern Ihren Code in einer der drei Formen: 1) buchstäblich, der Quellcode 2) ein Containerbild oder 3) eine ausführbare Datei. Sie konfigurieren den Einstiegspunkt, der die Ereignisdaten akzeptiert, und ab dann kann Ihr Code seine Arbeit tun.

Wie man für AWS Lambda entwickelt — der einfache Weg
Der am einfachsten zu bewerkstelligen Weg, um AWS Lambda-Funktionen zu entwickeln, ist direkt in der AWS-Konsole.

Sie schreiben Code in einem Editor im Browser, definieren eine Testlast, stellen sie bereit und testen, indem Sie zwei Schaltflächen klicken. Ihr Feedback-Zyklus beträgt etwa 5 Sekunden. Obwohl dies schnell und ausreichend für viele Anwendungsfälle ist, gibt es ein paar Nachteile bei diesem Ansatz:
Sie können dies nur für die unterstützten Sprachen tun, im Moment „unterstützt der Konsolen-Code-Editor nur Node.js, Python und Ruby“.
Ihr Code wird nicht in der Versionskontrolle gespeichert.
Sie programmieren nicht in der vollwertigen IDE, die Sie gewohnt sind, mit Ihren persönlichen Erweiterungen, Lintern, Formatierern usw.
Die einzige Testung, die Sie durchführen, erfolgt mit den Testlasten.
Wie man für AWS Lambda entwickelt — der Makefile-Weg
Wenn Sie den Editor im Browser nicht verwenden, müssen Sie Ihren Code paketieren und hochladen. Wir werden es so reibungslos wie möglich mit einem Makefile machen. In diesem Beispiel schreiben wir Go-Code lokal, erstellen eine Go-Binärdatei, zippen sie, laden sie hoch und stellen sie auf AWS Lambda bereit, aber derselbe Ansatz funktioniert auch für andere Verpackungsmethoden. Für den Quellcode müssen Sie auch Ihre Bibliotheken zippen, und für Container müssen Sie den Container erstellen und pushen. Natürlich eröffnet das Arbeiten mit localem Code eine ganze Welt des lokalen Testens, ohne sogar auf AWS Lambda zu deployen. Dies ist sogar schneller, aber irgendwann möchten Sie wahrscheinlich Ihre bereitgestellte Lambda ausprobieren, um z. B. zu überprüfen, ob ihre Rolle alle richtigen Berechtigungen hat. Sobald Sie den „Build → Deploy → Test → Logs“-Zyklus so schnell wie möglich durchführen möchten, kann Ihnen dieser Makefile-Ansatz helfen.
Der erste Schritt besteht darin, Testlasten zu finden, von denen Sie wissen, dass Ihre Lambda sie verarbeiten kann. Speichern Sie sie als .json
-Dateien und legen Sie sie in einen Ordner neben Ihrem Lambda-Code. Wir werden diese verwenden, um die frisch bereitgestellte Lambda auszulösen. Wenn beispielsweise Ihre Lambda HTTP GET-Anfragen verbraucht, würden Sie etwas wie Folgendes als lambda-test-payloads/type1.json
speichern:
Ich erhalte die meisten dieser Testlasten, indem ich die Lambda ihre eingehenden Anfragen ausdrucken lasse und diese dann von den Cloudwatch-Logs kopiere, plus ein bisschen das Austauschen von einfachen Anführungszeichen zu doppelten Anführungszeichen und Großbuchstaben False
zu Kleinbuchstaben false
um es zu einem gültigen JSON zu machen. Wenn cat type1.json | jq
nicht murrt, sind Sie wahrscheinlich gut. Sie können auch die Teile des JSON entfernen, von denen Sie sicher sind, dass Ihre Lambda sie nicht benötigt, in meinem Fall das ganze requestContext
.
Das Feedback, das Sie wünschen, ist, ob Ihre Lambda erfolgreich war, und die Ausführungsprotokolle. Für letzteres gibt es zwei Optionen: entweder 1) die neuesten 4KB von Protokollen aus der Antwort des Trigger zu erhalten oder 2) den Verlauf der Protokolle in einem separaten Terminal zu streamen. Also habe ich etwas Zeit damit verbracht, herauszufinden, wie ich das machen kann, während ich sicherstelle, dass wirklich der neueste Code läuft (das war der schwierige Teil), und dies ist das Makefile, mit dem ich zuletzt geendet habe. Mein Feedback-Zyklus dauert ~15 Sekunden:
LAMBDA_FUNCTION_NAME = "my-function"
LAMBDA_TEST_PAYLOAD_FILE = "lambda-test-payloads/type1.json"
#LAMBDA_TEST_PAYLOAD_FILE = "lambda-test-payloads/type2.json"
# die Go-Binärdatei erstellen
build:
@echo "Baue..."
@# die ausführbare Datei muss "bootstrap" heißen, für AWS Lambda al2023
@# wir bauen für arm64, um der AWS Lambda-Umgebung zu entsprechen
GOOS=linux GOARCH=arm64 go build -o bin/bootstrap .
# zu AWS hochladen
deploy-lambda:
@echo "Bereitstellung auf AWS Lambda..."
@zip -j bin/bootstrap.zip bin/bootstrap
aws lambda update-function-code \
--function-name $(LAMBDA_FUNCTION_NAME) \
--zip-file "fileb://bin/bootstrap.zip" \
| cat
aws lambda wait function-updated-v2 --function-name $(LAMBDA_FUNCTION_NAME)
@echo "Neuer CodeSha256"
@aws lambda get-function --function-name $(LAMBDA_FUNCTION_NAME) | jq '.Configuration.CodeSha256'
# eine Version der Lambda basierend auf dem Commit-Hash anfügen
publish-lambda-version:
@aws lambda publish-version --function-name $(LAMBDA_FUNCTION_NAME)
describe-lambda:
@aws lambda get-function --function-name $(LAMBDA_FUNCTION_NAME)
# die Lambda auslösen
trigger-lambda:
@echo "Rufe die Lambda auf..."
aws lambda invoke \
--no-cli-pager \
--payload fileb://$(LAMBDA_TEST_PAYLOAD_FILE) \
--function-name $(LAMBDA_FUNCTION_NAME) \
--log-type Tail \
/dev/null \
| jq -r '.LogResult' \
| base64 --decode
# Hinweis: Nur die letzten 4KB von Protokollen werden von der API zurückgegeben
# Verlauf aller Protokolle (in einem separaten Terminal ausführen)
stream-lambda-logs:
@aws logs tail /aws/lambda/$(LAMBDA_FUNCTION_NAME) --follow
# den gesamten Entwicklungszyklus ausführen
dev-cycle: build deploy-lambda trigger-lambda
Schreiben Sie dann Ihren Code und führen Sie make dev-cycle
aus, das die Binärdatei erstellt, sie zu AWS Lambda hochlädt, sie auslöst und das Ergebnis zurück ins Terminal druckt. Viel Spaß beim Schreiben von Lambdas!
Danke an Jos Teunissen & Jonathan Merlevede für ihr Korrekturlesen und konstruktives Feedback.
Latest
Portable by design: Rethinking data platforms in the age of digital sovereignty
Build a portable, EU-compliant data platform and avoid vendor lock-in—discover our cloud-neutral stack in this deep-dive blog.
Cloud-Unabhängigkeit: Test eines europäischen Cloud-Anbieters gegen die Giganten
Kann ein europäischer Cloud-Anbieter wie Ionos AWS oder Azure ersetzen? Wir testen es – und finden überraschende Vorteile in Bezug auf Kosten, Kontrolle und Unabhängigkeit.
Vermeide schlechte Daten von Anfang an
Das Erfassen aller Daten ohne Qualitätsprüfungen führt zu wiederkehrenden Problemen. Priorisieren Sie die Datenqualität von Anfang an, um nachgelagerte Probleme zu vermeiden.