Saltar al contenido principal

Conceptos AWS Lambda

¿Qué es Lambda?​

AWS Lambda es un servicio de cómputo serverless que ejecuta su código en respuesta a eventos, sin que usted tenga que administrar servidores.

┌─────────────────────────────────────────────────────────────┐
│ LAMBDA vs EC2 │
├─────────────────────────────────────────────────────────────┤
│ │
│ EC2 (Servidor) Lambda (Serverless) │
│ ───────────── ────────────────── │
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Servidor │ │ Función │ │
│ │ 24/7 │ │ bajo │ │
│ │ activo │ │ demanda │ │
│ └─────────────┘ └─────────────┘ │
│ │
│ • Usted administra el servidor • AWS administra la infra│
│ • Se paga incluso en reposo • Se paga por ejecución │
│ • Escalado manual/ASG • Escalado automático │
│ • Requiere parches • Cero mantenimiento │
│ • Ejecución larga OK • Máx 15 minutos │
│ │
│ Costo mensual (ejemplo): │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ EC2 t3.medium 24/7 = ~$30/mes │ │
│ │ Lambda 1M solicitudes = ~$0.20/mes │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

Modelo de Ejecución​

┌─────────────────────────────────────────────────────────────┐
│ MODELO DE EJECUCIÓN LAMBDA │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. EVENTO DESENCADENANTE │
│ ───────────────────── │
│ • Solicitud API Gateway │
│ • Subida de archivo S3 │
│ • Mensaje SQS │
│ • Evento CloudWatch │
│ • Modificación DynamoDB │
│ │
│ 2. INVOCACIÓN │
│ ────────── │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────────────────┐ │
│ │ Trigger │───►│ AWS │───►│ Entorno de │ │
│ │ (event) │ │ Lambda │ │ ejecución │ │
│ └─────────┘ │ Service │ │ │ │
│ └─────────┘ │ ┌───────────────┐ │ │
│ │ │ Su código │ │ │
│ │ │ (handler) │ │ │
│ │ └───────────────┘ │ │
│ └─────────────────────┘ │
│ │
│ 3. CICLO DE VIDA │
│ ──────────── │
│ │
│ Cold Start Warm Terminado │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ Init │────────►│ Invoke │──(idle)───►│ Shut │ │
│ │ ~100ms │ │ ~10ms │ │ down │ │
│ └────────┘ └────────┘ └────────┘ │
│ │ │
│ ▼ │
│ Reutilizado si una nueva │
│ solicitud llega rápido │
│ │
└─────────────────────────────────────────────────────────────┘

Configuración Lambda​

Parámetros Clave​

ParámetroDescripciónValores
RuntimeLenguaje de ejecuciónPython, Node.js, Java, Go, .NET, Ruby
HandlerPunto de entradafichier.fonction
MemoryRAM asignada128 MB - 10,240 MB
TimeoutDuración máx1 seg - 15 min
EnvironmentVariables de entornoClave=Valor
RolePermisos IAMARN del rol

Memoria y CPU​

┌─────────────────────────────────────────────────────────────┐
│ MEMORY = CPU │
├─────────────────────────────────────────────────────────────┤
│ │
│ En Lambda, ¡la memoria también determina la CPU! │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Memory CPU Caso de uso │ │
│ │ ────── ─── ────────── │ │
│ │ 128 MB ~0.08 vCPU Simple, API ligera │ │
│ │ 512 MB ~0.33 vCPU Estándar │ │
│ │ 1024 MB ~0.58 vCPU Procesamiento medio │ │
│ │ 1769 MB 1 vCPU Intensivo en CPU │ │
│ │ 3008 MB ~1.75 vCPU Procesamiento pesado │ │
│ │ 10240 MB 6 vCPU Máx rendimiento │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 💡 Más memoria = más CPU = ejecución más rápida │
│ ¡A veces, más memoria cuesta MENOS! │
│ │
│ Ejemplo: │
│ • 128MB × 10s = 1.25 GB-segundo │
│ • 1024MB × 1.5s = 1.5 GB-segundo (más rápido, ~$ igual) │
│ │
└─────────────────────────────────────────────────────────────┘

Triggers (Desencadenadores)​

Fuentes de Eventos​

