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
-
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 -
(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 -
Costruisci l'app.
cd sam-app sam build -
Distribuire l'app.
sam deploy --guided -
Seguire le istruzioni visualizzate sullo schermo. Per accettare le opzioni predefinite fornite nell'esperienza interattiva, rispondi con
Enter. -
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.
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:
-
Node.js
Implementare un'applicazione AWS CDK di esempio
-
Crea una directory di progetto per la nuova applicazione.
mkdir hello-world cd hello-world -
Inizializza l'app.
cdk init app --language typescript -
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 -
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.
-
Apri hello-world.function.ts e aggiungi il seguente codice al file. Questo è il codice per la funzione Lambda.
Nota
L'istruzione
importimporta 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-lambdanel 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', }), }; }; -
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
NodejsFunctionpresuppone 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.
-
-
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'); } } -
dalla directory
hello-worldcontenente il filecdk.json, implementa l'applicazione.cdk deploy -
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:
-
Node.js
-
Un ruolo di esecuzione per la funzione Lambda
-
Per gli utenti Windows, un'utilità di file zip come 7zip
.
Implementare una funzione di esempio
-
Sul tuo computer locale, crea una directory di progetto per la nuova funzione.
-
Crea un nuovo progetto Node.js con npm o un gestore di pacchetti di tua scelta.
npm init -
Aggiungi i pacchetti @types/aws-lambda
e esbuild come dipendenze di sviluppo. Il pacchetto @types/aws-lambdacontiene le definizioni dei tipi per Lambda.npm install -D @types/aws-lambda esbuild -
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
importimporta 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-lambdanel 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', }), }; }; -
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. -
Creare il pacchetto.
npm run build -
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" --rolearn:aws:iam::123456789012:role/lambda-ex--zip-file "fileb://dist/index.zip" --handler index.handler -
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\"}" }