Depuração Lambda
Erros Comuns
Visão Geral
┌─────────────────────────────────────────────────────────────┐
│ ERROS LAMBDA COMUNS │
├─────────────────────────────────────────────────────────────┤
│ │
│ CATEGORIA ERRO CAUSA TÍPICA │
│ ───────── ────── ───────────── │
│ │
│ PERMISSÕES AccessDenied Falta de role IAM │
│ ResourceNotFound ARN incorreto │
│ │
│ EXECUÇÃO Timeout Código muito lento │
│ OutOfMemory RAM insuficiente │
│ HandlerNotFound Handler mal config│
│ │
│ CÓDIGO ImportError Módulo ausente │
│ SyntaxError Erro de sintaxe │
│ RuntimeError Bug no código │
│ │
│ CONFIGURAÇÃO InvalidParameter Configuração ruim │
│ TooManyRequests Throttling │
│ │
└─────────────────────────────────────────────────────────────┘
Timeout
Sintomas e Soluções
┌─────────────────────────────────────────────────────────────┐
│ TIMEOUT │
├─────────────────────────────────────────────────────────────┤
│ │
│ SINTOMA: │
│ "Task timed out after X seconds" │
│ │
│ CAUSAS POSSÍVEIS: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 1. Operação muito longa │ │
│ │ • Requisição API externa lenta │ │
│ │ • Processamento de arquivos grandes │ │
│ │ • Cálculo intensivo │ │
│ │ │ │
│ │ 2. Timeout configurado muito curto │ │
│ │ • Padrão: 3 segundos │ │
│ │ • Máx: 15 minutos │ │
│ │ │ │
│ │ 3. Bloqueio de rede │ │
│ │ • VPC mal configurado │ │
│ │ • NAT Gateway ausente │ │
│ │ • Security Group bloqueando │ │
│ │ │ │
│ │ 4. Código em espera infinita │ │
│ │ • Conexão DB que não responde │ │
│ │ • Loop infinito │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ SOLUÇÕES: │
│ ✅ Aumentar o timeout (se justificado) │
│ ✅ Otimizar o código │
│ ✅ Usar timeouts no código (requests, DB) │
│ ✅ Verificar a configuração de rede (VPC, NAT) │
│ ✅ Dividir em funções menores │
│ │
└─────────────────────────────────────────────────────────────┘
Código com Timeout
import requests
import boto3
# ❌ RUIM: Sem timeout
response = requests.get('https://api.example.com/data')
# ✅ BOM: Com timeout
response = requests.get('https://api.example.com/data', timeout=5)
# ✅ BOM: Verificar tempo restante
def lambda_handler(event, context):
remaining = context.get_remaining_time_in_millis()
if remaining < 5000: # Menos de 5 segundos
return {'error': 'Not enough time remaining'}
# Continuar o processamento...
Out of Memory
┌─────────────────────────────────────────────────────────────┐
│ OUT OF MEMORY │
├─────────────────────────────────────────────────────────────┤
│ │
│ SINTOMA: │
│ "Runtime exited with error: signal: killed" │
│ "Process exited before completing request" │
│ │
│ CAUSAS: │
│ • Carregamento de arquivos grandes em memória │
│ • Vazamentos de memória │
│ • RAM configurada muito baixa │
│ │
│ DIAGNÓSTICO: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Nos logs do CloudWatch: │ │
│ │ │ │
│ │ REPORT RequestId: xxx │ │
│ │ Duration: 1500.00 ms │ │
│ │ Billed Duration: 1500 ms │ │
│ │ Memory Size: 128 MB │ │
│ │ Max Memory Used: 127 MB ← Perto do máximo! │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ SOLUÇÕES: │
│ ✅ Aumentar a memória alocada │
│ ✅ Processar arquivos em streaming │
│ ✅ Liberar recursos após uso │
│ ✅ Usar arquivos temporários (/tmp) │
│ │
└─────────────────────────────────────────────────────────────┘
Código Otimizado para Memória
import json
# ❌ RUIM: Carrega tudo em memória
def process_large_file_bad(bucket, key):
s3 = boto3.client('s3')
response = s3.get_object(Bucket=bucket, Key=key)
data = response['Body'].read() # Tudo na RAM!
return json.loads(data)
# ✅ BOM: Streaming
def process_large_file_good(bucket, key):
s3 = boto3.client('s3')
response = s3.get_object(Bucket=bucket, Key=key)
# Processar linha por linha
for line in response['Body'].iter_lines():
process_line(line)
Erros de Permissões
┌─────────────────────────────────────────────────────────────┐
│ ERROS IAM │
├─────────────────────────────────────────────────────────────┤
│ │
│ "AccessDeniedException" │
│ "User is not authorized to perform..." │
│ │
│ CHECKLIST: │
│ │
│ ☐ O role de execução tem as permissões corretas? │
│ aws lambda get-function --function-name xxx │
│ → Verificar o ARN do "Role" │
│ │
│ ☐ A policy IAM está correta? │
│ aws iam get-role-policy --role-name xxx │
│ → Verificar as ações permitidas │
│ │
│ ☐ Os recursos estão especificados corretamente? │
│ → ARN exato vs wildcard (*) │
│ │
│ ☐ Não há Deny explícito bloqueando? │
│ → Verificar SCPs, policies │
│ │
│ EXEMPLO DE POLICY CORRETA: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ { │ │
│ │ "Effect": "Allow", │ │
│ │ "Action": [ │ │
│ │ "s3:GetObject", │ │
│ │ "s3:PutObject" │ │
│ │ ], │ │
│ │ "Resource": "arn:aws:s3:::my-bucket/*" │ │
│ │ } │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Cold Start
┌─────────────────────────────────────────────────────────────┐
│ COLD START │
├─────────────────────────────────────────────────────────────┤
│ │
│ O "Cold Start" é o tempo de inicialização quando │
│ o Lambda cria um novo ambiente de execução. │
│ │
│ TIMELINE: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ COLD START (1ª invocação) │ │
│ │ ├── Download do código (50-200ms) │ │
│ │ ├── Inicialização do runtime (100-500ms) │ │
│ │ ├── Inicialização (seu código init) │ │
│ │ └── Execução do handler │ │
│ │ │ │
│ │ WARM (invocações seguintes) │ │
│ │ └── Execução apenas do handler (~10ms) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ FATORES QUE AUMENTAM O COLD START: │
│ • Pacote grande (muitas dependências) │
│ • Runtime pesado (Java > Python > Node) │
│ • VPC (adiciona 1-10 segundos!) │
│ • Inicialização complexa │
│ │
│ OTIMIZAÇÕES: │
│ ✅ Provisioned Concurrency (mantém instâncias aquecidas) │
│ ✅ Reduzir o tamanho do pacote │
│ ✅ Inicializar fora do handler │
│ ✅ Evitar VPC se não for necessário │
│ ✅ Usar runtimes leves │
│ │
└─────────────────────────────────────────────────────────────┘
Logs CloudWatch
Leitura dos Logs
┌─────────────────────────────────────────────────────────────┐
│ LOGS CLOUDWATCH │
├─────────────────────────────────────────────────────────────┤
│ │
│ Localização: │
│ /aws/lambda/<function-name> │
│ │
│ Formato de um log: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ START RequestId: abc-123 │ │
│ │ [INFO] Processing event... │ │
│ │ [ERROR] Failed to connect to database │ │
│ │ END RequestId: abc-123 │ │
│ │ REPORT RequestId: abc-123 │ │
│ │ Duration: 1234.56 ms │ │
│ │ Billed Duration: 1300 ms │ │
│ │ Memory Size: 256 MB │ │
│ │ Max Memory Used: 128 MB │ │
│ │ Init Duration: 234.56 ms ← Cold start! │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Comandos CLI: │
│ # Ver os últimos logs │
│ aws logs tail /aws/lambda/my-function --follow │
│ │
│ # Filtrar erros │
│ aws logs filter-log-events \ │
│ --log-group-name /aws/lambda/my-function \ │
│ --filter-pattern "ERROR" │
│ │
└─────────────────────────────────────────────────────────────┘
Método de Diagnóstico
┌─────────────────────────────────────────────────────────────┐
│ MÉTODO DE DIAGNÓSTICO │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. IDENTIFICAR O SINTOMA │
│ • Mensagem de erro exata │
│ • Código HTTP retornado │
│ • Comportamento observado │
│ │
│ 2. CONSULTAR OS LOGS │
│ • CloudWatch Logs │
│ • X-Ray traces (se ativado) │
│ • Logs do aplicativo │
│ │
│ 3. VERIFICAR A CONFIGURAÇÃO │
│ • Timeout │
│ • Memória │
│ • Variáveis de ambiente │
│ • VPC / Security Groups │
│ │
│ 4. VERIFICAR AS PERMISSÕES │
│ • Role de execução │
│ • Policies anexadas │
│ • Resource policies │
│ │
│ 5. TESTAR ISOLADAMENTE │
│ • Invocar manualmente │
│ • Simplificar o payload │
│ • Desativar features uma a uma │
│ │
│ 6. CORRIGIR E VALIDAR │
│ • Aplicar o fix │
│ • Testar com o mesmo cenário │
│ • Documentar a solução │
│ │
└─────────────────────────────────────────────────────────────┘
Resumo das Soluções
| Erro | Causa | Solução |
|---|---|---|
| Timeout | Código lento | Otimizar, aumentar timeout |
| OutOfMemory | RAM insuficiente | Aumentar memória, streaming |
| AccessDenied | Falta de IAM | Adicionar permissões |
| Cold Start | Inicialização | Provisioned Concurrency |
| Handler not found | Nome incorreto | Verificar configuração do handler |
Próxima seção: Lab Depuração