Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Bereitstellen von Go-Lambda-Funktionen mit Container-Images
Es gibt zwei Möglichkeiten, ein Container-Image für eine Go Lambda-Funktion zu erstellen:
-
Es wird ein AWS reines Betriebssystem-Basisimage verwendet
Go wird anders implementiert als andere verwaltete Laufzeiten. Da Go nativ zu einer ausführbaren Binärdatei kompiliert wird, ist keine spezielle Sprachlaufzeit erforderlich. Verwenden Sie ein Basis-Image nur für das Betriebssystem, um Go-Images für Lambda zu erstellen. Um das Image mit Lambda kompatibel zu machen, müssen Sie das
aws-lambda-go/lambda
-Paket in das Image aufnehmen. -
Es wird ein AWS Nicht-Basis-Image verwendet
Sie können auch ein alternatives Basis-Image aus einer anderen Container-Registry verwenden. Sie können auch ein von Ihrer Organisation erstelltes benutzerdefiniertes Image verwenden. Um das Image mit Lambda kompatibel zu machen, müssen Sie das
aws-lambda-go/lambda
-Paket in das Image aufnehmen.
Tipp
Um die Zeit zu reduzieren, die benötigt wird, bis Lambda-Container-Funktionen aktiv werden, siehe die Docker-Dokumentation unter Verwenden mehrstufiger Builds
Auf dieser Seite wird erklärt, wie Sie Container-Images für Lambda erstellen, testen und bereitstellen.
AWS Basis-Images für die Bereitstellung von Go-Funktionen
Go wird anders implementiert als andere verwaltete Laufzeiten. Da Go nativ zu einer ausführbaren Binärdatei kompiliert wird, ist keine spezielle Sprachlaufzeit erforderlich. Verwenden Sie ein reines Betriebssystem-Basisimage, um Go-Funktionen für Lambda bereitzustellen.
Name | ID | Betriebssystem | Datum der Veraltung | Blockfunktion erstellen | Blockfunktion aktualisieren |
---|---|---|---|---|---|
Reine OS-Laufzeit |
|
Amazon Linux 2023 |
Nicht geplant |
Nicht geplant |
Nicht geplant |
Reine OS-Laufzeit |
|
Amazon Linux 2 |
Nicht geplant |
Nicht geplant |
Nicht geplant |
Öffentliche Galerie der Registry von Amazon Elastic Container: gallery.ecr.aws/lambda/provided
Laufzeitschnittstellen-Clients von Go
Das aws-lambda-go/lambda
-Paket enthält eine Implementierung der Laufzeitschnittstelle. Beispiele für die Verwendung von aws-lambda-go/lambda
in Ihrem Image finden Sie unter Es wird ein AWS reines Betriebssystem-Basisimage verwendet oder Es wird ein AWS Nicht-Basis-Image verwendet.
Es wird ein AWS reines Betriebssystem-Basisimage verwendet
Go wird anders implementiert als andere verwaltete Laufzeiten. Da Go nativ zu einer ausführbaren Binärdatei kompiliert wird, ist keine spezielle Sprachlaufzeit erforderlich. Verwenden Sie ein Basis-Image nur für das Betriebssystem, um Container-Images für Go-Funktionen zu erstellen.
Tags | Laufzeit | Betriebssystem | Dockerfile | Ablehnung |
---|---|---|---|---|
al2023 |
Reine OS-Laufzeit | Amazon Linux 2023 | Dockerfile für reine Betriebssystem-Runtime aktiviert GitHub |
Nicht geplant |
al2 |
Reine OS-Laufzeit | Amazon Linux 2 | Dockerfile für reine Betriebssystem-Runtime aktiviert GitHub |
Nicht geplant |
Weitere Informationen zu diesen Basisbildern finden Sie in der ECR öffentlichen Galerie von Amazon.
Sie müssen das aws-lambda-go/lambda-Paket
Zur Durchführung der Schritte in diesem Abschnitt benötigen Sie Folgendes:
So erstellen und implementieren Sie eine Go-Funktion mit dem provided.al2023
-Basis-Image.
-
Erstellen Sie ein Verzeichnis für das Projekt und wechseln Sie dann zu diesem Verzeichnis.
mkdir hello cd hello
-
Initialisieren Sie ein neues Go-Modul.
go mod init
example.com/hello-world
-
Fügen Sie die Lambda-Bibliothek als Abhängigkeit Ihres neuen Moduls hinzu.
go get github.com/aws/aws-lambda-go/lambda
-
Erstellen Sie eine Datei namens
main.go
und öffnen Sie diese dann in einem Text-Editor. Dies ist der Code für die Lambda-Funktion. Sie können den folgenden Beispielcode zum Testen verwenden oder ihn durch Ihren eigenen ersetzen.package main import ( "context" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { response := events.APIGatewayProxyResponse{ StatusCode: 200, Body: "\"Hello from Lambda!\"", } return response, nil } func main() { lambda.Start(handler) }
-
Verwenden Sie einen Texteditor, um ein Dockerfile in Ihrem Projektverzeichnis zu erstellen.
-
Die folgende Beispiel-Docker-Datei verwendet eine mehrstufige Entwicklung
. Dadurch können Sie in jedem Schritt ein anderes Basis-Image verwenden. Sie können ein Image verwenden, z. B. ein Go-Basis-Image , um Ihren Code zu kompilieren und die ausführbare Binärdatei zu erstellen. Sie können dann ein anderes Image verwenden, z. B. provided.al2023
in derFROM
-Abschlusserklärung, um das Image zu definieren, das Sie für Lambda bereitstellen. Der Build-Prozess ist vom endgültigen Bereitstellungs-Image getrennt, so dass das endgültige Image nur die Dateien enthält, die zum Ausführen der Anwendung benötigt werden. -
Sie können das optionale
lambda.norpc
Tag verwenden, um die Komponente Remote Procedure Call (RPC) aus der Lambda-Bibliothekauszuschließen. Die RPC Komponente ist nur erforderlich, wenn Sie die veraltete Go 1.x-Laufzeit verwenden. RPCDurch den Ausschluss von wird die Größe des Bereitstellungspakets reduziert. -
Beachten Sie, dass das Dockerfile-Beispiel keine Anweisung enthält. USER
Wenn Sie ein Container-Image auf Lambda bereitstellen, definiert Lambda automatisch einen Standard-Linux-Benutzer mit den am wenigsten privilegierten Rechten. Dies unterscheidet sich vom Standardverhalten von Docker, bei dem standardmäßig der Benutzer verwendet wird, wenn keine Anweisung bereitgestellt wird. root
USER
Beispiel – Mehrstufige Docker-Datei
Anmerkung
Stellen Sie sicher, dass die Version von Go, die Sie in der Docker-Datei angeben (z. B.
golang:1.20
), dieselbe Version von Go ist, mit der Sie Ihre Anwendung erstellt haben.FROM
golang:1.20
as build WORKDIR /helloworld # Copy dependencies list COPY go.mod go.sum ./ # Build with optional lambda.norpc tag COPY main.go . RUN go build-tags lambda.norpc
-o main main.go # Copy artifacts to a clean image FROMpublic.ecr.aws/lambda/provided:al2023
COPY --from=build /helloworld/main ./main ENTRYPOINT [ "./main" ] -
-
Erstellen Sie Ihr Docker-Image mit dem docker build
-Befehl. Das folgende Beispiel benennt das Bild in docker-image
und gibt ihm dentest
Tag. docker build --platform linux/amd64 -t
docker-image
:test
.Anmerkung
Der Befehl gibt die
--platform linux/amd64
-Option an, um sicherzustellen, dass Ihr Container mit der Lambda-Ausführungsumgebung kompatibel ist, unabhängig von der Architektur des Entwicklungsrechners. Wenn Sie beabsichtigen, eine Lambda-Funktion mithilfe der ARM64 Befehlssatzarchitektur zu erstellen, müssen Sie den Befehl so ändern, dass er stattdessen die--platform linux/arm64
Option verwendet.
Verwenden Sie den Laufzeit-Schnittstellen-Emulatorprovided.al2023
-Basis-Image enthalten.
So führen Sie den Laufzeit-Schnittstellen-Emulator auf Ihrem lokalen Computer aus
-
Starten Sie Ihr Docker-Image mit dem docker run-Befehl. Beachten Sie Folgendes:
-
docker-image
ist der Image-Name undtest
ist das Tag. -
./main
istENTRYPOINT
aus Ihrem Dockerfile.
docker run -d -p 9000:8080 \ --entrypoint /usr/local/bin/aws-lambda-rie \
docker-image:test ./main
Dieser Befehl führt das Image als Container aus und erstellt einen lokalen Endpunkt bei
localhost:9000/2015-03-31/functions/function/invocations
. -
-
Veröffentlichen Sie in einem neuen Terminalfenster ein Ereignis mit einem curl-Befehl an den folgenden Endpunkt:
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
Dieser Befehl ruft die Funktion mit einem leeren Ereignis auf und gibt eine Antwort zurück. Für einige Funktionen ist möglicherweise eine JSON Nutzlast erforderlich. Beispiel:
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '
{"payload":"hello world!"}
' -
Die Container-ID erhalten.
docker ps
-
Verwenden Sie den Befehl docker kill
, um den Container zu anzuhalten. Ersetzen Sie in diesem Befehl 3766c4ab331c
durch die Container-ID aus dem vorherigen Schritt.docker kill
3766c4ab331c
Um das Bild auf Amazon hochzuladen ECR und die Lambda-Funktion zu erstellen
-
Führen Sie den get-login-password
Befehl aus, um den Docker bei Ihrer ECR Amazon-Registrierung CLI zu authentifizieren. -
Setzen Sie den
--region
Wert auf den AWS-Region Ort, an dem Sie das ECR Amazon-Repository erstellen möchten. -
111122223333
Ersetzen Sie es durch Ihre AWS-Konto ID.
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin111122223333
.dkr.ecr.us-east-1
.amazonaws.com -
-
Erstellen Sie mit dem ECR Befehl create-repository ein Repository
in Amazon. aws ecr create-repository --repository-name
hello-world
--regionus-east-1
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLEAnmerkung
Das ECR Amazon-Repository muss sich im selben Format AWS-Region wie die Lambda-Funktion befinden.
Wenn erfolgreich, sehen Sie eine Antwort wie diese:
{ "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
-
Kopieren Sie das
repositoryUri
aus der Ausgabe im vorherigen Schritt. -
Führen Sie den Befehl docker tag
aus, um Ihr lokales Image als neueste Version in Ihrem ECR Amazon-Repository zu taggen. In diesem Befehl gilt Folgendes: -
docker-image:test
ist der Name und das TagIhres Docker-Images. Dies sind der Imagename und das Tag, die Sie im docker build
Befehl angegeben haben. -
Ersetzen Sie
<ECRrepositoryUri>
durch denrepositoryUri
, den Sie kopiert haben. Stellen Sie sicher, dass Sie:latest
am Ende des angebenURI.
docker tag docker-image:test
<ECRrepositoryUri>
:latestBeispiel:
docker tag
docker-image
:test
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
-
Führen Sie den Befehl docker push
aus, um Ihr lokales Image im ECR Amazon-Repository bereitzustellen. Stellen Sie sicher, dass Sie es :latest
am Ende des Repositorys URI einschließen.docker push
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
Erstellen Sie eine Ausführungsrolle für die Funktion, wenn Sie noch keine haben. Im nächsten Schritt benötigen Sie den Amazon-Ressourcennamen (ARN) der Rolle.
-
So erstellen Sie die Lambda-Funktion: Geben Sie für
ImageUri
das Repository URI von früher an. Stellen Sie sicher, dass Sie:latest
am Ende des angebenURI.aws lambda create-function \ --function-name
hello-world
\ --package-type Image \ --code ImageUri=111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest \ --rolearn:aws:iam::111122223333:role/lambda-ex
Anmerkung
Sie können eine Funktion mit einem Bild in einem anderen AWS Konto erstellen, sofern sich das Bild in derselben Region wie die Lambda-Funktion befindet. Weitere Informationen finden Sie unter ECRKontoübergreifende Amazon-Berechtigungen.
-
Die Funktion aufrufen.
aws lambda invoke --function-name
hello-world
response.jsonDas Ergebnis sollte ungefähr wie folgt aussehen:
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 }
-
Um die Ausgabe der Funktion zu sehen, überprüfen Sie die
response.json
-Datei.
Um den Funktionscode zu aktualisieren, müssen Sie das Image erneut erstellen, das neue Image in das ECR Amazon-Repository hochladen und dann den update-function-code
Lambda löst das Image-Tag in einen bestimmten Image-Digest auf. Das heißt, wenn Sie das Image-Tag, das für die Bereitstellung der Funktion verwendet wurde, auf ein neues Image in Amazon verweisenECR, aktualisiert Lambda die Funktion nicht automatisch, um das neue Image zu verwenden.
Um das neue Image für dieselbe Lambda-Funktion bereitzustellen, müssen Sie den update-function-code--publish
Option eine neue Version der Funktion unter Verwendung des aktualisierten Container-Images.
aws lambda update-function-code \ --function-name
hello-world
\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
\ --publish
Es wird ein AWS Nicht-Basis-Image verwendet
Sie können ein Container-Image für Go aus einem AWS Nicht-Base-Image erstellen. Das Beispiel-Dockerfile in den folgenden Schritten verwendet ein Alpine-Basis-Image
Sie müssen das aws-lambda-go/lambda-Paket
Zur Durchführung der Schritte in diesem Abschnitt benötigen Sie Folgendes:
Erstellen und Bereitstellen einer Go-Funktion mit einem Alpine-Basis-Image
-
Erstellen Sie ein Verzeichnis für das Projekt und wechseln Sie dann zu diesem Verzeichnis.
mkdir hello cd hello
-
Initialisieren Sie ein neues Go-Modul.
go mod init
example.com/hello-world
-
Fügen Sie die Lambda-Bibliothek als Abhängigkeit Ihres neuen Moduls hinzu.
go get github.com/aws/aws-lambda-go/lambda
-
Erstellen Sie eine Datei namens
main.go
und öffnen Sie diese dann in einem Text-Editor. Dies ist der Code für die Lambda-Funktion. Sie können den folgenden Beispielcode zum Testen verwenden oder ihn durch Ihren eigenen ersetzen.package main import ( "context" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { response := events.APIGatewayProxyResponse{ StatusCode: 200, Body: "\"Hello from Lambda!\"", } return response, nil } func main() { lambda.Start(handler) }
-
Verwenden Sie einen Texteditor, um ein Dockerfile in Ihrem Projektverzeichnis zu erstellen. Das folgende Beispiel-Dockerfile verwendet ein Alpine-Basis-Image
. Beachten Sie, dass das Dockerfile-Beispiel keine Anweisung enthält. USER Wenn Sie ein Container-Image auf Lambda bereitstellen, definiert Lambda automatisch einen Standard-Linux-Benutzer mit den am wenigsten privilegierten Rechten. Dies unterscheidet sich vom Standardverhalten von Docker, bei dem standardmäßig der Benutzer verwendet wird, wenn keine Anweisung bereitgestellt wird. root
USER
Beispiel Dockerfile
Anmerkung
Stellen Sie sicher, dass die Version von Go, die Sie in der Docker-Datei angeben (z. B.
golang:1.20
), dieselbe Version von Go ist, mit der Sie Ihre Anwendung erstellt haben.FROM golang:1.20.2-alpine3.16 as build WORKDIR /helloworld # Copy dependencies list COPY go.mod go.sum ./ # Build COPY main.go . RUN go build -o main main.go # Copy artifacts to a clean image FROM alpine:3.16 COPY --from=build /helloworld/main /main ENTRYPOINT [ "/main" ]
-
Erstellen Sie Ihr Docker-Image mit dem docker build
-Befehl. Das folgende Beispiel benennt das Bild in docker-image
und gibt ihm dentest
Tag. docker build --platform linux/amd64 -t
docker-image
:test
.Anmerkung
Der Befehl gibt die
--platform linux/amd64
-Option an, um sicherzustellen, dass Ihr Container mit der Lambda-Ausführungsumgebung kompatibel ist, unabhängig von der Architektur des Entwicklungsrechners. Wenn Sie beabsichtigen, eine Lambda-Funktion mithilfe der ARM64 Befehlssatzarchitektur zu erstellen, müssen Sie den Befehl so ändern, dass er stattdessen die--platform linux/arm64
Option verwendet.
Verwenden Sie den Laufzeit-Schnittstellen-Emulator
Installieren des Laufzeitschnittstellen-Emulators auf Ihrem lokalen Computer
-
Führen Sie in Ihrem Projektverzeichnis den folgenden Befehl aus, um den Runtime-Interface-Emulator (x86-64-Architektur) herunterzuladen GitHub und auf Ihrem lokalen Computer zu installieren.
-
Starten Sie Ihr Docker-Image mit dem docker run-Befehl. Beachten Sie Folgendes:
-
docker-image
ist der Image-Name undtest
ist das Tag. -
/main
istENTRYPOINT
aus Ihrem Dockerfile.
Dieser Befehl führt das Image als Container aus und erstellt einen lokalen Endpunkt bei
localhost:9000/2015-03-31/functions/function/invocations
.Anmerkung
Wenn Sie das Docker-Image für die ARM64 Befehlssatzarchitektur erstellt haben, stellen Sie sicher, dass Sie die
--platform linux/
Option anstelle von verwenden.arm64
--platform linux/
amd64
-
-
Veröffentlichen Sie ein Ereignis auf dem lokalen Endpunkt.
-
Die Container-ID erhalten.
docker ps
-
Verwenden Sie den Befehl docker kill
, um den Container zu anzuhalten. Ersetzen Sie in diesem Befehl 3766c4ab331c
durch die Container-ID aus dem vorherigen Schritt.docker kill
3766c4ab331c
Um das Bild auf Amazon hochzuladen ECR und die Lambda-Funktion zu erstellen
-
Führen Sie den get-login-password
Befehl aus, um den Docker bei Ihrer ECR Amazon-Registrierung CLI zu authentifizieren. -
Setzen Sie den
--region
Wert auf den AWS-Region Ort, an dem Sie das ECR Amazon-Repository erstellen möchten. -
111122223333
Ersetzen Sie es durch Ihre AWS-Konto ID.
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin111122223333
.dkr.ecr.us-east-1
.amazonaws.com -
-
Erstellen Sie mit dem ECR Befehl create-repository ein Repository
in Amazon. aws ecr create-repository --repository-name
hello-world
--regionus-east-1
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLEAnmerkung
Das ECR Amazon-Repository muss sich im selben Format AWS-Region wie die Lambda-Funktion befinden.
Wenn erfolgreich, sehen Sie eine Antwort wie diese:
{ "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
-
Kopieren Sie das
repositoryUri
aus der Ausgabe im vorherigen Schritt. -
Führen Sie den Befehl docker tag
aus, um Ihr lokales Image als neueste Version in Ihrem ECR Amazon-Repository zu taggen. In diesem Befehl gilt Folgendes: -
docker-image:test
ist der Name und das TagIhres Docker-Images. Dies sind der Imagename und das Tag, die Sie im docker build
Befehl angegeben haben. -
Ersetzen Sie
<ECRrepositoryUri>
durch denrepositoryUri
, den Sie kopiert haben. Stellen Sie sicher, dass Sie:latest
am Ende des angebenURI.
docker tag docker-image:test
<ECRrepositoryUri>
:latestBeispiel:
docker tag
docker-image
:test
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
-
Führen Sie den Befehl docker push
aus, um Ihr lokales Image im ECR Amazon-Repository bereitzustellen. Stellen Sie sicher, dass Sie es :latest
am Ende des Repositorys URI einschließen.docker push
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
Erstellen Sie eine Ausführungsrolle für die Funktion, wenn Sie noch keine haben. Im nächsten Schritt benötigen Sie den Amazon-Ressourcennamen (ARN) der Rolle.
-
So erstellen Sie die Lambda-Funktion: Geben Sie für
ImageUri
das Repository URI von früher an. Stellen Sie sicher, dass Sie:latest
am Ende des angebenURI.aws lambda create-function \ --function-name
hello-world
\ --package-type Image \ --code ImageUri=111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest \ --rolearn:aws:iam::111122223333:role/lambda-ex
Anmerkung
Sie können eine Funktion mit einem Bild in einem anderen AWS Konto erstellen, sofern sich das Bild in derselben Region wie die Lambda-Funktion befindet. Weitere Informationen finden Sie unter ECRKontoübergreifende Amazon-Berechtigungen.
-
Die Funktion aufrufen.
aws lambda invoke --function-name
hello-world
response.jsonDas Ergebnis sollte ungefähr wie folgt aussehen:
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 }
-
Um die Ausgabe der Funktion zu sehen, überprüfen Sie die
response.json
-Datei.
Um den Funktionscode zu aktualisieren, müssen Sie das Image erneut erstellen, das neue Image in das ECR Amazon-Repository hochladen und dann den update-function-code
Lambda löst das Image-Tag in einen bestimmten Image-Digest auf. Das heißt, wenn Sie das Image-Tag, das für die Bereitstellung der Funktion verwendet wurde, auf ein neues Image in Amazon verweisenECR, aktualisiert Lambda die Funktion nicht automatisch, um das neue Image zu verwenden.
Um das neue Image für dieselbe Lambda-Funktion bereitzustellen, müssen Sie den update-function-code--publish
Option eine neue Version der Funktion unter Verwendung des aktualisierten Container-Images.
aws lambda update-function-code \ --function-name
hello-world
\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
\ --publish