Pular para o conteúdo principal

Conceitos AWS Lambda

O que é Lambda?​

AWS Lambda é um serviço de computação serverless que executa seu código em resposta a eventos, sem que você precise gerenciar servidores.

┌─────────────────────────────────────────────────────────────┐
│ LAMBDA vs EC2 │
├─────────────────────────────────────────────────────────────┤
│ │
│ EC2 (Servidor) Lambda (Serverless) │
│ ───────────── ────────────────── │
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Servidor │ │ Função │ │
│ │ 24/7 │ │ sob demanda│ │
│ │ ativo │ │ │ │
│ └─────────────┘ └─────────────┘ │
│ │
│ • Você gerencia o servidor • AWS gerencia a infra │
│ • Pago mesmo em repouso • Pago por execução │
│ • Scaling manual/ASG • Scaling automático │
│ • Patching necessário • Zero manutenção │
│ • Execução longa OK • Máx 15 minutos │
│ │
│ Custo mensal (exemplo): │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ EC2 t3.medium 24/7 = ~$30/mês │ │
│ │ Lambda 1M requisições = ~$0.20/mês │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

Modelo de Execução​

┌─────────────────────────────────────────────────────────────┐
│ MODELO DE EXECUÇÃO LAMBDA │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. EVENTO DISPARADOR │
│ ───────────────────── │
│ • Requisição API Gateway │
│ • Upload de arquivo S3 │
│ • Mensagem SQS │
│ • Evento CloudWatch │
│ • Modificação DynamoDB │
│ │
│ 2. INVOCATION │
│ ────────── │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────────────────┐ │
│ │ Trigger │───►│ AWS │───►│ Ambiente de │ │
│ │ (event) │ │ Lambda │ │ execução │ │
│ └─────────┘ │ Service │ │ │ │
│ └─────────┘ │ ┌───────────────┐ │ │
│ │ │ Seu código │ │ │
│ │ │ (handler) │ │ │
│ │ └───────────────┘ │ │
│ └─────────────────────┘ │
│ │
│ 3. CICLO DE VIDA │
│ ──────────── │
│ │
│ Cold Start Warm Finalizado │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ Init │────────►│ Invoke │──(idle)───►│ Shut │ │
│ │ ~100ms │ │ ~10ms │ │ down │ │
│ └────────┘ └────────┘ └────────┘ │
│ │ │
│ ▼ │
│ Reutilizado se nova │
│ requisição chegar rápido │
│ │
└─────────────────────────────────────────────────────────────┘

Configuração Lambda​

Parâmetros Chave​

ParâmetroDescriçãoValores
RuntimeLinguagem de execuçãoPython, Node.js, Java, Go, .NET, Ruby
HandlerPonto de entradaarquivo.função
MemoryRAM alocada128 MB - 10.240 MB
TimeoutDuração máxima1 seg - 15 min
EnvironmentVariáveis de ambienteChave=Valor
RolePermissões IAMARN do role

Memory e CPU​

┌─────────────────────────────────────────────────────────────┐
│ MEMORY = CPU │
├─────────────────────────────────────────────────────────────┤
│ │
│ No Lambda, a memória também determina o CPU! │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Memory CPU Caso de uso │ │
│ │ ────── ─── ────────── │ │
│ │ 128 MB ~0.08 vCPU Simples, API leve │ │
│ │ 512 MB ~0.33 vCPU Padrão │ │
│ │ 1024 MB ~0.58 vCPU Processamento médio │ │
│ │ 1769 MB 1 vCPU CPU-intensive │ │
│ │ 3008 MB ~1.75 vCPU Processamento pesado │ │
│ │ 10240 MB 6 vCPU Máx performance │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 💡 Mais memória = mais CPU = execução mais rápida │
│ Às vezes, mais memória custa MENOS! │
│ │
│ Exemplo: │
│ • 128MB × 10s = 1,25 GB-segundo │
│ • 1024MB × 1,5s = 1,5 GB-segundo (mais rápido, ~mesmo $) │
│ │
└─────────────────────────────────────────────────────────────┘

Triggers (Disparadores)​

Fontes de Eventos​

