Implementare il codice TypeScript trasformato in Lambda con gli archivi di file .zip - AWS Lambda

Implementare il codice TypeScript trasformato in Lambda con gli archivi di file .zip

Per poter implementare il codice TypeScript in AWS Lambda, è necessario trasformarlo in JavaScript. In questa pagina vengono illustrati tre modi per creare e implementare il codice TypeScript in Lambda con archivi di file .zip:

AWS SAM e AWS CDK semplificano la creazione e l'implementazione di funzioni TypeScript. La specifica del modello AWS SAM fornisce una sintassi semplice e chiara per descrivere le funzioni, le API, le autorizzazioni, le configurazioni e gli eventi Lambda che compongono l'applicazione serverless. AWS CDK consente di creare applicazioni affidabili, scalabili e convenienti nel cloud con la notevole potenza espressiva di un linguaggio di programmazione. AWS CDK è destinato a utenti AWS da moderatamente a altamente esperti. AWS CDK e AWS SAM utilizzano entrambi esbuild per trasformare il codice TypeScript in JavaScript.

Utilizzo di AWS SAM per implementare il codice TypeScript in Lambda

Segui i passaggi descritti di seguito per scaricare, compilare e implementare un'applicazione Hello World TypeScript di esempio utilizzando AWS SAM. Questa applicazione implementa un backend API di base. Consiste in un endpoint Gateway Amazon API e in una funzione Lambda. Quando si invia una richiesta GET all'endpoint API Gateway, viene richiamata la funzione Lambda. La funzione restituisce un messaggio hello world.

Nota

AWS SAM utilizza esbuild per creare funzioni Lambda Node.js dal codice TypeScript. Il supporto di esbuild è attualmente in anteprima pubblica. Durante l'anteprima pubblica, il supporto di esbuild potrebbe essere soggetto a modifiche incompatibili con il passato.

Prerequisiti

Per completare le fasi riportate in questa sezione, è necessario:

Implementare un'applicazione AWS SAM di esempio
  1. Inizializzare l'applicazione utilizzando il modello Hello World TypeScript.

    sam init --app-template hello-world-typescript --name sam-app --package-type Zip --runtime nodejs22.x
  2. (Facoltativo) L'applicazione di esempio include configurazioni per strumenti di uso comune, ad esempio ESLIint per analisi del codice e Jest per test unitario. Per eseguire i comandi lint e test:

    cd sam-app/hello-world npm install npm run lint npm run test
  3. Costruisci l'app.

    cd sam-app sam build
  4. Distribuire l'app.

    sam deploy --guided
  5. Seguire le istruzioni visualizzate sullo schermo. Per accettare le opzioni predefinite fornite nell'esperienza interattiva, rispondi con Enter.

  6. L'output mostra l'endpoint per la REST API. Apri l'endpoint in un browser per testare la funzione. Dovresti vedere questa risposta:

    {"message":"hello world"}
  7. Questo è un endpoint API pubblico accessibile su Internet. È consigliabile eliminare l'endpoint dopo il test.

    sam delete

Utilizzo di AWS CDK per implementare il codice TypeScript in Lambda

Segui i passaggi descritti di seguito per creare e distribuire un'applicazione TypeScript di esempio utilizzando AWS CDK. Questa applicazione implementa un backend API di base. È costituito da un endpoint API Gateway e da una funzione Lambda. Quando si invia una richiesta GET all'endpoint API Gateway, viene richiamata la funzione Lambda. La funzione restituisce un messaggio hello world.

Prerequisiti

Per completare le fasi riportate in questa sezione, è necessario:

