Essenciais de arquitetura orientada a eventos

Aplicações Serverless com AWS Lambda

Claudio Canales

Senior DevOps Engineer

Recap: um modelo mental da Lambda

  • Fonte do evento: o que aciona a Lambda.
  • Payload do evento: JSON descrevendo o ocorrido.
  • Handler: código que processa.
  • Resultado: resposta ou efeito colateral.
  • Logs: onde você depura problemas.

Fluxo de execução da Lambda

Aplicações Serverless com AWS Lambda

Eventos são mensagens

  • Um evento descreve algo que aconteceu.
  • Geralmente é uma mensagem JSON com metadados.
  • Seu handler extrai campos e age.

Analogia da campainha para eventos

Aplicações Serverless com AWS Lambda

Fontes comuns de eventos na AWS

  • Amazon S3 aciona eventos em uploads.
  • Amazon SQS é uma fila gerenciada que entrega mensagens.
  • DynamoDB Streams produz um log de alterações.
  • Cada um gera um payload JSON diferente.

Fontes de evento: S3 vs SQS vs Streams

Aplicações Serverless com AWS Lambda

Invocação síncrona vs assíncrona

  • Síncrono: quem chama espera o resultado.
  • Assíncrono: quem chama recebe um aviso; o evento é processado depois.

Analogia: síncrono vs assíncrono

Aplicações Serverless com AWS Lambda

Essenciais de arquitetura orientada a eventos

  • Eventos chegam como JSON de serviços AWS.
  • O modo de invocação muda onde os erros aparecem.
  • Payloads variam; faça parse e valide de forma defensiva.
  • Considere tentativas e duplicatas.

Principais pontos

Aplicações Serverless com AWS Lambda

Payloads são contratos

  • Payloads são contratos: o emissor define o formato.
  • Seu handler precisa saber onde achar os campos.
  • Extraia o necessário, valide, processe e faça log.

Contrato de payload e fluxo de parsing

Aplicações Serverless com AWS Lambda

Exemplo de payload: evento do SQS

Payload de evento SQS anotado

  • Records é o lote.
  • body é uma string.
  • messageId ajuda a rastrear e deduplicar.
Aplicações Serverless com AWS Lambda

Passo a passo: iterar em Records

def lambda_handler(event, context):
    records = event.get("Records", [])
    for record in records:
        body = record.get("body", "")
        print("BODY:", body)
    return {"statusCode": 200}
  • Leia Records com um padrão seguro.
  • Percorra cada registro e extraia o body.
  • Faça log do que importa e retorne.

Percorra Records

Aplicações Serverless com AWS Lambda

Passo a passo: parse seguro do JSON no body

import json
def lambda_handler(event, context):
    records = event.get("Records") or [{}]
    body = records[0].get("body", "{}")
    payload = json.loads(body)
    oid = payload.get("order_id")
    return json.dumps({"order_id": oid})
  • body é uma string; faça parse com json.loads.
  • Leia com um padrão seguro como "{}".
  • Extraia order_id e retorne JSON com json.dumps.

Fluxo de parsing do body

Aplicações Serverless com AWS Lambda

Checklist de parsing defensivo

Checklist de parsing defensivo

  • Faça log do formato do evento ao conhecer uma fonte nova.
  • Use .get() e padrões para campos opcionais.
  • Valide campos obrigatórios e retorne erros claros.
  • Trate lotes vazios e chaves ausentes.
Aplicações Serverless com AWS Lambda

Projete para tentativas e duplicatas

  • Muitas fontes usam entrega pelo menos uma vez.
  • Duplicatas podem acontecer.
  • Projete handlers idempotentes para que processar duas vezes siga correto.

Reiterações e duplicatas

Aplicações Serverless com AWS Lambda

Idempotência na prática

  • Escolha uma chave única, como messageId ou order_id.
  • Guarde cada chave processada no DynamoDB.
  • Verifique se a chave existe; se existir, pule o trabalho.

Fluxo de decisão de idempotência

Aplicações Serverless com AWS Lambda

Principais pontos

  • Eventos chegam como JSON de serviços AWS.
  • O modo de invocação muda onde os erros aparecem.
  • Payloads variam; faça parse e valide de forma defensiva.
  • Considere tentativas e duplicatas.

Principais pontos

Aplicações Serverless com AWS Lambda

Vamos praticar!

Aplicações Serverless com AWS Lambda

Preparing Video For Download...