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 als Node.js-Container-Image für eine AWS Lambda-Funktion bereitstellen. AWS stellt Basisimages für Node.js bereit, um Sie beim Erstellen des Container-Images zu unterstützen. Diese Basis-Images sind mit einer Sprachlaufzeit und anderen Komponenten vorgeladen, die zum Ausführen des Images auf Lambda erforderlich sind. AWS stellt eine Dockerdatei für jedes der Basis-Images bereit, um beim Erstellen Ihres Container-Images zu helfen.
Wenn Sie ein Community- oder Privatunternehmens-Basis-Image verwenden, müssen Sie den Node.js-Laufzeitschnittstellen-Client (RIC) zum Basis-Image hinzufügen, um es mit Lambda kompatibel zu machen.
Lambda bietet einen Emulator für die Laufzeitschnittstelle zum lokalen Testen. Die AWS-Basis-Images für Node.js enthalten den Emulator für die Laufzeitschnittstelle. 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
Erstellen und Paketieren von TypeScript-Funktionscode mithilfe eines Node.js-Basis-Image
Zur Durchführung der Schritte in diesem Abschnitt benötigen Sie Folgendes:
-
Node.js 22.x
Erstellen Sie ein Image aus einem AWS-Basis-Image für Lambda
-
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 wird nicht importiert, da es sich um ein unabhängiges Tool eines Drittanbieters handelt. Weitere Informationen finden Sie unter aws-lambdaim DefinitelyTyped-GitHub-Repository. 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:
-
Setzen Sie die
FROM
-Eigenschaft auf den URI des Basis-Images. -
Legen Sie das
CMD
-Argument zur Angabe des Lambda-Funktionshandlers fest.
Die folgende Beispiel-Docker-Datei verwendet eine mehrstufige Entwicklung. Der erste Schritt überträgt den TypeScript-Code in JavaScript. Der zweite Schritt erzeugt ein Container-Image, das nur JavaScript-Dateien und Produktionsabhängigkeiten enthält.
Beachten Sie, dass das Dockerfile-Beispiel keine USER-Anweisung
enthält. Wenn Sie ein Container-Image für Lambda bereitstellen, definiert Lambda automatisch einen Standard-Linux-Benutzer mit Berechtigungen mit geringsten Rechten. Dies unterscheidet sich vom Standardverhalten von Docker, bei dem standardmäßig der root
-Benutzer verwendet wird, wenn keineUSER
-Anweisung bereitgestellt wird.Beispiel Dockerfile
FROM public.ecr.aws/lambda/nodejs:22 as builder WORKDIR /usr/app COPY package.json index.ts ./ RUN npm install RUN npm run build FROM public.ecr.aws/lambda/nodejs:22 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 unbedingt so ändern, dass stattdessen die--platform linux/arm64
-Option verwendet wird.
-
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
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-Befehlssatz-Architektur erstellt haben, müssen Sie die Option
--platform linux/
stattarm64
--platform linux/
verwenden.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 Image in Amazon ECR hochzuladen und die Lambda-Funktion zu erstellen
-
Führen Sie den Befehl get-login-password
aus, um die Docker-CLI bei Ihrem Amazon-ECR-Registry zu authentifizieren. -
Stellen Sie den
--region
Wert auf die AWS-Region ein, in der Sie das Amazon-ECR-Repository erstellen möchten. -
Ersetzen Sie
111122223333
mit Ihrer 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 ein Repository in Amazon ECR mithilfe des Befehls create-repository
. aws ecr create-repository --repository-name
hello-world
--regionus-east-1
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLEAnmerkung
Das Amazon ECR-Repository muss sich im selben 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 Amazon-ECR-Repository zu markieren. 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 der URI angeben.
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 Amazon-ECR-Repository bereitzustellen. Stellen Sie sicher, dass Sie :latest
am Ende der Repository-URI angeben.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. Sie benötigen den Amazon-Ressourcennamen (ARN) der Rolle im nächsten Schritt.
-
So erstellen Sie die Lambda-Funktion: Geben Sie für
ImageUri
die Repository-URI von zuvor an. Stellen Sie sicher, dass Sie:latest
am Ende der URI angeben.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 Amazon-ECR-Repository hochladen und dann den Befehl 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 ECR verweisen, 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 Befehl 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