Funções Lambda em Python
O gerador de Função Lambda Python permite adicionar uma função lambda a um projeto Python existente.
Este gerador cria um novo handler de lambda Python com configuração de infraestrutura AWS CDK. O backend gerado utiliza AWS Lambda para implantação serverless, com verificação de tipos opcional usando o Parser do AWS Lambda Powertools. Ele configura o AWS Lambda Powertools para observabilidade, incluindo logging, rastreamento com AWS X-Ray e métricas no CloudWatch.
Uso
Gerar uma Função Lambda
Você pode gerar uma nova Função Lambda de duas formas:
- Instale o Nx Console VSCode Plugin se ainda não o fez
- Abra o console Nx no VSCode
- Clique em
Generate (UI)
na seção "Common Nx Commands" - Procure por
@aws/nx-plugin - py#lambda-function
- Preencha os parâmetros obrigatórios
- Clique em
Generate
pnpm nx g @aws/nx-plugin:py#lambda-function
yarn nx g @aws/nx-plugin:py#lambda-function
npx nx g @aws/nx-plugin:py#lambda-function
bunx nx g @aws/nx-plugin:py#lambda-function
Você também pode realizar uma execução simulada para ver quais arquivos seriam alterados
pnpm nx g @aws/nx-plugin:py#lambda-function --dry-run
yarn nx g @aws/nx-plugin:py#lambda-function --dry-run
npx nx g @aws/nx-plugin:py#lambda-function --dry-run
bunx nx g @aws/nx-plugin:py#lambda-function --dry-run
Opções
Parâmetro | Tipo | Padrão | Descrição |
---|---|---|---|
project Obrigatório | string | - | The project to add the lambda function to |
functionName Obrigatório | string | - | The name of the function to add |
functionPath | string | - | The path within the project source directory to add the function to |
eventSource Obrigatório | string | Any | Optional event source model to use for the lambda function |
Saída do Gerador
O gerador adicionará os seguintes arquivos ao seu projeto:
Directory<module-name>
- <lambda-function>.py Implementação da função
O gerador também criará construtos CDK para implantar sua função, que residem no diretório packages/common/constructs
.
Se a opção functionPath
for fornecida, o gerador adicionará os arquivos necessários no caminho especificado:
Directory<module-name>
Directory<custom-path>
- <function-name>.py Implementação da função
Implementando sua Função
A implementação principal da função está em <function-name>.py
. Aqui está um exemplo:
import os
from aws_lambda_powertools import Logger, Metrics, Tracerfrom aws_lambda_powertools.metrics import MetricUnitfrom aws_lambda_powertools.utilities.parser import event_parserfrom aws_lambda_powertools.utilities.parser.models import EventBridgeModelfrom aws_lambda_powertools.utilities.typing import LambdaContext
os.environ["POWERTOOLS_METRICS_NAMESPACE"] = "Foo"os.environ["POWERTOOLS_SERVICE_NAME"] = "Foo"
logger: Logger = Logger()metrics: Metrics = Metrics()tracer: Tracer = Tracer()
@tracer.capture_lambda_handler@metrics.log_metrics@event_parser(model=EventBridgeModel)def lambda_handler(event: EventBridgeModel, context: LambdaContext): logger.info("Received event", extra={"event": event.model_dump() }) metrics.add_metric(name="InvocationCount", unit=MetricUnit.Count, value=1)
try: # TODO: Implementar metrics.add_metric(name="SuccessCount", unit=MetricUnit.Count, value=1) # TODO: Implementar resposta de sucesso se necessário except Exception as e: logger.exception(e) metrics.add_metric(name="ErrorCount", unit=MetricUnit.Count, value=1) # TODO: Implementar resposta de erro se necessário
O gerador configura automaticamente vários recursos:
- Integração com AWS Lambda Powertools para observabilidade
- Coleta de métricas
- Verificação de tipos usando
@event_parser
Observabilidade com AWS Lambda Powertools
Logging
O gerador configura logging estruturado usando AWS Lambda Powertools.
def lambda_handler(event: EventBridgeModel, context: LambdaContext): logger.info("Received event", extra={"event": event.model_dump()})
O logger inclui automaticamente:
- Requisições de eventos
- Informações de contexto do Lambda
- Indicadores de cold start
Tracing
O rastreamento com AWS X-Ray é configurado automaticamente. Você pode adicionar subsegmentos personalizados:
def lambda_handler(event: EventBridgeModel, context: LambdaContext): # Cria um novo subsegmento with tracer.provider.in_subsegment("function-subsegment"): # Sua lógica aqui return ....
Métricas
Métricas do CloudWatch são coletadas automaticamente para cada requisição. Você pode adicionar métricas personalizadas:
def lambda_handler(event: EventBridgeModel, context: LambdaContext): metrics.add_metric(name="NewMetric", unit=MetricUnit.Count, value=1) return ...
Métricas padrão incluem:
- Contagem de invocações
- Contagem de sucessos/falhas
- Métricas de cold start
Verificação de Tipos
Se você escolheu um eventSource
ao gerar sua função lambda, ela será instrumentada com @event_parser
do AWS Lambda Powertools. Por exemplo:
@event_parser(model=EventBridgeModel)def lambda_handler(event: EventBridgeModel, context: LambdaContext): event.detail_type # <- tipagem segura com autocompletar da IDE
Isso permite definir modelos de dados usando Pydantic, de forma similar ao trabalho com Fast API.
Se não desejar tipar seu evento, você pode selecionar Any
como eventSource
.
Implantando sua Função
O gerador cria um construto CDK para implantação no diretório common/constructs
. Você pode usá-lo em uma aplicação CDK:
import { MyProjectMyFunction } from ':my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { // Adiciona a função à stack const fn = new MyProjectMyFunction(this, 'MyFunction'); }}
Isso configura:
- Função AWS Lambda
- Grupo de logs no CloudWatch
- Configuração de rastreamento X-Ray
- Namespace de métricas no CloudWatch
Esta função pode ser usada como alvo para qualquer fonte de evento lambda:
O exemplo abaixo demonstra o código CDK para invocar sua função lambda em um agendamento usando Event Bridge:
import { EventPattern, 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) { // Adiciona a função à stack const fn = new MyProjectMyFunction(this, 'MyFunction');
// Adiciona a função a uma regra do EventBridge const eventRule = new Rule(this, 'MyFunctionScheduleRule', { schedule: Schedule.cron({ minute: '15' }), targets: [new LambdaFunction(fn)], }); }}