Funzione Lambda TypeScript
Il generatore di funzioni Lambda TypeScript permette di aggiungere una funzione lambda a un progetto TypeScript esistente.
Questo generatore crea un nuovo handler Lambda TypeScript con configurazione infrastrutturale AWS CDK o Terraform. L’handler generato utilizza AWS Lambda Powertools for TypeScript per l’osservabilità, inclusi logging, tracciamento AWS X-Ray e metriche CloudWatch, oltre a un’opzionale type-safety per gli eventi tramite il Parser di AWS Lambda Powertools.
Utilizzo
Sezione intitolata “Utilizzo”Genera una funzione lambda TypeScript
Sezione intitolata “Genera una funzione lambda TypeScript”Puoi generare una funzione lambda in due modi:
- Installa il Nx Console VSCode Plugin se non l'hai già fatto
- Apri la console Nx in VSCode
- Clicca su
Generate (UI)
nella sezione "Common Nx Commands" - Cerca
@aws/nx-plugin - ts#lambda-function
- Compila i parametri richiesti
- Clicca su
Generate
pnpm nx g @aws/nx-plugin:ts#lambda-function
yarn nx g @aws/nx-plugin:ts#lambda-function
npx nx g @aws/nx-plugin:ts#lambda-function
bunx nx g @aws/nx-plugin:ts#lambda-function
Puoi anche eseguire una prova per vedere quali file verrebbero modificati
pnpm nx g @aws/nx-plugin:ts#lambda-function --dry-run
yarn nx g @aws/nx-plugin:ts#lambda-function --dry-run
npx nx g @aws/nx-plugin:ts#lambda-function --dry-run
bunx nx g @aws/nx-plugin:ts#lambda-function --dry-run
Opzioni
Sezione intitolata “Opzioni”Parametro | Tipo | Predefinito | Descrizione |
---|---|---|---|
project Obbligatorio | string | - | The project to add the lambda function to |
functionName Obbligatorio | string | - | The name of the function to add |
functionPath | string | - | Optional subdirectory within the project source directory to add the function to |
eventSource | string | Any | Optional event source schema to use for the lambda function |
iacProvider | string | Inherit | The preferred IaC provider. By default this is inherited from your initial selection. |
Output del Generatore
Sezione intitolata “Output del Generatore”Il generatore aggiungerà i seguenti file al tuo progetto:
Directory<project-name>
Directorysrc/
- <lambda-function>.ts Implementazione della funzione
Se viene fornita l’opzione functionPath
, il generatore aggiungerà l’handler al percorso specificato all’interno della directory sorgente del progetto:
Directory<project-name>
Directorysrc/
Directory<custom-path>/
- <function-name>.ts Implementazione della funzione
Infrastruttura
Sezione intitolata “Infrastruttura”Poiché questo generatore fornisce infrastruttura come codice basata sul tuo iacProvider
selezionato, creerà un progetto in packages/common
che include i relativi costrutti CDK o moduli Terraform.
Il progetto comune di infrastruttura come codice è strutturato come segue:
Directorypackages/common/constructs
Directorysrc
Directoryapp/ Construct per l’infrastruttura specifica di un progetto/generatore
- …
Directorycore/ Construct generici riutilizzati dai construct in
app
- …
- index.ts Punto di ingresso che esporta i construct da
app
- project.json Target di build e configurazione del progetto
Directorypackages/common/terraform
Directorysrc
Directoryapp/ Moduli Terraform per l’infrastruttura specifica di un progetto/generatore
- …
Directorycore/ Moduli generici riutilizzati dai moduli in
app
- …
- project.json Target di build e configurazione del progetto
Il generatore crea infrastruttura as code per distribuire la tua funzione in base al iacProvider
selezionato:
Il generatore crea un costrutto CDK utilizzabile per distribuire la tua funzione, residente nella directory packages/common/constructs/src/app/lambda-functions
.
Il generatore crea un modulo Terraform utilizzabile per distribuire la tua funzione, residente nella directory packages/common/terraform/src/app/lambda-functions/<function-name>
.
Implementazione della Funzione
Sezione intitolata “Implementazione della Funzione”L’implementazione principale della funzione si trova in <function-name>.ts
. Ecco un esempio:
import { parser } from '@aws-lambda-powertools/parser/middleware';import { EventBridgeSchema } from '@aws-lambda-powertools/parser/schemas';import middy from '@middy/core';import { Tracer } from '@aws-lambda-powertools/tracer';import { captureLambdaHandler } from '@aws-lambda-powertools/tracer/middleware';import { injectLambdaContext } from '@aws-lambda-powertools/logger/middleware';import { Logger } from '@aws-lambda-powertools/logger';import { Metrics } from '@aws-lambda-powertools/metrics';import { logMetrics } from '@aws-lambda-powertools/metrics/middleware';import { z } from 'zod';
process.env.POWERTOOLS_METRICS_NAMESPACE = 'MyFunction';process.env.POWERTOOLS_SERVICE_NAME = 'MyFunction';
const tracer = new Tracer();const logger = new Logger();const metrics = new Metrics();
export const myFunction = async ( event: z.infer<typeof EventBridgeSchema>,): Promise<void> => { logger.info('Received event', event);
// TODO: implement};
export const handler = middy() .use(captureLambdaHandler(tracer)) .use(injectLambdaContext(logger)) .use(logMetrics(metrics)) .use(parser({ schema: EventBridgeSchema })) .handler(myFunction);
Il generatore configura automaticamente diverse funzionalità:
- Middleware stack Middy per funzionalità Lambda avanzate
- Integrazione AWS Lambda Powertools per l’osservabilità
- Raccolta metriche con CloudWatch
- Type-safety tramite middleware parser
- Bundling con Rolldown per pacchetti di distribuzione ottimizzati
Osservabilità con AWS Lambda Powertools
Sezione intitolata “Osservabilità con AWS Lambda Powertools”Logging
Sezione intitolata “Logging”Il generatore configura il logging strutturato usando AWS Lambda Powertools con iniezione automatica del contesto tramite middleware Middy.
export const handler = middy() .use(injectLambdaContext(logger)) .handler(myFunction);
Tracing
Sezione intitolata “Tracing”Il tracciamento AWS X-Ray è configurato automaticamente tramite il middleware captureLambdaHandler
. Puoi aggiungere sottosegmenti personalizzati ai tuoi trace:
const tracer = new Tracer();
export const myFunction = async ( event: z.infer<typeof EventBridgeSchema>,): Promise<void> => { // Crea un nuovo sottosegmento const subsegment = tracer.getSegment()?.addNewSubsegment('custom-operation'); try { // Logica qui } catch (error) { subsegment?.addError(error as Error); throw error; } finally { subsegment?.close(); }};
export const handler = middy() .use(captureLambdaHandler(tracer)) .handler(myFunction);
Metriche
Sezione intitolata “Metriche”Le metriche CloudWatch vengono raccolte automaticamente per ogni richiesta tramite il middleware logMetrics
. Puoi aggiungere metriche personalizzate:
const metrics = new Metrics();
export const myFunction = async ( event: z.infer<typeof EventBridgeSchema>,): Promise<void> => { metrics.addMetric("CustomMetric", MetricUnit.Count, 1); metrics.addMetric("ProcessingTime", MetricUnit.Milliseconds, processingTime);};
export const handler = middy() .use(logMetrics(metrics)) .handler(myFunction);
Type Safety
Sezione intitolata “Type Safety”Se hai selezionato un eventSource
durante la generazione della tua funzione lambda, questa viene strumentata con il middleware parser
di AWS Lambda Powertools. Esempio:
export const myFunction = async ( event: z.infer<typeof EventBridgeSchema>,): Promise<void> => { event.detail // <- type-safe con autocompletamento IDE};
export const handler = middy() .use(parser({ schema: EventBridgeSchema })) .handler(myFunction);
Questo fornisce type safety a compile-time e validazione runtime per gli eventi Lambda.
Se non desideri tipizzare l’evento, puoi selezionare Any
come eventSource
, risultando in un tipo any
per il parametro event.
Bundling
Sezione intitolata “Bundling”Il generatore configura automaticamente un target bundle
che utilizza Rolldown per creare un pacchetto di distribuzione:
pnpm nx run <project-name>:bundle
yarn nx run <project-name>:bundle
npx nx run <project-name>:bundle
bunx nx run <project-name>:bundle
La configurazione di Rolldown si trova in rolldown.config.ts
, con un’entry per bundle da generare. Rolldown gestisce la creazione di più bundle in parallelo se definiti.
Distribuzione della Funzione
Sezione intitolata “Distribuzione della Funzione”Questo generatore crea infrastrutture come codice CDK o Terraform in base al iacProvider
selezionato. Puoi utilizzarlo per distribuire la tua funzione.
Questo generatore crea un costrutto CDK per distribuire la tua funzione nella cartella common/constructs
. Puoi utilizzarlo in un’applicazione CDK:
import { MyProjectMyFunction } from ':my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { // Aggiunge la funzione al tuo stack const fn = new MyProjectMyFunction(this, 'MyFunction'); }}
Configura automaticamente:
- Funzione AWS Lambda
- Gruppo di log CloudWatch
- Configurazione del tracciamento X-Ray
- Namespace delle metriche CloudWatch
La funzione può essere utilizzata come target per qualsiasi sorgente eventi Lambda:
L’esempio seguente mostra il codice CDK per invocare la tua funzione Lambda su una pianificazione usando EventBridge:
import { Rule, Schedule } from 'aws-cdk-lib/aws-events';import { LambdaFunction } from 'aws-cdk-lib/aws-events-targets';import { MyProjectMyFunction } from ':my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { // Aggiunge la funzione al tuo stack const fn = new MyProjectMyFunction(this, 'MyFunction');
// Aggiunge la funzione a una regola pianificata di EventBridge const eventRule = new Rule(this, 'MyFunctionScheduleRule', { schedule: Schedule.cron({ minute: '15' }), targets: [new LambdaFunction(fn)], }); }}
Questo generatore crea un modulo Terraform per distribuire la tua funzione nella cartella common/terraform
. Puoi utilizzarlo in una configurazione Terraform:
module "my_project_my_function" { source = "../../common/terraform/src/app/lambda-functions/my-project-my-function"
# Variabili d'ambiente per la funzione Lambda env = { SOME_VARIABLE = "some value" }
# Politiche IAM aggiuntive se necessarie additional_iam_policy_statements = [ # Aggiungi eventuali permessi aggiuntivi richiesti dalla tua funzione ]}
Configura automaticamente:
- Funzione AWS Lambda
- Gruppo di log CloudWatch
- Configurazione del tracciamento X-Ray
- Namespace delle metriche CloudWatch
La funzione può essere utilizzata come target per qualsiasi sorgente eventi Lambda. L’esempio seguente mostra il codice Terraform per invocare la tua funzione Lambda su una pianificazione usando EventBridge:
# Regola EventBridge per esecuzione pianificataresource "aws_cloudwatch_event_rule" "my_function_schedule" { name = "my-function-schedule" description = "Attiva la mia funzione ogni 15 minuti" schedule_expression = "cron(15 * * * ? *)"}
# Target EventBridgeresource "aws_cloudwatch_event_target" "lambda_target" { rule = aws_cloudwatch_event_rule.my_function_schedule.name target_id = "MyFunctionTarget" arn = module.my_project_my_function.function_arn}
# Permesso per EventBridge di invocare la funzione Lambdaresource "aws_lambda_permission" "allow_eventbridge" { statement_id = "AllowExecutionFromEventBridge" action = "lambda:InvokeFunction" function_name = module.my_project_my_function.function_name principal = "events.amazonaws.com" source_arn = aws_cloudwatch_event_rule.my_function_schedule.arn}