Einführung in Serverless-Funktionen in Go mit AWS Lambda
\nDie Serverless-Architektur ist zum Standard für die Erstellung skalierbarer und kosteneffizienter Anwendungen geworden. AWS Lambda ist einer der führenden Anbieter in diesem Bereich, und Go (Golang) ist die ideale Sprache zum Schreiben von Serverless-Funktionen dank seiner Leistung, schnellen Startzeit und geringen Binärgröße. In diesem Artikel behandeln wir den gesamten Arbeitszyklus: von der Erstellung einer einfachen Funktion bis hin zum Deployment und Monitoring.
\nWarum Go? Im Gegensatz zu Node.js oder Python wird Go in eine native Binärdatei kompiliert, was den Kaltstart (Cold Start) auf Dutzende von Millisekunden reduziert. Dies ist für High-Load-Systeme von entscheidender Bedeutung.
\n\nHauptteil
\n\n1. Erstellung und Struktur einer Lambda-Funktion in Go
\nJede Lambda-Funktion in Go beginnt mit dem Import des Pakets github.com/aws/aws-lambda-go/lambda. Betrachten wir ein minimales Beispiel:
package main\n\nimport (\n "github.com/aws/aws-lambda-go/lambda"\n)\n\ntype MyEvent struct {\n Name string `json:"name"`\n}\n\ntype MyResponse struct {\n Message string `json:"message"`\n}\n\nfunc HandleRequest(event MyEvent) (MyResponse, error) {\n return MyResponse{Message: "Hallo, " + event.Name + "!"}, nil\n}\n\nfunc main() {\n lambda.Start(HandleRequest)\n}\n\nWichtige Punkte:
\n- \n
- Handler – die Funktion, die von AWS Lambda aufgerufen wird. Sie kann beliebige Datentypen (Strukturen, Strings, Interfaces) empfangen und zurückgeben. \n
- Kontext – optionales erstes Argument:
func HandleRequest(ctx context.Context, event MyEvent) (MyResponse, error). Ermöglicht die Ausführungsabbrechung bei Timeout. \n - Ein Fehler (error) signalisiert Lambda einen Ausführungsfehler. \n
2. Verarbeitung von Ereignissen verschiedener AWS-Dienste
\nLambda wird häufig als Trigger für Ereignisse von S3, DynamoDB, SQS und API Gateway verwendet. Go unterstützt alle Ereignistypen über das Paket github.com/aws/aws-lambda-go/events.
Beispiel für API Gateway (HTTP-Anfrage):
\npackage main\n\nimport (\n "github.com/aws/aws-lambda-go/lambda"\n "github.com/aws/aws-lambda-go/events"\n)\n\nfunc handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {\n return events.APIGatewayProxyResponse{\n Body: "Hello, World!",\n StatusCode: 200,\n Headers: map[string]string{"Content-Type": "text/plain"},\n }, nil\n}\n\nfunc main() {\n lambda.Start(handler)\n}\n\nBeispiel für S3 (neues Objekt im Bucket):
\npackage main\n\nimport (\n "context"\n "fmt"\n "github.com/aws/aws-lambda-go/lambda"\n "github.com/aws/aws-lambda-go/events"\n)\n\nfunc handler(ctx context.Context, s3Event events.S3Event) error {\n for _, record := range s3Event.Records {\n bucket := record.S3.Bucket.Name\n key := record.S3.Object.Key\n fmt.Printf("Neue Datei: %s im Bucket %s\\n", key, bucket)\n }\n return nil\n}\n\nfunc main() {\n lambda.Start(handler)\n}\n- \n
- Verwenden Sie
events.S3Event,events.SNSEvent,events.DynamoDBEventund andere. \n - Für benutzerdefinierte Ereignisse (z. B. von CloudWatch) verwenden Sie
json.Unmarshal. \n
3. Kompilierung, Deployment und Best Practices
\nGo wird für Linux (Architektur x86_64 oder arm64) kompiliert. Erstellen Sie die Binärdatei für Lambda:
\n# Für x86_64\nGOOS=linux GOARCH=amd64 go build -o bootstrap main.go\n\n# Für ARM (Graviton) – günstiger und schneller\nGOOS=linux GOARCH=arm64 go build -o bootstrap main.go\n\nPacken Sie es dann in eine ZIP-Datei und laden Sie es über die AWS CLI oder Konsole hoch:
\nzip function.zip bootstrap\naws lambda create-function \\\n --function-name my-go-function \\\n --runtime provided.al2023 \\\n --role arn:aws:iam::XXXXXXXXXXX