Pular para o conteúdo

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:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - py#lambda-function
  5. Preencha os parâmetros obrigatórios
    • Clique em Generate

    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, Tracer
    from aws_lambda_powertools.metrics import MetricUnit
    from aws_lambda_powertools.utilities.parser import event_parser
    from aws_lambda_powertools.utilities.parser.models import EventBridgeModel
    from 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:

    1. Integração com AWS Lambda Powertools para observabilidade
    2. Coleta de métricas
    3. 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:

    1. Função AWS Lambda
    2. Grupo de logs no CloudWatch
    3. Configuração de rastreamento X-Ray
    4. 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)],
    });
    }
    }