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.

Simple lambda triggered

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.

writing code directly


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:


{  "version": "2.0",  "routeKey": "$default",  "rawPath": "/documents",  "rawQueryString": "user_id=4&query=dataminded",  "headers": {    "x-forwarded-port": "443",    "x-forwarded-for": "xx.xx.xx.xx",  },  "queryStringParameters": {    "user_id": "4",    "query": "dataminded"  },  "isBase64Encoded": false


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
Portable by design: Rethinking data platforms in the age of digital sovereignty
Portable by design: Rethinking data platforms in the age of digital sovereignty

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
Cloud-Unabhängigkeit: Test eines europäischen Cloud-Anbieters gegen die Giganten
Cloud-Unabhängigkeit: Test eines europäischen Cloud-Anbieters gegen die Giganten

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.

Hören Sie auf, schlechte Qualitätsdaten zu laden
Hören Sie auf, schlechte Qualitätsdaten zu laden
Hören Sie auf, schlechte Qualitätsdaten zu laden

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.

Hinterlasse deine E-Mail-Adresse, um den Dataminded-Newsletter zu abonnieren.

Hinterlasse deine E-Mail-Adresse, um den Dataminded-Newsletter zu abonnieren.

Hinterlasse deine E-Mail-Adresse, um den Dataminded-Newsletter zu abonnieren.

Belgien

Vismarkt 17, 3000 Leuven - HQ
Borsbeeksebrug 34, 2600 Antwerpen


USt-IdNr. DE.0667.976.246

Deutschland

Spaces Kennedydamm,
Kaiserswerther Strasse 135, 40474 Düsseldorf, Deutschland


© 2025 Dataminded. Alle Rechte vorbehalten.


Vismarkt 17, 3000 Leuven - HQ
Borsbeeksebrug 34, 2600 Antwerpen

USt-IdNr. DE.0667.976.246

Deutschland

Spaces Kennedydamm, Kaiserswerther Strasse 135, 40474 Düsseldorf, Deutschland

© 2025 Dataminded. Alle Rechte vorbehalten.


Vismarkt 17, 3000 Leuven - HQ
Borsbeeksebrug 34, 2600 Antwerpen

USt-IdNr. DE.0667.976.246

Deutschland

Spaces Kennedydamm, Kaiserswerther Strasse 135, 40474 Düsseldorf, Deutschland

© 2025 Dataminded. Alle Rechte vorbehalten.