Saltar al contenido

lección 9

Lambda: funciones serverless para datos

Triggers S3, ingesta event-driven, límites de memoria/tiempo, cold starts y patrones comunes de Lambda para pipelines de datos.

50 min

Lambda es la pieza más elegante del puzzle serverless de AWS. La idea es brutalmente simple: escribes una función (Python, Node.js, Java...), la subes a AWS, y se ejecuta automáticamente cuando algo pasa. ¿Llegó un archivo nuevo a S3? Lambda se ejecuta. ¿Llegó un mensaje a SQS? Lambda se ejecuta. ¿Es medianoche? Lambda se ejecuta. No hay servidores que gestionar, no hay clústeres que dimensionar. Pagas solo por los milisegundos que tu función está ejecutándose.

En ingeniería de datos, Lambda es el "pegamento ligero" — ideal para tareas cortas y event-driven: validar un archivo que acaba de llegar, disparar un pipeline, transformar un JSON pequeño, enviar una notificación si los datos fallan un check de calidad. NO es para procesar 500GB de Parquet (para eso tienes Glue/EMR). Es para la lógica de orquestación y las transformaciones ligeras.

En Windows con Docker Desktop, la invocación de Lambda puede fallar porque LocalStack necesita Docker-in-Docker para ejecutar funciones. Soluciones: (1) Añade LAMBDA_EXECUTOR=local en tu docker-compose.yml para ejecutar Lambda sin Docker anidado. (2) En Mac/Linux, monta el Docker socket: -v /var/run/docker.sock:/var/run/docker.sock. (3) Si la invocación falla, la creación de la función sí funciona — puedes verificar que tu código es correcto con get_function.

### Anatomía de una función Lambda

1# handler.py — una función Lambda básica
2import json
3import boto3
4
5def handler(event, context):
6 """
7 event: lo que disparó la función (datos del trigger)
8 context: metadata de la ejecución (tiempo restante, memoria, etc.)
9 """
10 # Ejemplo: trigger de S3 — un archivo nuevo llegó al bucket
11 for record in event.get('Records', []):
12 bucket = record['s3']['bucket']['name']
13 key = record['s3']['object']['key']
14 size = record['s3']['object']['size']
15
16 print(f"Nuevo archivo: s3://{bucket}/{key} ({size} bytes)")
17
18 # Lógica: validar, mover, notificar, disparar pipeline...
19 if key.endswith('.csv') and size > 0:
20 procesar_csv(bucket, key)
21 elif size == 0:
22 notificar_error(f"Archivo vacío: {key}")
23
24 return {'statusCode': 200, 'body': json.dumps('OK')}
25
26def procesar_csv(bucket, key):
27 """Ejemplo: mover CSV a zona de procesamiento."""
28 s3 = boto3.client('s3')
29 # Copiar a processed/
30 s3.copy_object(
31 Bucket=bucket,
32 Key=f"processing/{key.split('/')[-1]}",
33 CopySource={'Bucket': bucket, 'Key': key}
34 )
35 print(f"Movido a processing/")

La función handler recibe un event (quién la disparó) y un context (metadata)

### Triggers: qué puede disparar una Lambda

  • S3 Events: archivo creado, eliminado o modificado → Lambda procesa el archivo.
  • SQS: mensaje llega a la cola → Lambda lo procesa.
  • EventBridge: regla de evento (schedule, patrón) → Lambda se ejecuta.
  • API Gateway: petición HTTP → Lambda responde (APIs serverless).
  • CloudWatch Events/Schedule: cron serverless (cada hora, cada día...).
  • Step Functions: como paso dentro de un workflow.

### Límites que DEBES conocer

  • Tiempo máximo: 15 minutos. Si tu tarea tarda más, no es para Lambda.
  • Memoria: 128MB a 10GB. Más memoria = más CPU (son proporcionales).
  • Paquete desplegable: 50MB comprimido, 250MB descomprimido.
  • Concurrencia: 1000 ejecuciones simultáneas por defecto (ampliable).
  • /tmp: 512MB de almacenamiento temporal (10GB con EFS).

