Serverless-Funktionen in Go: AWS Lambda von A bis Z
Die Serverless-Architektur ist zum De-facto-Standard für die Erstellung skalierbarer und kosteneffizienter Anwendungen in der Cloud geworden. AWS Lambda ist einer der beliebtesten Dienste zur Ausführung von Code ohne Serververwaltung. In diesem Artikel werden wir uns ansehen, wie man Serverless-Funktionen in Go (Golang) in AWS Lambda erstellt, konfiguriert und deployed – von den Grundlagen bis zu fortgeschrittenen Techniken.
Warum Go für AWS Lambda?
Go ist die ideale Sprache für Serverless-Funktionen. Es wird in eine einzige Binärdatei kompiliert, hat eine minimale Kaltstartzeit (oft unter 100 ms) und einen geringen Speicherverbrauch. Dies macht es zu einer der schnellsten und günstigsten Optionen für Lambda.
- Schneller Start: Die kompilierte Binärdatei startet sofort.
- Niedrige Kosten: Minimaler Ressourcenverbrauch senkt die Cloud-Rechnungen.
- Einfaches Deployment: Eine Datei – keine Abhängigkeiten auf der Serverseite.
- Hervorragende Integration: Native Unterstützung des AWS SDK für Go.
Einrichtung der Umgebung und erster Handler
Bevor Sie Code schreiben, stellen Sie sicher, dass Folgendes installiert ist:
- Go Version 1.19+
- Das AWS CLI-Tool (mit Zugriffsschlüsseln konfiguriert)
- Make oder ein beliebiges Build-System (optional)
Erstellen Sie ein neues Modul und installieren Sie das offizielle Paket für Lambda:
mkdir my-lambda-functioncd my-lambda-functiongo mod init my-lambda-functiongo get github.com/aws/aws-lambda-go/lambdaSchreiben wir nun eine einfache Funktion, die eine Begrüßung zurückgibt:
package main
import ( "context" "github.com/aws/aws-lambda-go/lambda")
type MyEvent struct { Name string `json:"name"`}
type MyResponse struct { Message string `json:"message"`}
func HandleRequest(ctx context.Context, event MyEvent) (MyResponse, error) { if event.Name == "" { event.Name = "Gast" } return MyResponse{Message: "Hallo, " + event.Name + "!"}, nil}
func main() { lambda.Start(HandleRequest)}Dieser Code akzeptiert ein JSON mit dem Feld name und gibt eine personalisierte Begrüßung zurück. Beachten Sie: Die Funktion muss exportiert sein (Großbuchstabe) und die Signatur muss strikt den Erwartungen der Laufzeitumgebung entsprechen.
Build und Deployment auf AWS Lambda
Für eine Linux-kompatible Binärdatei (genau diese erwartet Lambda) verwenden Sie Cross-Kompilierung:
GOOS=linux GOARCH=amd64 go build -o bootstrap main.gozip function.zip bootstrapDer Name der Ausgabedatei muss bootstrap sein – dies ist eine Anforderung der Go-Laufzeitumgebung in AWS Lambda.
Erstellen wir nun die Funktion über die AWS CLI:
aws lambda create-function \ --function-name my-go-function \ --runtime provided.al2023 \ --role arn:aws:iam::123456789012:role/lambda-execution-role \ --handler bootstrap \ --zip-file fileb://function.zipBeachten Sie --runtime provided.al2023 – dies ist die spezielle Laufzeitumgebung für Go (basierend auf Amazon Linux 2023). Wenn Sie eine ältere Version haben, verwenden Sie provided.al2.
Testen Sie die Funktion nach der Erstellung:
aws lambda invoke --function-name my-go-function \ --payload '{"name": "Welt"}' output.jsoncat output.jsonSie sollten Folgendes sehen: {"message":"Hallo, Welt!"}
Arbeiten mit AWS-Ereignissen (S3, DynamoDB, API Gateway)
Die wahre Stärke von Lambda zeigt sich bei der Integration mit anderen AWS-Diensten. Betrachten wir ein Beispiel für einen Handler für Ereignisse von S3:
package main
import ( "context" "fmt" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda")
func HandleS3Event(ctx context.Context, s3Event even