Serverless-Funktionen in Go: AWS Lambda von A bis Z

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einführung in Serverless-Funktionen in Go mit AWS Lambda

\n

Die 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.

\n

Warum 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\n

Hauptteil

\n\n

1. Erstellung und Struktur einer Lambda-Funktion in Go

\n

Jede Lambda-Funktion in Go beginnt mit dem Import des Pakets github.com/aws/aws-lambda-go/lambda. Betrachten wir ein minimales Beispiel:

\n\n
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\n

Wichtige 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
\n\n

2. Verarbeitung von Ereignissen verschiedener AWS-Dienste

\n

Lambda 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.

\n\n

Beispiel für API Gateway (HTTP-Anfrage):

\n
package 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\n

Beispiel für S3 (neues Objekt im Bucket):

\n
package 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.DynamoDBEvent und andere.
  • \n
  • Für benutzerdefinierte Ereignisse (z. B. von CloudWatch) verwenden Sie json.Unmarshal.
  • \n
\n\n

3. Kompilierung, Deployment und Best Practices

\n

Go 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\n

Packen Sie es dann in eine ZIP-Datei und laden Sie es über die AWS CLI oder Konsole hoch:

\n
zip function.zip bootstrap\naws lambda create-function \\\n    --function-name my-go-function \\\n    --runtime provided.al2023 \\\n    --role arn:aws:iam::XXXXXXXXXXX                

Blogs

Buchempfehlungen