### Cold starts: el problema del arranque en frío

Cuando Lambda no ha ejecutado tu función recientemente, necesita levantar un contenedor nuevo: descargar tu código, inicializar el runtime, importar librerías. Esto añade 1-3 segundos extra a la primera invocación (cold start). Las siguientes invocaciones reutilizan el contenedor (warm start) y son rápidas. Para pipelines batch esto no importa. Para APIs con requisito de latencia baja, es un problema.

Consejo de senior: para reducir cold starts en Python, minimiza los imports. No hagas "import pandas" si solo necesitas json y boto3. Pandas añade ~1.5s de cold start. Si necesitas Pandas en Lambda, usa Lambda Layers con una versión precompilada.

### Crear y desplegar Lambda con boto3

1import boto3
2import json
3import zipfile
4import io
5
6lambda_client = boto3.client('lambda', endpoint_url='http://localhost:4566',
7 aws_access_key_id='test', aws_secret_access_key='test',
8 region_name='eu-west-1')
9
10# Crear el ZIP con el código de la función
11code = '''
12import json
13def handler(event, context):
14 print(f"Evento recibido: {json.dumps(event)}")
15 return {"statusCode": 200, "body": "Procesado OK"}
16'''
17
18zip_buffer = io.BytesIO()
19with zipfile.ZipFile(zip_buffer, 'w') as zf:
20 zf.writestr('handler.py', code)
21zip_buffer.seek(0)
22
23# Crear la función Lambda
24lambda_client.create_function(
25 FunctionName='procesar-archivo-raw',
26 Runtime='python3.11',
27 Role='arn:aws:iam::000000000000:role/LambdaETLRole',
28 Handler='handler.handler',
29 Code={'ZipFile': zip_buffer.read()},
30 Timeout=300, # 5 minutos máximo
31 MemorySize=256, # 256MB RAM
32 Environment={
33 'Variables': {
34 'BUCKET_OUTPUT': 'fashionstore-datalake',
35 'PREFIX_OUTPUT': 'processing/'
36 }
37 }
38)
39print("✅ Lambda creada: procesar-archivo-raw")

Crear función Lambda programáticamente — el código va en un ZIP

No pongas secretos (passwords, API keys) en las variables de entorno de Lambda en texto plano. Usa AWS Secrets Manager o SSM Parameter Store y léelos desde el código. Las variables de entorno son visibles en la consola para cualquiera con permisos de Lambda.

El patrón más común: S3 event dispara Lambda que inicia el pipeline

Consejo de senior: Lambda + S3 events es el patrón más potente para ingesta en tiempo real. Cada archivo que llega a raw/ dispara una Lambda que lo valida, lo mueve a processing/, y arranca el pipeline. Sin polling, sin cron. Los datos se procesan SEGUNDOS después de llegar.

## ejercicios

[01]

Crear Lambda de validación de archivos

Crea una función Lambda que se triggerea cuando llega un archivo a S3 y valida que: no está vacío, tiene extensión .csv o .parquet, y está en la carpeta correcta.

Cargando editor...
[02]

Invocar Lambda con evento de prueba

Invoca la Lambda de validación con un evento S3 simulado y verifica que responde correctamente.

Cargando editor...
[03]

Configurar trigger S3 → Lambda

Configura la notificación de un bucket S3 para que dispare tu Lambda automáticamente cuando llegue un archivo .csv a raw/.

Cargando editor...
[04]

Lambda con Dead Letter Queue

Configura una Lambda para que si falla 3 veces, envíe el evento a una Dead Letter Queue (SQS) para investigación posterior.

Cargando editor...

Regístrate para guardar tu progreso.

## comentarios

Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.

Inicia sesión para comentar y responder.

cargando comentarios...