┌─────────────────────────────────────────────────────────────┐
│ TRIGGERS LAMBDA │
├─────────────────────────────────────────────────────────────┤
│ │
│ SINCRONOS (esperan respuesta) │
│ ───────────────────────────────── │
│ • API Gateway → APIs REST/HTTP │
│ • ALB → Load Balancer │
│ • CloudFront → Lambda@Edge │
│ • Cognito → Auth triggers │
│ │
│ ASINCRONOS (fire-and-forget) │
│ ───────────────────────────── │
│ • S3 → Upload, delete │
│ • SNS → Mensajes │
│ • CloudWatch Events → Cron, eventos │
│ • SES → Emails │
│ │
│ POLLING (Lambda consulta la fuente) │
│ ─────────────────────────────── │
│ • SQS → Cola de mensajes │
│ • DynamoDB Streams → Cambios en BD │
│ • Kinesis → Datos en streaming │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ S3 ──────┐ │ │
│ │ │ │ │
│ │ API ──────┼──────► Lambda ──────► DynamoDB │ │
│ │ │ │ │
│ │ SQS ──────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

Estructura del Código​

Handler Python​

import json

def lambda_handler(event, context):
"""
event : Datos del evento desencadenante
context : Información de ejecución
"""

# Leer los datos del evento
print(f"Event: {json.dumps(event)}")

# Información del 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")

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

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

Handler Node.js​

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

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

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

Permisos IAM​

┌─────────────────────────────────────────────────────────────┐
│ PERMISOS LAMBDA │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. EXECUTION ROLE (lo que Lambda puede hacer) │
│ ────────────────────────────────────── │
│ Rol IAM adjunto a la función │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Permisos típicos: │ │
│ │ │ │
│ │ • logs:CreateLogGroup │ │
│ │ • logs:CreateLogStream │ │
│ │ • logs:PutLogEvents │ │
│ │ • s3:GetObject (si acceso S3) │ │
│ │ • dynamodb:PutItem (si acceso DDB) │ │
│ │ • sqs:ReceiveMessage (si trigger SQS) │ │
│ │ │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ 2. RESOURCE-BASED POLICY (quién puede invocar Lambda) │
│ ───────────────────────────────────────────────── │
│ Permite a otros servicios llamar la función │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Ejemplo: S3 puede invocar esta función │ │
│ │ │ │
│ │ Principal: s3.amazonaws.com │ │
│ │ Action: lambda:InvokeFunction │ │
│ │ Condition: bucket = my-bucket │ │
│ │ │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ Principio de menor privilegio: │
│ ✅ Permisos mínimos necesarios │
│ ❌ Nunca AdministratorAccess en Lambda │
│ │
└─────────────────────────────────────────────────────────────┘

Tarifación​

┌─────────────────────────────────────────────────────────────┐
│ TARIFACIÓN LAMBDA │
├─────────────────────────────────────────────────────────────┤
│ │
│ Usted paga por: │
│ 1. Número de solicitudes │
│ 2. Duración de ejecución (GB-segundos) │
│ │
│ GRATUITO (Free Tier permanente): │
│ • 1 millón de solicitudes/mes │
│ • 400,000 GB-segundos/mes │
│ │
│ MÁS ALLÁ DEL FREE TIER: │
│ • $0.20 por millón de solicitudes │
│ • $0.0000166667 por GB-segundo │
│ │
│ Ejemplo de cálculo: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Función: 512 MB, 200ms promedio, 5M solicitudes/mes│ │
│ │ │ │
│ │ GB-segundos = 5M × 0.512 GB × 0.2s = 512,000 │ │
│ │ │ │
│ │ Costo solicitudes: (5M - 1M) × $0.20/M = $0.80 │ │
│ │ Costo duración: (512K - 400K) × $0.0000166667 │ │
│ │ = 112K × $0.0000166667 = $1.87 │ │
│ │ │ │
│ │ TOTAL: $2.67/mes │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 💡 ¡Muy económico para cargas variables! │
│ │
└─────────────────────────────────────────────────────────────┘

Resumen​

ConceptoDescripción
ServerlessNo hay servidor que administrar
Event-drivenEjecutado por eventos
HandlerPunto de entrada del código
Cold StartTiempo de inicialización
Memory = CPUMás RAM = más CPU
15 min maxLímite de duración

Próxima sección: Creación de Funciones