Implementare un'applicazione AWS CDK di esempio
  1. Crea una directory di progetto per la nuova applicazione.

    mkdir hello-world cd hello-world
  2. Inizializza l'app.

    cdk init app --language typescript
  3. Aggiungi il pacchetto @types /aws-lambda come dipendenza di sviluppo. Questo pacchetto contiene le definizioni dei tipi per Lambda.

    npm install -D @types/aws-lambda
  4. Apri la directory lib. Dovrebbe essere visualizzato un file chiamato hello-world-stack.ts. Crea due nuovi file in questa directory: hello-world.function.ts e hello-world.ts.

  5. Apri hello-world.function.ts e aggiungi il seguente codice al file. Questo è il codice per la funzione Lambda.

    Nota

    L'istruzione import importa le definizioni dei tipi da @types/aws-lambda. Non importa il pacchetto NPM aws-lambda, che è uno strumento di terzi non correlato. Per ulteriori informazioni, consulta aws-lambda nel repository GitHub DefinitelyTyped.

    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. Apri hello-world.ts e aggiungi il seguente codice al file. Contiene il costrutto NodejsFunction, che crea la funzione Lambda e il costrutto LambdaRestApi, che crea la REST API.

    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, }); } }

    Il costrutto NodejsFunction presuppone quanto segue per impostazione predefinita:

    • Viene richiamato il gestore di funzioni handler.

    • Il file .ts che contiene il codice funzione (hello-world.function.ts) si trova nella stessa directory del file .ts che contiene il costrutto (hello-world.ts). Il costrutto utilizza l'ID del costrutto ("hello-world") e il nome del file del gestore Lambda ("funzione") per trovare il codice funzione. Ad esempio, se il codice funzione si trova in un file chiamato hello-world.my-function.ts, il file hello-world.ts deve fare riferimento al codice funzione in questo modo:

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

    È possibile modificare questo comportamento e configurare altri parametri esbuild. Per ulteriori informazioni, consulta la sezione relativa alla configurazione di esbuild nella guida di riferimento dell'API AWS CDK.

  7. Apri hello-world-stack.ts. Questo è il codice che definisce lo stack AWS CDK. Sostituisci il codice con il seguente:

    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. dalla directory hello-world contenente il file cdk.json, implementa l'applicazione.

    cdk deploy
  9. AWS CDK crea e impacchetta la funzione Lambda usando esbuild e quindi implementa la funzione al runtime di Lambda. L'output mostra l'endpoint per la REST API. Apri l'endpoint in un browser per testare la funzione. Dovresti vedere questa risposta:

    {"message":"hello world"}

    Questo è un endpoint API pubblico accessibile su Internet. È consigliabile eliminare l'endpoint dopo il test.

Utilizzo della AWS CLI e di esbuild per distribuire il codice TypeScript in Lambda

L'esempio seguente illustra come trasformare e distribuire il codice TypeScript in Lambda utilizzando esbuild e la AWS CLI. esbuild produce un file JavaScript con tutte le dipendenze. Questo è l'unico file che devi aggiungere all'archivio .zip.

Prerequisiti

Per completare le fasi riportate in questa sezione, è necessario:

Implementare una funzione di esempio
  1. Sul tuo computer locale, crea una directory di progetto per la nuova funzione.

  2. Crea un nuovo progetto Node.js con npm o un gestore di pacchetti di tua scelta.

    npm init
  3. Aggiungi i pacchetti @types/aws-lambda e esbuild come dipendenze di sviluppo. Il pacchetto @types/aws-lambda contiene le definizioni dei tipi per Lambda.

    npm install -D @types/aws-lambda esbuild
  4. Crea un nuovo file denominato index.ts. Aggiungi il seguente codice al nuovo file. Questo è il codice per la funzione Lambda. La funzione restituisce un messaggio hello world. La funzione non crea risorse API Gateway.

    Nota

    L'istruzione import importa le definizioni dei tipi da @types/aws-lambda. Non importa il pacchetto NPM aws-lambda, che è uno strumento di terzi non correlato. Per ulteriori informazioni, consulta aws-lambda nel repository GitHub DefinitelyTyped.

    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. Aggiungi uno script di compilazione al file package.json. esbuild viene configurato per creare automaticamente il pacchetto di implementazione .zip. Per ulteriori informazioni, consulta la sezione relativa alla compilazione degli script nella documentazione di esbuild.

    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 questo esempio, il comando "postbuild" utilizza l'utilità 7zip per creare il file con estensione .zip. Utilizza l'utilità zip di Windows preferita e modifica il comando secondo necessità.

    "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. Creare il pacchetto.

    npm run build
  7. Crea una funzione Lambda utilizzando il pacchetto di implementazione .zip. Sostituisci il testo evidenziato con l'Amazon Resource Name (ARN) del tuo ruolo di esecuzione.

    aws lambda create-function --function-name hello-world --runtime "nodejs22.x" --role arn:aws:iam::123456789012:role/lambda-ex --zip-file "fileb://dist/index.zip" --handler index.handler
  8. Esegui un evento di test per confermare che la funzione restituisca la risposta seguente. Se desideri richiamare questa funzione utilizzando API Gateway, crea e configura una REST API.

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