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.
Stellen Sie transpilierten TypeScript Code in Lambda mit Container-Images bereit
Sie können Ihren TypeScript Code für eine AWS Lambda Funktion als Container-Image Node.js bereitstellen. AWS stellt Basis-Images für Node.js bereit, um Ihnen beim Erstellen des Container-Images zu helfen. Diese Basis-Images sind mit einer Sprachlaufzeit und anderen Komponenten vorinstalliert, die für die Ausführung des Images auf Lambda erforderlich sind. AWS stellt für jedes der Basis-Images ein Dockerfile bereit, das Sie beim Erstellen Ihres Container-Images unterstützt.
Wenn Sie ein Community- oder Private-Enterprise-Basis-Image verwenden, müssen Sie dem Basis-Image den Runtime-Interface-Client (RIC) von Node.js hinzufügen, damit es mit Lambda kompatibel ist.
Lambda bietet einen Emulator für die Laufzeitschnittstelle zum lokalen Testen. Die AWS Basis-Images für Node.js enthalten den Runtime-Interface-Emulator. Wenn Sie ein alternatives Basis-Image verwenden (beispielsweise ein Alpine Linux-Image oder ein Debian-Image), können Sie den Emulator in Ihr Image integrieren
Verwenden eines Node.js -Basisimages zum Erstellen und Verpacken von TypeScript Funktionscode
Zur Durchführung der Schritte in diesem Abschnitt benötigen Sie Folgendes:
-
Node.js 20.x
Um ein Image aus einem AWS Basis-Image für Lambda zu erstellen
-
Erstellen Sie auf Ihrem lokalen Computer ein Projektverzeichnis für Ihre neue Funktion.
-
Erstellen Sie ein neues Node.js-Projekt mit
npm
oder einem Paketmanager Ihrer Wahl.npm init
-
Fügen Sie die Pakete @types/aws-lambda
und esbuild als Entwicklungsabhängigkeiten hinzu. Das @types/aws-lambda
-Paket enthält die Typdefinitionen für Lambda.npm install -D @types/aws-lambda esbuild
-
Hinzufügen eines Entwicklungs-Skripts
zur package.json
-Datei."scripts": { "build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js" }
-
Erstellen Sie eine neue Datei mit dem Namen
index.ts
. Fügen Sie den folgenden Beispiel-Code zur neuen Datei hinzu. Dies ist der Code für die Lambda-Funktion. Die Funktion gibt einehello world
-Nachricht zurück.Anmerkung
Die
import
-Anweisung importiert die Typdefinitionen aus @types/aws-lambda. Das aws-lambda
NPM Paket, bei dem es sich um ein Drittanbieter-Tool handelt, wird nicht importiert. Weitere Informationen finden Sie unter aws-lambdaim Repository. DefinitelyTyped GitHub import { Context, APIGatewayProxyResult, APIGatewayEvent } from 'aws-lambda'; export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => { console.log(`Event: ${JSON.stringify(event, null, 2)}`); console.log(`Context: ${JSON.stringify(context, null, 2)}`); return { statusCode: 200, body: JSON.stringify({ message: 'hello world', }), }; };
-
Erstellen Sie eine neue Docker-Datei mit der folgenden Konfiguration:
-
Stellen Sie die
FROM
Eigenschaft auf die URI des Basis-Images ein. -
Legen Sie das
CMD
-Argument zur Angabe des Lambda-Funktionshandlers fest.
Die folgende Beispiel-Docker-Datei verwendet eine mehrstufige Entwicklung. Der erste Schritt transpiliert den TypeScript Code in JavaScript. Im zweiten Schritt wird ein Container-Image erstellt, das nur JavaScript Dateien und Produktionsabhängigkeiten enthält.
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 geringsten 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
FROM public.ecr.aws/lambda/nodejs:20 as builder WORKDIR /usr/app COPY package.json index.ts ./ RUN npm install RUN npm run build FROM public.ecr.aws/lambda/nodejs:20 WORKDIR ${LAMBDA_TASK_ROOT} COPY --from=builder /usr/app/dist/* ./ CMD ["index.handler"]
-
-
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.
-
Starten Sie Ihr Docker-Image mit dem docker run-Befehl. In diesem Beispiel ist
docker-image
der Image-Name undtest
der Tag.docker run --platform linux/amd64 -p 9000:8080 --read-only
docker-image
:test
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 stattdessen die
--platform linux/
Option verwenden.arm64
--platform linux/
amd64
-
Veröffentlichen Sie in einem neuen Terminalfenster ein Ereignis an den 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 es :latest
am Ende des Repositorys URI hinzugefügt wird.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 zur 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