Bereitstellen von transpiliertem TypeScript Code in Lambda mit ZIP-Dateiarchiven - AWS Lambda

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 transpiliertem TypeScript Code in Lambda mit ZIP-Dateiarchiven

Bevor Sie TypeScript Code in bereitstellen könnenAWS Lambda, müssen Sie ihn in transpilieren JavaScript. Auf dieser Seite werden drei Möglichkeiten zum Erstellen und Bereitstellen von TypeScript Code in Lambda mit ZIP-Dateiarchiven erläutert:

AWS SAM und AWS CDK vereinfachen das Erstellen und Bereitstellen von TypeScript Funktionen. Die AWS SAM-Vorlagenspezifikation bietet eine einfache und saubere Syntax zur Beschreibung der Lambda-Funktionen, APIs, Berechtigungen, Konfigurationen und Ereignisse, aus denen Ihre Serverless-Anwendung besteht. Über das AWS CDK Sie können zuverlässige, skalierbare und kostengünstige Anwendungen in der Cloud mit der beträchtlichen Ausdruckskraft einer Programmiersprache erstellen. Das AWS CDK ist für mäßig bis sehr erfahrene AWS-Benutzer geplant. Sowohl das als auch AWS CDK das AWS SAM verwenden esbuild, um TypeScript Code in zu transpilieren JavaScript.

Verwenden von AWS SAM zum Bereitstellen von TypeScript Code in Lambda

Führen Sie die folgenden Schritte aus, um eine Hello-World- TypeScript Beispielanwendung mit der herunterzuladen, zu erstellen und bereitzustellenAWS SAM. Diese Anwendung implementiert ein grundlegendes API-Backend. Es besteht aus einem Amazon-API-Gateway-Endpunkt und einer Lambda-Funktion. Wenn Sie eine GET-Anforderung an den API-Gateway-Endpunkt senden, wird die Lambda-Funktion aufgerufen. Die Funktion gibt eine hello world-Nachricht zurück.

Anmerkung

AWS SAM verwendet esbuild, um Node.js-Lambda-Funktionen aus dem TypeScript Code zu erstellen. Die esbuild-Unterstützung befindet sich derzeit in der öffentlichen Vorschau. Während der öffentlichen Vorschau kann der esbuild-Support Änderungen unterliegen, die nicht mehr rückwärtskompatibel sind.

Voraussetzungen

Zur Durchführung der Schritte in diesem Abschnitt benötigen Sie Folgendes:

Bereitstellen einer AWS SAM-Beispielanwendung
  1. Initialisieren Sie die Anwendung mit der Hello World- TypeScript Vorlage.

    sam init --app-template hello-world-typescript --name sam-app --package-type Zip --runtime nodejs18.x
  2. (Optional) Die Beispielanwendung enthält Konfigurationen für häufig verwendete Tools wie eslLint für Code-Linting und Jest für Einheitentests. So führen Sie Lint- und Testbefehle aus:

    cd sam-app/hello-world npm install npm run lint npm run test
  3. Entwickeln Sie die App.

    cd sam-app sam build
  4. Stellen Sie die Anwendung bereit.

    sam deploy --guided
  5. Folgen Sie den Anweisungen auf dem Bildschirm. Um die im interaktiven Erlebnis bereitgestellten Standardoptionen zu akzeptieren, antworten Sie mit Enter.

  6. Die Ausgabe zeigt den Endpunkt für die REST-API. Öffnen Sie den Endpunkt in einem Browser, um die Funktion zu testen. Folgende Antwort sollte angezeigt werden:

    {"message":"hello world"}
  7. Dies ist ein öffentlicher API-Endpunkt, der über das Internet zugänglich ist. Es wird empfohlen, dass Sie den Endpunkt nach dem Testen löschen.

    sam delete

Verwenden der AWS CDK zum Bereitstellen von TypeScript Code in Lambda

Führen Sie die folgenden Schritte aus, um eine TypeScript Beispielanwendung mithilfe der zu erstellen und bereitzustellenAWS CDK. Diese Anwendung implementiert ein grundlegendes API-Backend. Es besteht aus einem API-Gateway-Endpunkt und einer Lambda-Funktion. Wenn Sie eine GET-Anforderung an den API-Gateway-Endpunkt senden, wird die Lambda-Funktion aufgerufen. Die Funktion gibt eine hello world-Nachricht zurück.

Voraussetzungen

Zur Durchführung der Schritte in diesem Abschnitt benötigen Sie Folgendes:

