Función Lambda de TypeScript
El generador de funciones Lambda en TypeScript permite agregar una función lambda a un proyecto existente en TypeScript.
Este generador crea un nuevo manejador de lambda en TypeScript con configuración de infraestructura AWS CDK. El manejador generado utiliza AWS Lambda Powertools para TypeScript para observabilidad, incluyendo registro de logs, trazado con AWS X-Ray y métricas de CloudWatch, además de validación opcional de tipos para eventos usando el Parser de AWS Lambda Powertools
Generar una función lambda en TypeScript
Sección titulada «Generar una función lambda en TypeScript»Puedes generar una función lambda de dos maneras:
- Instale el Nx Console VSCode Plugin si aún no lo ha hecho
- Abra la consola Nx en VSCode
- Haga clic en
Generate (UI)
en la sección "Common Nx Commands" - Busque
@aws/nx-plugin - ts#lambda-function
- Complete los parámetros requeridos
- Haga clic en
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
También puede realizar una ejecución en seco para ver qué archivos se cambiarían
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
Opciones
Sección titulada «Opciones»Parámetro | Tipo | Predeterminado | Descripción |
---|---|---|---|
project Requerido | string | - | The project to add the lambda function to |
functionName Requerido | 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 |
Salida del generador
Sección titulada «Salida del generador»El generador agregará los siguientes archivos a tu proyecto:
Directory<project-name>
Directorysrc/
- <lambda-function>.ts Implementación de la función
El generador también creará un constructo CDK para desplegar tu función, ubicado en el directorio packages/common/constructs/src/app/lambda-functions
.
Si se proporciona la opción functionPath
, el generador agregará el manejador en la ruta especificada dentro del directorio fuente del proyecto:
Directory<project-name>
Directorysrc/
Directory<custom-path>/
- <function-name>.ts Implementación de la función
Implementando tu función
Sección titulada «Implementando tu función»La implementación principal de la función está en <function-name>.ts
. Aquí un ejemplo:
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);
El generador configura automáticamente varias características:
- Pila de middleware Middy para funcionalidad extendida de Lambda
- Integración con AWS Lambda Powertools para observabilidad
- Recolección de métricas con CloudWatch
- Validación de tipos usando middleware de parser
- Empaquetado con esbuild para paquetes de despliegue optimizados
Observabilidad con AWS Lambda Powertools
Sección titulada «Observabilidad con AWS Lambda Powertools»Registro de logs
Sección titulada «Registro de logs»El generador configura registro estructurado usando AWS Lambda Powertools con inyección automática de contexto mediante middleware Middy.
export const handler = middy() .use(injectLambdaContext(logger)) .handler(myFunction);
Trazado
Sección titulada «Trazado»El trazado con AWS X-Ray se configura automáticamente mediante el middleware captureLambdaHandler
. Puedes agregar subsegmentos personalizados:
const tracer = new Tracer();
export const myFunction = async ( event: z.infer<typeof EventBridgeSchema>,): Promise<void> => { // Crea un nuevo subsegmento const subsegment = tracer.getSegment()?.addNewSubsegment('custom-operation'); try { // Tu lógica aquí } catch (error) { subsegment?.addError(error as Error); throw error; } finally { subsegment?.close(); }};
export const handler = middy() .use(captureLambdaHandler(tracer)) .handler(myFunction);
Métricas
Sección titulada «Métricas»Las métricas de CloudWatch se recolectan automáticamente en cada solicitud mediante el middleware logMetrics
. Puedes agregar métricas personalizadas:
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);
Validación de tipos
Sección titulada «Validación de tipos»Si seleccionaste un eventSource
al generar tu función lambda, esta se instrumenta con el middleware parser
de AWS Lambda Powertools. Por ejemplo:
export const myFunction = async ( event: z.infer<typeof EventBridgeSchema>,): Promise<void> => { event.detail // <- tipo seguro con autocompletado en IDE};
export const handler = middy() .use(parser({ schema: EventBridgeSchema })) .handler(myFunction);
Esto provee seguridad de tipos en tiempo de compilación y validación en tiempo de ejecución para los eventos de Lambda.
Si no deseas tipar tu evento, puedes seleccionar Any
para eventSource
, lo que resultará en un tipo any
para el parámetro del evento.
Empaquetado
Sección titulada «Empaquetado»El generador configura automáticamente esbuild para paquetes de despliegue optimizados:
Empaqueta una función lambda específica con:
pnpm nx run <project-name>:bundle-<function-name>
yarn nx run <project-name>:bundle-<function-name>
npx nx run <project-name>:bundle-<function-name>
bunx nx run <project-name>:bundle-<function-name>
Empaqueta todas las funciones lambda del proyecto con:
pnpm nx run <project-name>:bundle
yarn nx run <project-name>:bundle
npx nx run <project-name>:bundle
bunx nx run <project-name>:bundle
Desplegando tu función
Sección titulada «Desplegando tu función»El generador crea un constructo CDK para desplegar tu función en la carpeta common/constructs
. Puedes usarlo en una aplicación CDK:
import { MyProjectMyFunction } from ':my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { // Agrega la función a tu stack const fn = new MyProjectMyFunction(this, 'MyFunction'); }}
Esto configura:
- Función AWS Lambda
- Grupo de logs en CloudWatch
- Configuración de trazado X-Ray
- Namespace de métricas en CloudWatch
Esta función puede usarse como objetivo para cualquier origen de eventos de lambda:
El siguiente ejemplo muestra código CDK para invocar tu función lambda en un horario 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) { // Agrega la función al stack const fn = new MyProjectMyFunction(this, 'MyFunction');
// Agrega la función a una regla programada de EventBridge const eventRule = new Rule(this, 'MyFunctionScheduleRule', { schedule: Schedule.cron({ minute: '15' }), targets: [new LambdaFunction(fn)], }); }}