Ir al contenido

Función Lambda de TypeScript

Filter this guidePick generator option values to hide sections that don't apply.

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:

Terminal window
pnpm nx g @aws/nx-plugin:ts#lambda-function
También puede realizar una ejecución en seco para ver qué archivos se cambiarían
Terminal window
pnpm nx g @aws/nx-plugin:ts#lambda-function --dry-run
ParámetroTipoPredeterminadoDescripción
project Requeridostring-El proyecto al que agregar la función lambda
name Requeridostring-El nombre de la función a agregar
functionPath string-Subdirectorio opcional dentro del directorio fuente del proyecto para agregar la función
event Any | AlbSchema | APIGatewayProxyEventSchema | APIGatewayRequestAuthorizerEventSchema | APIGatewayTokenAuthorizerEventSchema | APIGatewayProxyEventV2Schema | APIGatewayProxyWebsocketEventSchema | APIGatewayRequestAuthorizerEventV2Schema | CloudFormationCustomResourceCreateSchema | CloudFormationCustomResourceUpdateSchema | CloudFormationCustomResourceDeleteSchema | CloudWatchLogsSchema | PreSignupTriggerSchema | PostConfirmationTriggerSchema | CustomMessageTriggerSchema | MigrateUserTriggerSchema | CustomSMSSenderTriggerSchema | CustomEmailSenderTriggerSchema | DefineAuthChallengeTriggerSchema | CreateAuthChallengeTriggerSchema | VerifyAuthChallengeTriggerSchema | PreTokenGenerationTriggerSchemaV1 | PreTokenGenerationTriggerSchemaV2AndV3 | DynamoDBStreamSchema | EventBridgeSchema | KafkaMskEventSchema | KafkaSelfManagedEventSchema | KinesisDataStreamSchema | KinesisFirehoseSchema | KinesisDynamoDBStreamSchema | KinesisFirehoseSqsSchema | LambdaFunctionUrlSchema | S3EventNotificationEventBridgeSchema | S3Schema | S3ObjectLambdaEventSchema | S3SqsEventNotificationSchema | SesSchema | SnsSchema | SqsSchema | TransferFamilySchema | VpcLatticeSchema | VpcLatticeV2SchemaAnyEsquema de origen de evento opcional para usar en la función lambda
infra lambda | nonelambdaEl tipo de infraestructura con la que desplegar tu función Lambda.
iac inherit | cdk | terraforminheritEl proveedor de IaC preferido. Por defecto, se hereda de tu selección inicial.
preferInstallDependencies booleantrueSi 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

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:

Event Source(SNS, SQS, ...)LambdaCloudWatch(Logs, Metrics)X-Ray(Traces)

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