Ir al contenido

Función Lambda de TypeScript

El generador de Función Lambda de TypeScript proporciona la capacidad de agregar una función lambda a un proyecto TypeScript existente.

Este generador crea un nuevo manejador lambda de TypeScript con configuración de infraestructura AWS CDK o Terraform. El manejador generado utiliza AWS Lambda Powertools for TypeScript para observabilidad, incluyendo registro, rastreo de AWS X-Ray y métricas de CloudWatch, así como seguridad de tipos opcional para el evento usando el Parser de AWS Lambda Powertools

Puedes generar una función lambda de dos maneras:

Ejecute este generador@aws/nx-plugin:ts#lambda-function

pnpm nx g @aws/nx-plugin:ts#lambda-function
Construya su comando7

Requerido

Requerido

Opciones del generador7 opciones
projectRequeridostring

El proyecto al que agregar la función lambda

nameRequeridostring

El nombre de la función a agregar

eventenumPredeterminado: Any

Esquema de origen de evento opcional para usar en la función lambda

AnyAlbSchemaAPIGatewayProxyEventSchemaAPIGatewayRequestAuthorizerEventSchemaAPIGatewayTokenAuthorizerEventSchemaAPIGatewayProxyEventV2SchemaAPIGatewayProxyWebsocketEventSchemaAPIGatewayRequestAuthorizerEventV2SchemaCloudFormationCustomResourceCreateSchemaCloudFormationCustomResourceUpdateSchemaCloudFormationCustomResourceDeleteSchemaCloudWatchLogsSchemaPreSignupTriggerSchemaPostConfirmationTriggerSchemaCustomMessageTriggerSchemaMigrateUserTriggerSchemaCustomSMSSenderTriggerSchemaCustomEmailSenderTriggerSchemaDefineAuthChallengeTriggerSchemaCreateAuthChallengeTriggerSchemaVerifyAuthChallengeTriggerSchemaPreTokenGenerationTriggerSchemaV1PreTokenGenerationTriggerSchemaV2AndV3DynamoDBStreamSchemaEventBridgeSchemaKafkaMskEventSchemaKafkaSelfManagedEventSchemaKinesisDataStreamSchemaKinesisFirehoseSchemaKinesisDynamoDBStreamSchemaKinesisFirehoseSqsSchemaLambdaFunctionUrlSchemaS3EventNotificationEventBridgeSchemaS3SchemaS3ObjectLambdaEventSchemaS3SqsEventNotificationSchemaSesSchemaSnsSchemaSqsSchemaTransferFamilySchemaVpcLatticeSchemaVpcLatticeV2Schema
infraenumPredeterminado: lambda

El tipo de infraestructura con la que desplegar tu función Lambda.

lambdanone
iacenumPredeterminado: inherit

El proveedor de IaC preferido. Por defecto, se hereda de tu selección inicial.

inheritcdkterraform
functionPathstring

Subdirectorio opcional dentro del directorio fuente del proyecto para agregar la función

preferInstallDependenciesbooleanPredeterminado: true

Si se prefiere instalar las dependencias después de que se ejecute el generador. Establece en false para diferir la instalación cuando se ejecutan múltiples generadores en lote (la instalación aún se ejecuta si es necesario para que los generadores subsiguientes puedan calcular el grafo de proyectos de Nx); instala una vez al final.

El generador agregará los siguientes archivos a tu proyecto:

  • Directorio<project-name>
    • Directoriosrc/
      • <lambda-function>.ts Function implementation
    • rolldown.config.ts Bundling configuration for the function
    • .gitignore Ignores the temporary configs Rolldown writes

El generador también agrega un target bundle al project.json del proyecto, y las dependencias de runtime de Powertools, Middy y Zod que el manejador importa a su package.json.

Si se proporciona la opción functionPath, el generador agregará el manejador a la ruta especificada dentro del directorio de origen del proyecto:

  • Directorio<project-name>
    • Directoriosrc/
      • Directorio<custom-path>/
        • <function-name>.ts Function implementation

Dado que este generador proporciona infraestructura como código basada en tu iac elegido, creará un proyecto en packages/common que incluye las construcciones CDK o módulos Terraform relevantes.

El proyecto común de infraestructura como código está estructurado de la siguiente manera:

  • Directoriopackages/common/constructs
    • Directoriosrc
      • Directorioapp/ Constructs for infrastructure specific to a project/generator
      • Directoriocore/ Generic constructs which are reused by constructs in app
      • index.ts Entry point exporting constructs from app
    • project.json Project build targets and configuration