Bereitstellen einer AWS CDK-Beispielanwendung
  1. Erstellen Sie ein Projektverzeichnis für Ihre neue Anwendung.

    mkdir hello-world cd hello-world
  2. Initialisieren Sie die App.

    cdk init app --language typescript
  3. Fügen Sie das @types/aws-lambda-Paket als Entwicklungsabhängigkeit hinzu. Dieses Paket enthält die Typdefinitionen für Lambda.

    npm install -D @types/aws-lambda
  4. Öffnen Sie das lib-Verzeichnis. Sie sollten eine Datei mit dem Namen hello-world-stack.ts sehen. Erstellen Sie neue zwei neue Dateien in diesem Verzeichnis: hello-world.function.ts und hello-world.ts.

  5. Öffnen Sie hello-world.function.ts und fügen Sie den folgenden Code in die Datei ein. Dies ist der Code für die Lambda-Funktion.

    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-lambda im 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', }), }; };
  6. Öffnen Sie hello-world.ts und fügen Sie den folgenden Code in die Datei ein. Dies enthält das NodejsFunction Konstrukt , das die Lambda-Funktion erstellt, und das LambdaRestApi Konstrukt , das die REST-API erstellt.

    import { Construct } from 'constructs'; import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; import { LambdaRestApi } from 'aws-cdk-lib/aws-apigateway'; export class HelloWorld extends Construct { constructor(scope: Construct, id: string) { super(scope, id); const helloFunction = new NodejsFunction(this, 'function'); new LambdaRestApi(this, 'apigw', { handler: helloFunction, }); } }

    Das NodejsFunction-Konstrukt geht standardmäßig von folgendem aus:

    • Ihr Funktions-Handler heißt handler.

    • Die .ts-Datei, die den Funktionscode enthält (hello-world.function.ts), befindet sich im selben Verzeichnis wie die .ts-Datei, die das Konstrukt (hello-world.ts) enthält. Das Konstrukt verwendet die ID des Konstrukts („hello-world“) und den Namen der Lambda-Handler-Datei („function“), um den Funktionscode zu finden. Wenn sich Ihr Funktionscode beispielsweise in einer Datei namens hello-world.my-function.ts befindet, muss die Datei hello-world.ts wie folgt auf den Funktionscode verweisen:

      const helloFunction = new NodejsFunction(this, 'my-function');

    Sie können dieses Verhalten ändern und andere esbuild-Parameter konfigurieren. Weitere Informationen finden Sie unter esbuild konfigurieren in der AWS CDK-API-Referenz.

  7. Öffnen Sie hello-world-stack.ts . Dies ist der Code, der Ihren AWS CDK-Stack definiert. Ersetzen Sie den Code mit Folgendem:

    import { Stack, StackProps } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import { HelloWorld } from './hello-world'; export class HelloWorldStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); new HelloWorld(this, 'hello-world'); } }
  8. Stellen Sie Ihre Anwendung aus dem Verzeichnis hello-world bereit, das Ihre cdk.json Datei enthält.

    cdk deploy
  9. Das AWS CDK erstellt und packt die Lambda-Funktion mit esbuild und stellt die Funktion dann für die Lambda-Laufzeit bereit. Die Ausgabe zeigt den Endpunkt für die REST-API. Öffnen Sie den Endpunkt in einem Browser, um die Funktion zu testen. Folgende Antwort sollte angezeigt werden:

    {"message":"hello world"}

    Dies ist ein öffentlicher API-Endpunkt, der über das Internet zugänglich ist. Es wird empfohlen, dass Sie den Endpunkt nach dem Testen löschen.

Verwenden von AWS CLI und esbuild zum Bereitstellen von TypeScript Code in Lambda

Das folgende Beispiel zeigt, wie Code mithilfe von esbuild und in TypeScript Lambda transpiliert und bereitgestellt wirdAWS CLI. esbuild erzeugt eine JavaScript Datei mit allen Abhängigkeiten. Dies ist die einzige Datei, die Sie dem ZIP-Archiv hinzufügen müssen.

Voraussetzungen

Zur Durchführung der Schritte in diesem Abschnitt benötigen Sie Folgendes:

Bereitstellen einer Beispielfunktion
  1. Erstellen Sie auf Ihrem lokalen Computer ein Projektverzeichnis für Ihre neue Funktion.

  2. Erstellen Sie ein neues Node.js Projekt mit npm oder einem Paketmanager Ihrer Wahl.

    npm init
  3. 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
  4. Erstellen Sie eine neue Datei mit dem Namen index.ts. Fügen Sie den folgenden Code zur Datei hinzu. Dies ist der Code für die Lambda-Funktion. Die Funktion gibt eine hello world-Nachricht zurück. Die Funktion erstellt keine API-Gateway-Ressourcen.

    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-lambda im 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', }), }; };
  5. Hinzufügen eines Entwicklungs-Skripts zur package.json-Datei. Dies konfiguriert esbuild so, dass das ZIP-Bereitstellungspaket automatisch erstellt wird. Weitere Informationen finden Sie unter Entwicklungs-Skripte in der esbuild-Dokumentation.

    Linux and MacOS
    "scripts": { "prebuild": "rm -rf dist", "build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js", "postbuild": "cd dist && zip -r index.zip index.js*" },
    Windows

    In diesem Beispiel verwendet der "postbuild" Befehl das 7zip-Hilfsprogramm, um Ihre ZIP-Datei zu erstellen. Verwenden Sie Ihr bevorzugtes Windows-ZIP-Hilfsprogramm und ändern Sie den Befehl nach Bedarf.

    "scripts": { "prebuild": "del /q dist", "build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js", "postbuild": "cd dist && 7z a -tzip index.zip index.js*" },
  6. Erstellen Sie das Paket.

    npm run build
  7. Erstellen Sie eine Lambda-Funktion mit dem ZIP-Bereitstellungspaket. Ersetzen Sie den markierten Text durch den Amazon-Ressourcennamen (ARN) Ihrer Ausführungsrolle.

    aws lambda create-function --function-name hello-world --runtime "nodejs18.x" --role arn:aws:iam::123456789012:role/lambda-ex --zip-file "fileb://dist/index.zip" --handler index.handler
  8. Führen Sie ein Testereignis aus, um zu bestätigen, dass die Funktion die folgende Antwort zurückgibt. Wenn Sie diese Funktion mit API Gateway aufrufen möchten, Erstellen und Konfigurieren Sie eine REST-API.

    { "statusCode": 200, "body": "{\"message\":\"hello world\"}" }