Pular para o conteúdo

Função Lambda TypeScript

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

O gerador de Função Lambda TypeScript fornece a capacidade de adicionar uma função lambda a um projeto TypeScript existente.

Este gerador cria um novo manipulador lambda TypeScript com configuração de infraestrutura AWS CDK ou Terraform. O manipulador gerado usa AWS Lambda Powertools for TypeScript para observabilidade, incluindo logging, rastreamento AWS X-Ray e CloudWatch Metrics, bem como segurança de tipo opcional para o evento usando o Parser from AWS Lambda Powertools

Você pode gerar uma função lambda de duas maneiras:

Terminal window
pnpm nx g @aws/nx-plugin:ts#lambda-function
Você também pode realizar uma execução simulada para ver quais arquivos seriam alterados
Terminal window
pnpm nx g @aws/nx-plugin:ts#lambda-function --dry-run
ParâmetroTipoPadrãoDescrição
project Obrigatóriostring-O projeto ao qual adicionar a função lambda
name Obrigatóriostring-O nome da função a adicionar
functionPath string-Subdiretório opcional dentro do diretório de origem do projeto para adicionar a função
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 origem de evento opcional para usar na função lambda
infra lambda | nonelambdaO tipo de infraestrutura para implantar sua função Lambda.
iac inherit | cdk | terraforminheritO provedor IaC preferido. Por padrão, isso é herdado da sua seleção inicial.
preferInstallDependencies booleantrueSe deve preferir instalar dependências após a execução do gerador. Defina como false para adiar a instalação ao executar múltiplos geradores em lote (uma instalação ainda é executada se necessário para que geradores subsequentes possam calcular o grafo de projetos Nx); instale uma vez no final.

O gerador adicionará os seguintes arquivos ao seu projeto:

  • Directory<project-name>
    • Directorysrc/
      • <lambda-function>.ts Function implementation

Se a opção functionPath for fornecida, o gerador adicionará o manipulador ao caminho especificado dentro do diretório de origem do projeto:

  • Directory<project-name>
    • Directorysrc/
      • Directory<custom-path>/
        • <function-name>.ts Function implementation

Como este gerador fornece infraestrutura como código baseada no seu iac escolhido, ele criará um projeto em packages/common que inclui os constructs CDK relevantes ou módulos Terraform.

O projeto comum de infraestrutura como código é estruturado da seguinte forma:

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

O gerador cria infraestrutura como código para implantar sua função com base no iac selecionado:

O gerador cria um construto CDK que pode ser usado para implantar sua função, que reside no diretório packages/common/constructs/src/app/lambda-functions.

A função implantada possui a seguinte arquitetura:

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

O gerador fornece a função em si; você conecta a origem do evento em sua stack para invocá-la (por exemplo, uma integração com API Gateway, uma regra do EventBridge, uma notificação do S3 ou um mapeamento de origem de eventos do SQS).

A implementação principal da função está em <function-name>.ts. Aqui está um exemplo:

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);

O gerador configura vários recursos automaticamente:

  1. Pilha de middleware Middy para funcionalidade Lambda aprimorada
  2. Integração com AWS Lambda Powertools para observabilidade
  3. Coleta de métricas com CloudWatch
  4. Segurança de tipo usando middleware parser
  5. Empacotamento com Rolldown para pacotes de implantação otimizados

O gerador configura logging estruturado usando AWS Lambda Powertools com injeção automática de contexto via middleware Middy.

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

O rastreamento AWS X-Ray é configurado automaticamente via middleware captureLambdaHandler. Você pode adicionar subsegmentos personalizados aos seus rastreamentos:

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);

As métricas do CloudWatch são coletadas automaticamente para cada solicitação via middleware logMetrics. Você pode adicionar 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

Se você escolheu um event ao gerar sua função lambda, sua função é instrumentada com o parser middleware from AWS Lambda Powertools. Por exemplo:

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);

Isso fornece segurança de tipo em tempo de compilação e validação em tempo de execução para seus eventos Lambda.

event = Any

Se você selecionou Any para seu event, o middleware parser não é conectado e o parâmetro event é tipado como any. Regenere a função com um event específico se você quiser segurança de tipo em tempo de compilação e validação em tempo de execução.

O gerador configura automaticamente um target bundle que usa Rolldown para criar um pacote de implantação:

Terminal window
pnpm nx bundle <project-name>

A configuração do Rolldown pode ser encontrada em rolldown.config.ts, com uma entrada por pacote a ser gerado. O Rolldown gerencia a criação de múltiplos pacotes em paralelo, se definidos.

Este gerador cria infraestrutura como código CDK ou Terraform com base no seu iac selecionado. Você pode usar isso para implantar sua função.

Este gerador cria um construct CDK para implantar sua função na pasta common/constructs. Você pode usar isso em uma aplicação 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');
}
}

Isso configura:

  1. Função AWS Lambda
  2. Grupo de logs CloudWatch
  3. Configuração de rastreamento X-Ray
  4. Namespace de métricas CloudWatch

Esta função pode então ser usada como destino para qualquer fonte de evento lambda:

O exemplo abaixo demonstra o código CDK para invocar sua função lambda em um cronograma 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)],
});
}
}