El generador crea infraestructura como código para desplegar tu función basándose en tu iac seleccionado:

El generador crea un constructo CDK que puede usarse para desplegar tu función, el cual reside en el directorio packages/common/constructs/src/app/lambda-functions.

La función desplegada tiene la siguiente arquitectura, con sus logs, métricas y trazas yendo a CloudWatch y X-Ray:

Loading the diagram…

El generador proporciona la función en sí; usted conecta la fuente de eventos en su stack para invocarla (por ejemplo, una integración de API Gateway, una regla de EventBridge, una notificación de S3 o un mapeo de fuente de eventos de SQS).

La implementación principal de la función está en <function-name>.ts. Aquí hay un ejemplo:

import { parser } from '@aws-lambda-powertools/parser/middleware';
import { EventBridgeSchema } from '@aws-lambda-powertools/parser/schemas';
import { z } from 'zod';
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 type { Context } from 'aws-lambda';
export type { Context };
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 varias características automáticamente:

  1. Pila de middleware Middy para funcionalidad Lambda mejorada
  2. Integración de AWS Lambda Powertools para observabilidad
  3. Recopilación de métricas con CloudWatch
  4. Seguridad de tipos usando middleware parser
  5. Empaquetado con Rolldown para paquetes de despliegue optimizados

El generador configura el registro estructurado usando AWS Lambda Powertools con inyección automática de contexto a través del middleware Middy.

export const handler = middy()
.use(injectLambdaContext(logger))
.handler(myFunction);

El rastreo de AWS X-Ray se configura automáticamente a través del middleware captureLambdaHandler. Puedes agregar subsegmentos personalizados a tus rastros:

const tracer = new Tracer();
export const myFunction = async (
event: z.infer<typeof EventBridgeSchema>,
): Promise<void> => {
// Creates a new subsegment
const subsegment = tracer.getSegment()?.addNewSubsegment('custom-operation');
try {
// Your logic here
} catch (error) {
subsegment?.addError(error as Error);
throw error;
} finally {
subsegment?.close();
}
};
export const handler = middy()
.use(captureLambdaHandler(tracer))
.handler(myFunction);

Las métricas de CloudWatch se recopilan automáticamente para cada solicitud a través del 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);
event ≠ Any

Si elegiste un event al generar tu función lambda, tu función está instrumentada con el middleware parser de AWS Lambda Powertools. Por ejemplo:

export const myFunction = async (
event: z.infer<typeof EventBridgeSchema>,
): Promise<void> => {
event.detail // <- type-safe with IDE autocompletion
};
export const handler = middy()
.use(parser({ schema: EventBridgeSchema }))
.handler(myFunction);

Esto proporciona seguridad de tipos en tiempo de compilación y validación en tiempo de ejecución para tus eventos Lambda.

event = Any

Si seleccionaste Any para tu event, el middleware parser no está conectado y el parámetro event está tipado como any. Regenera la función con un event específico si deseas seguridad de tipos en tiempo de compilación y validación en tiempo de ejecución.

El generador configura automáticamente un target bundle que utiliza Rolldown para crear un paquete de despliegue:

Terminal window
pnpm nx bundle <project-name>

La configuración de Rolldown se encuentra en rolldown.config.ts, con una entrada por cada bundle a generar. Rolldown gestiona la creación de múltiples bundles en paralelo si están definidos.

Este generador crea infraestructura como código CDK o Terraform basada en tu iac seleccionado. Puedes usar esto para desplegar tu función.

Este generador crea un construct CDK para desplegar tu función en la carpeta common/constructs. Puedes usar esto en una aplicación CDK:

import { MyProjectMyFunction } from '@my-scope/common-constructs';
export class ExampleStack extends Stack {
constructor(scope: Construct, id: string) {
// Add the function to your stack
const fn = new MyProjectMyFunction(this, 'MyFunction');
}
}

Esto configura:

  1. Función AWS Lambda
  2. Grupo de logs de CloudWatch
  3. Configuración de rastreo X-Ray
  4. Espacio de nombres de métricas de CloudWatch

Esta función puede entonces ser usada como objetivo para cualquier fuente de eventos de lambda:

El ejemplo a continuación demuestra el 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) {
// Add the function to your stack
const fn = new MyProjectMyFunction(this, 'MyFunction');
// Add the function to an EventBridge scheduled rule
const eventRule = new Rule(this, 'MyFunctionScheduleRule', {
schedule: Schedule.cron({ minute: '15' }),
targets: [new LambdaFunction(fn)],
});
}
}