AWS na Prática · 07 — Observabilidade
Logs, métricas, alarmes e tracing para enxergar o sistema rodando.
Logs, métricas, alarmes e tracing para enxergar o sistema rodando.
Sobre este módulo
O sistema está construído. Falta a parte que separa um projeto de estudo de algo que dá pra confiar: enxergar o que está acontecendo em tempo real. CloudWatch Logs, métricas, alarmes, X-Ray, e o encerramento do curso com próximos passos para continuar evoluindo.
Nível: Intermediário · Duração estimada: 3-4 horas
Sumário
- Por que observabilidade importa
- CloudWatch: o sistema nervoso da AWS
- CloudWatch Logs
- Logs estruturados em JSON
- Métricas: as duas categorias
- Métricas customizadas via EMF
- Alarmes que importam
- Dashboards
- X-Ray: tracing distribuído
- Custos de observabilidade
- Destruindo a infraestrutura
- Exercícios de fixação
- Encerramento e próximos passos
01. Por que observabilidade importa
Você terminou o módulo 06 com várias Lambdas, microserviços no Beanstalk, filas SQS, tópicos SNS e tabelas DynamoDB. Tudo isso conversando entre si. Mas como você sabe que está funcionando? E quando alguma coisa quebra — porque vai quebrar — como você descobre onde?
A diferença entre logging e observabilidade
Logging é registrar eventos. Você joga uma string num arquivo (ou num CloudWatch Log) e segue a vida. É necessário, mas insuficiente — se você precisa saber a latência média da sua API por endpoint nas últimas 24 horas, logs sozinhos não respondem isso bem.
Observabilidade é a capacidade de fazer perguntas novas ao sistema sem precisar mudar o código. Você instrumenta o sistema com três tipos de sinal — logs, métricas e traces — e depois usa ferramentas para correlacionar esses sinais e investigar problemas que você ainda não sabia que existiam.
Os três pilares
- Logs — Registros textuais ou estruturados de eventos. Bons para entender o que aconteceu em uma execução específica. Volume alto, custo de armazenamento.
- Métricas — Números agregados ao longo do tempo (latência, taxa de erro, uso de CPU). Bons para responder “como o sistema está se comportando?”. Baixo volume, baratos.
- Traces — Visão da jornada de uma requisição passando por vários serviços. Bons para responder “onde, exatamente, está o gargalo?”. Volume médio, custo médio.
Na AWS, esses três pilares são oferecidos respectivamente por CloudWatch Logs, CloudWatch Metrics e X-Ray — todos integrados ao console e cobráveis sob demanda.
Por que não basta olhar o console
Uma armadilha comum: confiar no console da AWS para diagnosticar problemas. O console mostra estado atual: quantas mensagens estão na fila agora, qual o status do environment agora. Quando algo quebra, o que você precisa é a história — o que aconteceu nos últimos 5 minutos antes do alarme disparar. Sem instrumentação prévia, essa história não existe.
02. CloudWatch: o sistema nervoso da AWS
CloudWatch é o serviço guarda-chuva da AWS para monitoramento. Quase tudo que você criou nos módulos anteriores já está sendo monitorado por ele passivamente — logs sendo coletados, métricas básicas registradas. Mas para extrair valor, você precisa entender suas peças.
Os componentes principais
- Logs — Coleta, armazena e indexa logs textuais. Cobra por GB ingerido + GB armazenado.
- Metrics — Armazena séries temporais numéricas. AWS publica automaticamente; você pode publicar suas próprias.
- Alarms — Dispara ações (e-mail, Lambda, SNS) quando uma métrica passa de um limite por X períodos consecutivos.
- Dashboards — Painéis visuais combinando métricas e logs. Útil para visão geral do sistema.
- Logs Insights — Linguagem de query para fazer perguntas em cima dos logs (similar a SQL).
- Synthetics — Testes que rodam continuamente simulando usuários (não vamos usar, mas vale conhecer).
O que já está sendo coletado
Sem você fazer nada, AWS já coleta:
- Lambda publica métricas de invocações, erros, duração e throttles. Logs vão para um log group
/aws/lambda/<nome-funcao>. - SQS publica número de mensagens visíveis, mensagens em flight, idade da mensagem mais antiga.
- SNS publica número de mensagens publicadas e entregues.
- DynamoDB publica RCU/WCU consumidas, latência, throttles.
- Beanstalk publica métricas de saúde do ambiente; instâncias EC2 publicam CPU, rede, disco.
Tudo isso fica em CloudWatch durante 15 meses por padrão (com granularidade decrescente ao longo do tempo). É bastante coisa de graça — o desafio não é ter dados, é saber quais perguntas fazer e quais alarmes criar.
Logs gerados pelo seu código
Tudo que sua aplicação escrever no stdout ou stderr vai parar em CloudWatch Logs automaticamente, em ambos os casos: Lambda (via runtime) e Beanstalk (via agente CloudWatch que vem instalado). Você não precisa configurar SDK do CloudWatch — basta usar console.log em Node.js.
03. CloudWatch Logs
Logs são a forma mais flexível e mais cara de monitoramento. Vale entender a hierarquia, as features e — principalmente — como controlar o custo.
Hierarquia: log group, log stream, event
CloudWatch Logs organiza dados em três níveis:
- Log Group — agrupa logs relacionados, geralmente por aplicação ou função. Exemplo: /aws/lambda/order-event-consumer. As configurações de retenção e KMS ficam aqui.
- Log Stream — uma sequência de eventos vindos da mesma origem. Para Lambdas, é normalmente um por instância de execução. Para EC2, um por instância.
- Log Event — uma linha de log: timestamp + mensagem. É a unidade mínima.
Configure retenção em todo log group
Por padrão, CloudWatch Logs retém logs indefinidamente. Em curso, isso vira o seu maior custo silencioso. Configure retenção em todo log group:
# Listar todos os log groups
aws logs describe-log-groups \
--query 'logGroups[*].[logGroupName,retentionInDays]' \
--output table
# Definir retenção de 7 dias para um log group específico
aws logs put-retention-policy \
--log-group-name /aws/lambda/order-event-consumer \
--retention-in-days 7
# Aplicar 7 dias em TODOS os log groups (script bash)
aws logs describe-log-groups \
--query 'logGroups[*].logGroupName' --output text | \
tr '\t' '\n' | while read group; do
aws logs put-retention-policy \
--log-group-name "$group" --retention-in-days 7
doneBuscando logs no console
Para inspeção manual rápida, CloudWatch Logs tem busca de texto no próprio console: vá em Log groups > <seu group>, clique em Search log group e use a sintaxe de filtros:
# Filtrar por palavra simples
ERROR
# Combinar palavras (todos devem aparecer)
ERROR Inventory
# Excluir uma palavra
ERROR -Connection
# JSON: campo igual
{ $.level = "error" }
# JSON: campo numérico
{ $.duration > 1000 }
# JSON: combinação
{ $.level = "error" && $.service = "orders" }Para análises mais ricas — agrupamento, agregação, ordenação — use CloudWatch Logs Insights, com sintaxe própria parecida com SQL:
# Top 10 erros nas últimas 24 horas
fields @timestamp, @message
| filter level = "error"
| stats count() by error_code
| sort count desc
| limit 10
# Latência p99 por endpoint na última hora
fields @timestamp, route, duration
| filter ispresent(duration)
| stats pct(duration, 99) by route
| sort `pct(duration, 99)` desc04. Logs estruturados em JSON
Esta é a única decisão de logging que realmente importa nesse projeto: logar em JSON estruturado em vez de texto livre. A diferença é abismal na hora de debugar.
Por que estruturado, não livre
Compare estes dois logs do mesmo evento:
# Log de texto livre (RUIM)
[INFO] Order order-123 processed in 234ms by user user-456
# Log estruturado em JSON (BOM)
{"timestamp":"2026-05-07T14:23:11Z","level":"info",
"service":"orders","event":"order.processed",
"orderId":"order-123","userId":"user-456",
"duration_ms":234,"region":"us-east-1"}O texto livre força você a escrever regex toda vez que quiser fazer uma pergunta. JSON é parseado automaticamente pelo CloudWatch Logs Insights — você consulta os campos diretamente.
Padrão de logging para o projeto
Adote estes campos como base em todos os serviços do projeto. Não é uma lista exaustiva, mas é o mínimo viável para correlação:
- timestamp — ISO 8601 em UTC. CloudWatch já adiciona, mas ter no payload ajuda em sistemas externos.
- level — info, warn, error, debug. Sempre minúsculo.
- service — nome do microserviço: orders, inventory, payments.
- event — nome do evento de domínio: order.created, payment.failed.
- requestId — ID único da requisição. Permite seguir uma operação por todos os serviços.
- userId / orderId / etc. — IDs de domínio relevantes para o evento.
- duration_ms — para operações timed: latência em milissegundos.
- error — objeto com code, message, stack quando aplicável.
Use uma biblioteca, não console.log
Para Node.js, use pino ou winston. Ambos suportam saída JSON nativa, são performáticos e plugam fácil com CloudWatch:
// pino: minimal e rápido
import pino from 'pino';
const log = pino({
level: process.env.LOG_LEVEL || 'info',
base: {
service: 'orders',
region: process.env.AWS_REGION,
},
});
log.info({ orderId, userId, duration_ms: 234 }, 'order.processed');
log.error({ err, orderId }, 'order.failed');Propagação de requestId
Para conseguir rastrear uma requisição pelos serviços, propague o requestId em headers HTTP e em atributos de mensagens SQS/SNS. Quando Orders publica um evento, ele coloca o requestId nos message attributes. Quando o consumer Lambda processa, ele extrai e loga com o mesmo ID. Resultado: uma busca por requestId = X retorna toda a jornada.
05. Métricas: as duas categorias
Métricas são números agregados ao longo do tempo. Dividem-se em duas categorias importantes: nativas, publicadas pela AWS automaticamente, e customizadas, que você publica do seu código.
Métricas nativas (de graça)
Cada serviço da AWS publica seu próprio conjunto. Vale conhecer as principais para os serviços que você usa:
| SERVIÇO | MÉTRICA | USO TÍPICO |
|---|---|---|
Dimensões: como filtrar
Cada métrica vem com dimensões — chaves que permitem filtrar. Por exemplo, Lambda Duration vem com a dimensão FunctionName, permitindo ver a duração separada por função.
Saber as dimensões disponíveis é crítico para criar gráficos e alarmes úteis. No console, ao escolher uma métrica, as dimensões aparecem como abas. Na CLI:
# Listar métricas e dimensões para um namespace
aws cloudwatch list-metrics --namespace AWS/Lambda \
--metric-name DurationEstatísticas e períodos
Toda métrica é consultada com uma estatística (Average, Sum, Min, Max, p95, p99) e um período (em segundos). Detalhe importante:
- Average tende a esconder problemas. Se 99 requisições retornam em 50ms e 1 retorna em 5s, a média é ~100ms — parece OK, mas tem usuários frustrados.
- p99 ou p95 são quase sempre melhores que Average para latência. Mostram a experiência do pior caso, que é o que o usuário sente.
- Sum só faz sentido para contadores cumulativos: requisições, erros, bytes.
- Min / Max são úteis para detectar valores fora da curva.
06. Métricas customizadas via EMF
As métricas nativas cobrem infraestrutura: latência da Lambda, tamanho da fila. Mas você também quer métricas de domínio: pedidos criados por minuto, valor total processado, taxa de aprovação de pagamento. Essas você publica.
Duas formas de publicar
A forma direta é chamar o SDK do CloudWatch: PutMetricData. Funciona, mas tem dois problemas: cada chamada é uma API call separada (custo + latência) e bloqueia o fluxo principal. A forma moderna é usar EMF (Embedded Metric Format).
EMF: métrica embutida no log
EMF é um formato JSON especial que, quando aparece em CloudWatch Logs, é automaticamente extraído e publicado como métrica. Ou seja, você só precisa logar — o CloudWatch faz o resto. Sem chamada extra.
{
"_aws": {
"Timestamp": 1715089391000,
"CloudWatchMetrics": [{
"Namespace": "OrderSystem/Orders",
"Dimensions": [["Service", "Region"]],
"Metrics": [
{ "Name": "OrderCreated", "Unit": "Count" },
{ "Name": "OrderValue", "Unit": "None" }
]
}]
},
"Service": "orders",
"Region": "us-east-1",
"OrderCreated": 1,
"OrderValue": 234.50
}Em código real, ninguém escreve isso à mão. Use a biblioteca aws-embedded-metrics oficial:
import { metricScope, Unit } from 'aws-embedded-metrics';
export const handler = metricScope(metrics => async (event) => {
metrics.setNamespace('OrderSystem/Orders');
metrics.setDimensions({ Service: 'orders', Region: 'us-east-1' });
const order = await processOrder(event);
metrics.putMetric('OrderCreated', 1, Unit.Count);
metrics.putMetric('OrderValue', order.total, Unit.None);
metrics.putMetric('ProcessingTime', order.duration_ms,
Unit.Milliseconds);
return { statusCode: 200 };
});Métricas que valem a pena no projeto
Não publique tudo — cada dimensão vira combinação custosa. Foque no que realmente importa para tomar decisão:
- OrderCreated em OrderSystem/Orders, dimensão Service. Conta pedidos criados por unidade de tempo.
- OrderValue em OrderSystem/Orders. Soma do valor dos pedidos — útil para correlacionar com volume.
- InventoryLow em OrderSystem/Inventory, dimensão ProductId. Conta vezes em que estoque ficou abaixo do mínimo.
- PaymentFailed em OrderSystem/Payments, dimensão Reason. Conta falhas separadas por motivo.
- EventProcessingTime em todas as Lambdas consumer, dimensão EventType. Latência por tipo de evento.
07. Alarmes que importam
Alarme é uma máquina de estado: ele observa uma métrica e dispara uma ação quando passa de um limite. Bem configurado, ele te acorda às 3 da manhã para problemas reais. Mal configurado, ele te ignora porque você se acostumou.
Anatomia de um alarme
- Métrica — qual número observar.
- Estatística + Período — como agregar (Average, Sum) e em que janela (1min, 5min).
- Threshold + Comparison — qual valor é “ruim”. Exemplo: > 5, < 0.99.
- Datapoints to alarm — quantos períodos consecutivos precisam violar para disparar. Evita falso positivo de 1 pico.
- Action — o que fazer ao disparar. Tipicamente: publicar em um SNS topic que tem você como assinante.
- Treat missing data — o que fazer quando não chega dado: ignorar, considerar OK, considerar ruim.
Alarmes essenciais para o projeto
Esses são os alarmes que você deveria ter rodando nesse sistema. Não são os únicos possíveis — são os que mais provavelmente vão te poupar de uma noite ruim.
| NOME | MÉTRICA | CONDIÇÃO |
|---|---|---|
Notificações via SNS + e-mail
A forma mais simples de receber alertas: um tópico SNS chamado alarms-prod com seu e-mail como assinante. Todos os alarmes publicam nele. Você confirma a inscrição uma vez e pronto.
# Criar o tópico
aws sns create-topic --name alarms-prod
# Inscrever seu e-mail (vai chegar um e-mail de confirmação)
aws sns subscribe \
--topic-arn arn:aws:sns:us-east-1:123456789012:alarms-prod \
--protocol email \
--notification-endpoint seu@email.com
# Criar um alarme apontando para esse tópico
aws cloudwatch put-metric-alarm \
--alarm-name lambda-orders-errors \
--metric-name Errors --namespace AWS/Lambda \
--dimensions Name=FunctionName,Value=order-event-consumer \
--statistic Sum --period 300 --threshold 5 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 2 \
--alarm-actions arn:aws:sns:us-east-1:123456789012:alarms-prod08. Dashboards
Dashboards são painéis visuais que combinam métricas e logs. Servem para três coisas: visão geral diária, investigação quando algo está estranho, e compartilhamento com o time.
Anti-padrão: o dashboard que ninguém olha
É tentador encher um dashboard com 30 widgets coloridos. Não funciona — ninguém abre dashboard cheio. Pense em duas categorias:
- Operations Dashboard — visão geral, 5-8 widgets, uma tela só. Latência p99 de cada serviço, taxa de erro, tamanho de fila. É o que você abre toda manhã.
- Service Dashboard — um por microserviço, mais detalhado. Tudo sobre Orders num lugar: latência, erros, capacidade DynamoDB, métricas de domínio. Você só abre quando algo está estranho com aquele serviço.
Dashboard sugerido para o projeto
Comece com um dashboard OrderSystem-Operations contendo:
- Linha 1 — OrderCreated e PaymentFailed nas últimas 24h (linhas).
- Linha 2 — p95 de latência de cada microserviço (3 linhas no mesmo gráfico).
- Linha 3 — ApproximateNumberOfMessagesVisible em todas as filas (linhas).
- Linha 4 — Lambda Errors por função (gauge de cada função).
- Linha 5 — Top 10 mensagens de erro recentes via Logs Insights.
Criando via CloudFormation
Como tudo o mais no projeto, dashboards devem ser código. O recurso é AWS::CloudWatch::Dashboard, com o body em JSON:
OperationsDashboard:
Type: AWS::CloudWatch::Dashboard
Properties:
DashboardName: OrderSystem-Operations
DashboardBody: !Sub |
{
"widgets": [{
"type": "metric",
"properties": {
"metrics": [
["OrderSystem/Orders", "OrderCreated"],
["OrderSystem/Payments", "PaymentFailed"]
],
"period": 300,
"stat": "Sum",
"title": "Throughput"
}
}]
}09. X-Ray: tracing distribuído
X-Ray responde uma pergunta que logs e métricas não respondem bem: “o que aconteceu nessa requisição específica, passo a passo, em todos os serviços?”. É a peça que falta para depurar latência em sistemas distribuídos.
O que X-Ray entrega
Você ativa X-Ray nos serviços, e cada requisição produz um trace. Um trace é uma árvore de segments (cada serviço) e subsegments (operações dentro dele: chamada DynamoDB, chamada SNS, etc.). Resultado:
- Service map: visão dos serviços e como eles conversam, com latência média e taxa de erro em cada conexão.
- Trace timeline: para uma requisição específica, gráfico em cascata mostrando quanto tempo cada operação levou.
- Annotations e metadata: você adiciona campos no trace (orderId, userId) que viram filtros nas buscas.
- Sampling: para não traçar 100% das requisições, X-Ray amostra. Padrão: 1 req/seg + 5% das demais.
Habilitando em Lambda
Em Lambda, é literalmente uma flag. Em CloudFormation:
OrderEventConsumer:
Type: AWS::Lambda::Function
Properties:
FunctionName: order-event-consumer
# ... outras props
TracingConfig:
Mode: Active # X-Ray ligado
# E garante que a role tem permissão
LambdaRole:
Type: AWS::IAM::Role
Properties:
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/
AWSLambdaBasicExecutionRole
- arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccessHabilitando em Beanstalk (Node.js)
Em Beanstalk você precisa instrumentar manualmente o app. Felizmente, o SDK do X-Ray cobre patches automáticos para Express e AWS SDK:
import express from 'express';
import AWSXRay from 'aws-xray-sdk-core';
import xrayExpress from 'aws-xray-sdk-express';
// patcheia o AWS SDK automaticamente
AWSXRay.captureAWS(require('aws-sdk'));
const app = express();
// middleware: abre o segment no início da requisição
app.use(xrayExpress.openSegment('orders-service'));
app.post('/orders', handler);
// middleware: fecha o segment ao final
app.use(xrayExpress.closeSegment());Anotações úteis
Annotations são campos indexados — você pode filtrar traces por elas. Metadata é só leitura:
const segment = AWSXRay.getSegment();
// Annotations (indexadas, filtráveis)
segment.addAnnotation('orderId', order.id);
segment.addAnnotation('region', 'us-east-1');
// Metadata (visível, mas não filtrável)
segment.addMetadata('order', {
total: order.total,
itemCount: order.items.length
});10. Custos de observabilidade
CloudWatch é o serviço mais traiçoeiro da AWS em termos de custo. Você raramente recebe surpresa de Lambda ou DynamoDB sob uso normal — mas pode levar susto bonito de Logs se não tomar cuidado.
Onde o dinheiro vai
- Logs Ingestion — ~US$ 0,50/GB ingerido. É o item dominante para apps verbosos.
- Logs Storage — ~US$ 0,03/GB/mês. Pequeno, mas cresce se retenção for infinita.
- Logs Insights — ~US$ 0,005/GB escaneado por query. Cuidado com queries em janelas grandes.
- Custom Metrics — US$ 0,30 por métrica/mês. Cardinalidade alta (muitas dimensões) explode aqui.
- API requests — US$ 0,01 por 1k chamadas a PutMetricData. EMF evita esse custo.
- Alarms — US$ 0,10 por alarme/mês (standard); composite alarms são US$ 0,50.
- X-Ray — US$ 5 por milhão de traces gravados; US$ 0,50 por milhão de scans.
Hábitos que mantêm custo controlado
- Retenção curta em todo log group — 7 dias para dev, 30 para prod, mais que isso só com motivo.
- Não logue payloads inteiros. Payloads grandes (especialmente em JSON) inflam ingestion sem agregar valor. Logue IDs e contadores.
- Log level configurável via env var. Em prod, rode em info. debug só para troubleshooting pontual.
- Cardinalidade baixa em dimensões de métrica customizada — nada de UserId como dimensão.
- Sampling em X-Ray. Não trace 100%, especialmente em alto volume.
- Revise alarmes periodicamente. Alarme inútil é US$ 0,10/mês de pura burocracia.
Estimativa para o projeto do curso
Com o setup recomendado (logs estruturados, retenção de 7 dias, ~10 alarmes, métricas EMF, X-Ray ligado), o custo mensal de observabilidade fica entre US$ 1 e US$ 3 em uso de estudo. Se você ver mais que isso, é sinal de algum runaway — geralmente um log group em modo debug que ficou ligado ou uma métrica com cardinalidade alta.
11. Destruindo a infraestrutura
Você chegou no fim. O sistema funciona, está observado, está documentado. Hora da última lição importante: derrubar tudo sem deixar resíduo.
Por que destruir é parte do aprendizado
Boa parte das contas inchadas que você vai ouvir falar não são de gente rodando sistema em produção — são de recursos esquecidos em ambientes de estudo. Um environment Beanstalk com ALB pode custar US$ 16/mês ligado fazendo nada. Você não vê, não usa, não quer, mas a fatura chega.
Como você fez tudo via CloudFormation, derrubar é um comando:
# Liste suas stacks
aws cloudformation list-stacks \
--stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE
# Delete uma stack
aws cloudformation delete-stack --stack-name order-system-prod
# Acompanhe a deleção
aws cloudformation describe-stacks --stack-name order-system-prod \
--query 'Stacks[0].StackStatus'
# Espere terminar (bloqueia até DELETE_COMPLETE ou DELETE_FAILED)
aws cloudformation wait stack-delete-complete \
--stack-name order-system-prodOrdem importa em stacks aninhadas
Se você tem stacks aninhadas (uma stack pai com stacks filhas), delete a pai — CloudFormation cuida de derrubar as filhas na ordem correta. Se deletou só a filha por engano e a pai ficou referenciando, você cai num estado meio quebrado e provavelmente vai precisar deletar a pai também.
O que CloudFormation NÃO deleta
- Buckets S3 com objetos. Se a stack criou um bucket e depois você (ou app) jogou objetos dentro, CloudFormation falha ao deletar. Esvazie antes: aws s3 rm s3://bucket --recursive.
- Tabelas DynamoDB com DeletionProtection. Se você ligou proteção, desligue antes via console ou CLI.
- Recursos com DeletionPolicy: Retain. Você marcou explicitamente para não apagar — então o recurso fica, e você precisa deletar manualmente depois.
- Recursos criados manualmente fora da stack. Sempre. Se você foi no console e criou um security group à mão, ele não é gerenciado pela stack e fica.
Checklist final de limpeza
- Delete todas as stacks CloudFormation do projeto.
- Liste e delete buckets S3 que sobrarem (esvazie primeiro).
- Verifique no Beanstalk: nenhum environment ativo.
- Verifique CloudWatch Logs: log groups antigos podem ficar — delete os que não vai mais usar.
- Verifique DynamoDB: nenhuma tabela ativa.
- Verifique SQS e SNS: nada listado.
- Verifique IAM: roles e policies criadas pela stack devem ter sumido. Users criados manualmente, você decide.
- Verifique billing dashboard: confirme que o uso voltou para zero nos próximos dias.
12. Exercícios de fixação
Os exercícios deste módulo final misturam observabilidade prática com reflexão sobre o que você aprendeu no curso inteiro.
Logs estruturados em todos os serviços
Adapte os 3 microserviços (Orders, Inventory, Payments) e ao menos uma Lambda para usar pino ou winston emitindo JSON com os campos do padrão (timestamp, level, service, event, requestId). Faça uma chamada de teste e verifique no console do CloudWatch que os logs estão sendo parseados como JSON.
Crie 3 alarmes essenciais
Crie via CloudFormation: (a) alarme de Lambda Errors > 5 em 5min para a função consumer Inventory; (b) alarme de OldestMessageAge > 300s na fila Inventory; (c) alarme de mensagem na DLQ > 0. Os 3 publicam num SNS topic alarms-prod com seu e-mail. Force os 3 a dispararem (jogue uma mensagem ruim na fila, por exemplo).
Métrica de domínio via EMF
Adicione na Lambda consumer Inventory uma métrica InventoryDecremented no namespace OrderSystem/Inventory com a dimensão ProductId (escolha 3-5 produtos para limitar cardinalidade). Use a biblioteca aws-embedded-metrics. Faça 50 pedidos no sistema e visualize a métrica no console.
X-Ray ligado e investigado
Habilite X-Ray em todas as Lambdas (TracingConfig: Active). Faça 20 chamadas no sistema. Abra o X-Ray Service Map: você deve ver os serviços conectados. Abra um trace específico e identifique o passo mais lento — qual operação domina a latência total?
Dashboard operacional
Crie via CloudFormation um dashboard OrderSystem-Operations com 5 widgets: throughput de pedidos, p95 de latência por serviço, tamanho das filas, erros de Lambda por função, e top erros recentes (Logs Insights). Tire um screenshot do dashboard preenchido.
Reflexão escrita: o que você construiu
Em texto livre (15-25 linhas, sem consultar os PDFs): descreva o sistema que você construiu — quais serviços fazem parte, como eles se comunicam, que tipos de evento percorrem o sistema. Depois, releia o módulo 0 e compare com o que você escreveu lá. O que mudou?
Destruindo tudo (último exercício)
Execute o checklist da seção 11. Delete todas as stacks. Confirme no console que os recursos sumiram. No dia seguinte, abra o Cost Explorer e verifique que o gasto voltou para perto de zero. Esse é o exercício mais importante do módulo — significa que você terminou no controle.
13. Encerramento e próximos passos
Você chegou ao fim. Não em sentido figurado — chegou ao fim mesmo, com um sistema funcional construído, executado, observado e desfeito. Vale uma pausa rápida para olhar o que aconteceu.
O que você sabe agora que não sabia antes
- Microserviços não são mágica. São uma decisão de arquitetura com trade-offs concretos: independência operacional vs complexidade de coordenação. Você sentiu os dois lados na pele.
- NoSQL exige modelagem diferente. Você modelou DynamoDB pelos access patterns, escolheu partition keys, criou GSIs. Não é pior nem melhor que SQL — é diferente.
- PaaS e FaaS resolvem coisas diferentes. Beanstalk para serviços sempre-ligados de baixa latência, Lambda para tarefas event-driven. Você usou os dois e entendeu quando cada um faz sentido.
- Mensageria desacopla. Orders não conhece Inventory. Você pode trocar Inventory inteiro amanhã que Orders nem percebe — porque tudo passa por SNS+SQS.
- Infraestrutura é código. Tudo que você criou pode ser recriado por create-stack. Isso muda a relação com a infra: ela vira um artefato, não um patrimônio.
- Observabilidade não é luxo. Sem logs estruturados, métricas e alarmes, o sistema é uma caixa preta. Com eles, ele se explica.
Para onde ir agora
Você está num ponto interessante: tem base sólida para escolher direções específicas. Algumas sugestões organizadas por interesse:
Aprofundamento técnico
- API Gateway + Cognito — autenticação real, rate limiting, planos de uso. Pega o sistema atual e bota um gateway com auth na frente.
- Step Functions — orquestração de workflows. Útil quando você tem fluxos de várias etapas com retentativa, branching, paralelismo. Sagas distribuídas viram pão com manteiga.
- EventBridge — sucessor moderno do SNS para eventos. Suporta schemas, regras complexas, integração nativa com SaaS. Vale migrar Orders→Inventory pra ver a diferença.
- ECS / Fargate — containers gerenciados. Quando Beanstalk começa a apertar, este é o próximo degrau.
Práticas e cultura
- The Twelve-Factor App — ler e aplicar. Você já usa boa parte sem saber.
- Designing Data-Intensive Applications (Kleppmann) — o livro de cabeceira para quem trabalha com sistemas distribuídos.
- Well-Architected Framework da AWS — 6 pilares que organizam pensamento sobre projetos AWS. Faça o review do seu projeto.
- Chaos Engineering — quando você confiar no sistema, comece a quebrá-lo de propósito (FIS na AWS) para validar a resiliência.
Certificações (se você quiser)
Esse projeto cobre boa parte de duas certificações AWS. Se você está pensando em prova:
- AWS Certified Developer — Associate — 100% alinhada com o que você fez. Você cobriu Lambda, DynamoDB, SQS, SNS, IAM, CloudWatch e CloudFormation. Falta um pouco de Cognito, API Gateway, Kinesis.
- AWS Certified Solutions Architect — Associate — Cobre tudo isso e mais arquitetura: VPC, EC2 em profundidade, RDS, S3 avançado, Route 53. É a certificação mais comum como “primeira AWS”.
E quando der errado
Em algum momento você vai estar trabalhando em algo, vai dar errado de um jeito que você não consegue explicar, e vai sentir que está perdendo tempo. Lembre-se: esse momento é o aprendizado. Tudo que você sentiu nesse curso — frustração com permissões, susto com timeout, demora pra entender por que o evento não estava chegando — é exatamente o que constrói intuição. Os engenheiros que você admira passaram por isso milhares de vezes e simplesmente lembram do padrão na próxima vez.
FIM DO CURSO
Obrigado por ter chegado até aqui.
Você sabe AWS na prática agora. Use bem.