Funções Lambda em Python
O gerador de Função Lambda em 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 tipagem 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 cria construtos CDK para implantação da função, que residem no diretório packages/common/constructs
.
Se a opção functionPath
for fornecida, o gerador adicionará os arquivos 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 está em <function-name>.py
. Veja 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: Implement metrics.add_metric(name="SuccessCount", unit=MetricUnit.Count, value=1) # TODO: Implement success response if required except Exception as e: logger.exception(e) metrics.add_metric(name="ErrorCount", unit=MetricUnit.Count, value=1) # TODO: Implement error response if required
O gerador configura automaticamente vários recursos:
- Integração com AWS Lambda Powertools para observabilidade
- Coleta de métricas
- Tipagem segura 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. 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
Tipagem Segura
Se você escolheu um eventSource
ao gerar sua função, ela será instrumentada com @event_parser
do AWS Lambda Powertools. Exemplo:
@event_parser(model=EventBridgeModel)def lambda_handler(event: EventBridgeModel, context: LambdaContext): event.detail_type # <- tipagem segura com autocompletar na IDE
Isso permite definir modelos de dados usando Pydantic, similar ao funcionamento com FastAPI.
Se não desejar tipar seu evento, selecione Any
para o eventSource
.
Implantando sua Função
O gerador cria um construto CDK para implantação no diretório common/constructs
. Use 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
A função pode ser usada como alvo para qualquer event source do Lambda:
O exemplo abaixo demonstra código CDK para invocar sua função 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)], }); }}