Blog
Golang für Ihre AWS Lambda-Funktionen verwenden

Ich wurde auf einem XKE dazu angeregt, ein kurzes Experiment mit der Verwendung von Golang für meine AWS Lambda-Funktionen durchzuführen. Der Auslöser dafür war etwas, das mein Kollege Mark van Holsteijn sagte. (Er hat vor kurzem auch einen Blog über die Verwendung von Golang für benutzerdefinierte Anbieter geschrieben.) Wir sprachen über Nachhaltigkeit. Während dieses Gesprächs machte Mark die Bemerkung, dass wir dann Python für unsere Funktionen aufgeben sollten.
Lassen Sie mich einige Zahlen zwischen Python und Go vergleichen. (Quelle: Welche Programmiersprachen verbrauchen am wenigsten Strom?))
- Energie: 75.88 vs 3.23
- Zeit: 71.90 vs 2.83
- Gedächtnis: 2.80 gegenüber 1.05
Wie Sie sehen können, ist Golang auf der Grundlage dieser Zahlen der klare Gewinner. Aber gibt es noch andere Vorteile? Also, wie immer hat alles seine Vor- und Nachteile. Lassen Sie uns diese erkunden, wenn Sie sich für Golang entscheiden.
Vorkompilierte Binärdatei vs. zur Laufzeit kompiliert
Beginnen wir mit dem Offensichtlichen: eine vorkompilierte Binärdatei gegenüber Code, der zur Laufzeit kompiliert wird. Dies ist einer der Gründe, warum Golang energieeffizienter ist, da Sie nur einmal kompilieren müssen und nicht jedes Mal, wenn Sie es ausführen. Der Vorteil von Python ist jedoch, dass Sie den Quellcode in der AWS-Konsole sehen und verändern können. Das macht es zu einem großartigen Kandidaten für einfache Entwicklung und schnelle Tests. Aber das ist auch ein Problem! Wenn Sie Produktions-Workloads ausführen. Sie möchten nicht, dass Ihre Entwickler Ihren Code über die Konsole ändern. Ja, IAM kann Ihnen dabei helfen, aber das Ändern einer Binärdatei ist über die Konsole nicht möglich.
Sie müssen kompilieren
Warum ist die Notwendigkeit zu kompilieren ein Vorteil? Neben der Leistungsverbesserung prüfen Sie, ob Ihr Programm kompiliert werden kann. Wenn es sich nicht kompilieren lässt, können Sie es nicht einsetzen. Vergleichen Sie dies mit Python: Sie können fehlerhaften Code hochladen. Dies würde Ihre Arbeitslast aufgrund eines Einrückungsproblems unterbrechen. Sie können Prüfungen einbauen, um dies zu verhindern, und das sollten Sie auch! Aber Sie müssen etwas Zusätzliches tun. Bei Golang ist dies bereits von Haus aus vorgesehen.
Abhängigkeiten
In Python haben Sie die Möglichkeit, Inline-Code in AWS CloudFormation-Vorlagen zu erstellen. Ich würde dies niemals empfehlen. Wenn Sie andere Abhängigkeiten benötigen, als die, die verfügbar sind. Sie müssen sie selbst bündeln und als Zip-Datei hochladen. Wenn Ihnen eine Abhängigkeit fehlt, wird der Aufruf Ihrer Funktion zur Laufzeit fehlschlagen. Wenn Sie Golang verwenden, sind die Abhängigkeiten alle in der Binärdatei enthalten. Vor allem, wenn Sie die Option CGO_ENABLED=0 in Ihren Kompilieroptionen einstellen. Dadurch wird sichergestellt, dass alle benötigten Bibliotheken enthalten sind.
Tutorial
Lassen Sie uns einen kleinen Stack mit einer einzelnen Lambda-Funktion bereitstellen. Wir werden AWS SAM für die Bereitstellung verwenden, also stellen Sie bitte sicher, dass Sie es installiert haben.
Bereiten Sie die Dateistruktur vor
Erstellen Sie die Ordner und Dateien, die wir benötigen werden:
mkdir aws-lambda-sample-golang
cd aws-lambda-sample-golang
touch template.yaml
mkdir my-function
touch my-function/Makefile
touch my-function/main.go
SAM-Vorlage
Eine SAM-Vorlage ist nichts anderes als eine CloudFormation-Vorlage. Aber sie enthält die Transformation AWS::Serverless-2016-10-31. Dies ermöglicht Ihnen die Verwendung der Ressource AWS::Serverless::Function. Wenn CloudFormation diese Ressource parst, wird sie in CloudFormation-Ressourcen umgewandelt.
Fügen Sie der Datei template.yaml Folgendes hinzu:
Transform: AWS::Serverless-2016-10-31
Resources:
MyFunction:
Type: AWS::Serverless::Function
BuildMethod:
BuildMethod: makefile
Properties:
Runtime: provided.al2
CodeUri: ./my-function
Handler: bootstrap
MyFunctionLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub /aws/lambda/${MyFunction}
RetentionInDays: 7
Hier sind einige Dinge im Gange. Sie können sehen, dass BuildMethod in der Eigenschaft BuildMethod eingestellt ist. Mit dieser Konfiguration teilen Sie SAM mit, dass Sie ein Makefile verwenden möchten. Makefile wird zum Kompilieren der Lambda-Funktion verwendet. - CodeUri verweist auf die Wurzel des Codes Ihrer Lambda-Funktionen. - Handler verweist auf Ihre binäre Ausgabedatei.
Lassen Sie uns die Datei Makefile erstellen, die wir im Stammverzeichnis der Funktion my-function ablegen müssen. Fügen Sie den folgenden Inhalt in die Datei ein:
build-MyFunction:
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o bootstrap
cp ./bootstrap $(ARTIFACTS_DIR)/.
Die hier verwendete Syntax lautet build-<LOGICAL-ID-OF-CLOUDFORMATION>. Wenn Ihre LogicalId in der Vorlage also HelloWorld lautet. Ihr go build wird Ihre Binärdatei erstellt. Der Befehl copy kopiert die Binärdatei in das Artefakte-Verzeichnis. Dies wird verwendet, wenn Sie Ihre Vorlage bereitstellen.
Beachten Sie die GOARCH. Wenn Sie eine ARM-Funktion verwenden, müssen Sie diese hier ebenfalls angeben.
Lambda Code
Wir müssen unser go-Modul initialisieren und die Abhängigkeit von github.com/aws/aws-lambda-go einbinden:
cd my-function
go mod init my-function
go get github.com/aws/aws-lambda-go
cd ..
Jetzt können wir die my-function/main.go mit etwas Geschäftslogik füllen:
package main
import (
"context"
"log"
"github.com/aws/aws-lambda-go/lambda"
)
type MyEvent struct {
Name string json:"name"
}
func Handler(ctx context.Context, event MyEvent) {
log.Printf("Welcome %s", event.Name)
}
func main() {
lambda.Start(Handler)
}
Und fertig!
Verteilen Sie die Vorlage
Um die Vorlage bereitzustellen, müssen wir zunächst die Binärdatei erstellen. AWS SAM bietet Build-in-Unterstützung für die Erstellung und Paketierung von Lambda-Funktionen.
Hinweis: AWS SAM erstellt einen Bucket in Ihrem Konto, der zum Hochladen der Artefakte verwendet wird.
sam build
sam deploy
--stack-name aws-lambda-sample-golang
--capabilities CAPABILITY_IAM
--resolve-s3
Testen Sie
Sie können nun die Lambda-Funktion mit einer {"name": "Joris Conijn"} Nutzlast aufrufen. Die Protokolle sollten nun anzeigen:
Willkommen Joris Conijn
Für eine vollständige Arbeitskopie können Sie auch mein Nr18/aws-lambda-sample-golang Repository klonen.
Fazit
Für mich würde Golang meine Standardwahl für AWS Lambda-Funktionen werden. Die Tatsache, dass es "nachhaltiger" ist und dass es Sie vor offensichtlichen Fehlern schützt, hat mich überzeugt. Allerdings habe ich einen softwaretechnischen Hintergrund. Daher ist es für mich relativ einfach, die Sprache zu wechseln. Was ist mit Ihnen, würden Sie Golang als Standardsprache verwenden?
Foto von Narcisa Aciko
Verfasst von

Joris Conijn
Joris is the AWS Practise CTO of the Xebia Cloud service line and has been working with the AWS cloud since 2009 and focussing on building event-driven architectures. While working with the cloud from (almost) the start, he has seen most of the services being launched. Joris strongly believes in automation and infrastructure as code and is open to learning new things and experimenting with them because that is the way to learn and grow.
Unsere Ideen
Weitere Blogs
Contact