┌─────────────────────────────────────────────────────────────┐
│ TRIGGERS LAMBDA │
├─────────────────────────────────────────────────────────────┤
│ │
│ SÍNCRONOS (aguardam resposta) │
│ ───────────────────────────────── │
│ • API Gateway → APIs REST/HTTP │
│ • ALB → Load Balancer │
│ • CloudFront → Lambda@Edge │
│ • Cognito → Auth triggers │
│ │
│ ASSÍNCRONOS (fire-and-forget) │
│ ───────────────────────────── │
│ • S3 → Upload, delete │
│ • SNS → Mensagens │
│ • CloudWatch Events → Cron, eventos │
│ • SES → Emails │
│ │
│ POLLING (Lambda faz polling da fonte) │
│ ─────────────────────────────── │
│ • SQS → Fila de mensagens │
│ • DynamoDB Streams → Mudanças no DB │
│ • Kinesis → Streaming de dados │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ S3 ──────┐ │ │
│ │ │ │ │
│ │ API ──────┼──────► Lambda ──────► DynamoDB │ │
│ │ │ │ │
│ │ SQS ──────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

Estrutura do Código​

Handler Python​

import json

def lambda_handler(event, context):
"""
event : Dados do evento disparador
context : Informações da execução
"""

# Ler os dados do evento
print(f"Event: {json.dumps(event)}")

# Informações do contexto
print(f"Function: {context.function_name}")
print(f"Request ID: {context.aws_request_id}")
print(f"Time remaining: {context.get_remaining_time_in_millis()}ms")

# Sua lógica aqui
name = event.get('name', 'World')
message = f"Hello, {name}!"

# Retornar a resposta
return {
'statusCode': 200,
'body': json.dumps({
'message': message
})
}

Handler Node.js​

exports.handler = async (event, context) => {
// Log do evento
console.log('Event:', JSON.stringify(event, null, 2));

// Sua lógica
const name = event.name || 'World';
const message = `Hello, ${name}!`;

// Retornar a resposta
return {
statusCode: 200,
body: JSON.stringify({
message: message
})
};
};

Permissões IAM​

┌─────────────────────────────────────────────────────────────┐
│ PERMISSÕES LAMBDA │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. EXECUTION ROLE (o que Lambda pode fazer) │
│ ────────────────────────────────────── │
│ Role IAM anexado à função │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Permissões típicas: │ │
│ │ │ │
│ │ • logs:CreateLogGroup │ │
│ │ • logs:CreateLogStream │ │
│ │ • logs:PutLogEvents │ │
│ │ • s3:GetObject (se acesso S3) │ │
│ │ • dynamodb:PutItem (se acesso DDB) │ │
│ │ • sqs:ReceiveMessage (se trigger SQS) │ │
│ │ │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ 2. RESOURCE-BASED POLICY (quem pode invocar Lambda) │
│ ───────────────────────────────────────────────── │
│ Permite que outros serviços chamem a função │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Exemplo: S3 pode invocar esta função │ │
│ │ │ │
│ │ Principal: s3.amazonaws.com │ │
│ │ Action: lambda:InvokeFunction │ │
│ │ Condition: bucket = my-bucket │ │
│ │ │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ Princípio do menor privilégio: │
│ ✅ Permissões mínimas necessárias │
│ ❌ Nunca AdministratorAccess no Lambda │
│ │
└─────────────────────────────────────────────────────────────┘

Precificação​

┌─────────────────────────────────────────────────────────────┐
│ PRECIFICAÇÃO LAMBDA │
├─────────────────────────────────────────────────────────────┤
│ │
│ Você paga por: │
│ 1. Número de requisições │
│ 2. Duração da execução (GB-segundos) │
│ │
│ GRATUITO (Free Tier permanente): │
│ • 1 milhão de requisições/mês │
│ • 400.000 GB-segundos/mês │
│ │
│ ACIMA DO FREE TIER: │
│ • $0.20 por milhão de requisições │
│ • $0.0000166667 por GB-segundo │
│ │
│ Exemplo de cálculo: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Função: 512 MB, 200ms média, 5M requisições/mês │ │
│ │ │ │
│ │ GB-segundos = 5M × 0.512 GB × 0.2s = 512.000 │ │
│ │ │ │
│ │ Custo requisições: (5M - 1M) × $0.20/M = $0.80 │ │
│ │ Custo duração: (512K - 400K) × $0.0000166667 │ │
│ │ = 112K × $0.0000166667 = $1.87 │ │
│ │ │ │
│ │ TOTAL: $2.67/mês │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 💡 Muito econômico para cargas variáveis! │
│ │
└─────────────────────────────────────────────────────────────┘

Resumo​

ConceitoDescrição
ServerlessNenhum servidor para gerenciar
Event-drivenExecutado por eventos
HandlerPonto de entrada do código
Cold StartTempo de inicialização
Memory = CPUMais RAM = mais CPU
15 min maxLimite de duração

Próxima seção: Criação de Funções