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 em Python com configuração de infraestrutura AWS CDK ou Terraform. O backend gerado utiliza AWS Lambda para implantação serverless, com opção de type-safety usando o Parser do AWS Lambda Powertools. Configura o AWS Lambda Powertools para observabilidade, incluindo logging, rastreamento com AWS X-Ray e métricas no Cloudwatch.
Utilização
Seção intitulada “Utilização”Gerar uma Função Lambda
Seção intitulada “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
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 | string | Any | Optional event source model to use for the lambda function |
iacProvider | string | Inherit | The preferred IaC provider. By default this is inherited from your initial selection. |
Saída do Gerador
Seção intitulada “Saída do Gerador”O gerador adicionará os seguintes arquivos ao seu projeto:
Directory<module-name>
- <lambda-function>.py Implementação da função
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
Infraestrutura
Seção intitulada “Infraestrutura”Como este gerador fornece infraestrutura como código com base no iacProvider
escolhido, ele criará um projeto em packages/common
que inclui os constructs CDK ou módulos Terraform relevantes.
O projeto comum de infraestrutura como código está estruturado da seguinte forma:
Directorypackages/common/constructs
Directorysrc
Directoryapp/ Constructs para infraestrutura específica de um projeto/gerador
- …
Directorycore/ Constructs genéricos reutilizados pelos constructs em
app
- …
- index.ts Ponto de entrada exportando os constructs de
app
- project.json Metas de build e configuração do projeto
Directorypackages/common/terraform
Directorysrc
Directoryapp/ Módulos Terraform para infraestrutura específica de um projeto/gerador
- …
Directorycore/ Módulos genéricos reutilizados pelos módulos em
app
- …
- project.json Metas de build e configuração do projeto
O gerador cria infraestrutura como código para implantação da função baseado no iacProvider
selecionado:
O gerador cria constructs CDK para implantação da função, localizados no diretório packages/common/constructs
.
O gerador cria um módulo Terraform para implantação da função, localizado no diretório packages/common/terraform/src/app/lambda-functions/<function-name>
.
Implementando sua Função
Seção intitulada “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: 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
- Type-safety usando
@event_parser
Observabilidade com AWS Lambda Powertools
Seção intitulada “Observabilidade com AWS Lambda Powertools”Logging
Seção intitulada “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 evento
- Informações de contexto do Lambda
- Indicadores de cold start
Tracing
Seção intitulada “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
Seção intitulada “Métricas”Métricas no 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
Type Safety
Seção intitulada “Type Safety”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 # <- type-safe com autocompletar na IDE
Isso permite definir modelos de dados usando Pydantic, de forma similar ao trabalho com Fast API.
Se não deseja tipar seu evento, basta selecionar Any
como eventSource
.
Bundling
Seção intitulada “Bundling”O gerador configura automaticamente o empacotamento Python para pacotes de implantação Lambda usando uv:
pnpm nx run <project-name>:bundle
yarn nx run <project-name>:bundle
npx nx run <project-name>:bundle
bunx nx run <project-name>:bundle
Este processo utiliza:
uv export
para exportar dependências para um arquivorequirements.txt
uv pip install
para instalar dependências na plataforma alvo (x86_64-manylinux2014
) para implantação Lambda
Implantando sua Função
Seção intitulada “Implantando sua Função”Este gerador cria infraestrutura como código CDK ou Terraform com base no iacProvider
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) { // Adiciona a função à sua stack const fn = new MyProjectMyFunction(this, 'MyFunction'); }}
Isso configura:
- Função AWS Lambda
- Grupo de logs do CloudWatch
- Configuração de rastreamento do X-Ray
- Namespace de métricas do CloudWatch
Esta função pode 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 agendamento usando o 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) { // Adiciona a função à sua stack const fn = new MyProjectMyFunction(this, 'MyFunction');
// Adiciona a função a uma regra agendada do EventBridge const eventRule = new Rule(this, 'MyFunctionScheduleRule', { schedule: Schedule.cron({ minute: '15' }), targets: [new LambdaFunction(fn)], }); }}
Este gerador cria um módulo Terraform para implantar sua função na pasta common/terraform
. Você pode usar isso em uma configuração Terraform:
module "my_project_my_function" { source = "../../common/terraform/src/app/lambda-functions/my-project-my-function"
# Variáveis de ambiente para a função Lambda env = { SOME_VARIABLE = "some value" }
# Políticas IAM adicionais se necessário additional_iam_policy_statements = [ # Adicione quaisquer permissões adicionais necessárias ]}
Isso configura:
- Função AWS Lambda
- Grupo de logs do CloudWatch
- Configuração de rastreamento do X-Ray
- Namespace de métricas do CloudWatch
Esta função pode ser usada como destino para qualquer fonte de evento lambda. O exemplo abaixo demonstra o código Terraform para invocar sua função lambda em um agendamento usando o EventBridge:
# Regra do EventBridge para execução agendadaresource "aws_cloudwatch_event_rule" "my_function_schedule" { name = "my-function-schedule" description = "Aciona minha função a cada 15 minutos" schedule_expression = "cron(15 * * * ? *)"}
# Target do EventBridgeresource "aws_cloudwatch_event_target" "lambda_target" { rule = aws_cloudwatch_event_rule.my_function_schedule.name target_id = "MyFunctionTarget" arn = module.my_project_my_function.function_arn}
# Permissão para o EventBridge invocar a função Lambdaresource "aws_lambda_permission" "allow_eventbridge" { statement_id = "AllowExecutionFromEventBridge" action = "lambda:InvokeFunction" function_name = module.my_project_my_function.function_name principal = "events.amazonaws.com" source_arn = aws_cloudwatch_event_rule.my_function_schedule.arn}