Lambda tiene una característica muy comentada: los cold starts (arranques en frío). Es el «precio» que a veces se paga por el modelo bajo demanda del subcapítulo 14.1. En este subcapítulo entenderás qué son, por qué ocurren y qué puedes hacer para reducir su impacto.
Qué es un cold start
Recuerda cómo funciona Lambda: tu código no está siempre encendido, sino que AWS lo arranca cuando llega un evento. Pues bien, ese arranque tiene dos escenarios:
-
Cold start (arranque en frío): es la primera vez que se invoca la función (o tras un rato sin usarse). AWS tiene que preparar el entorno desde cero: reservar recursos, cargar tu código, inicializar el runtime (Python, Java...), cargar las librerías. Esto añade un retraso extra, normalmente de unos cientos de milisegundos a un par de segundos.
-
Warm start (arranque en caliente): si la función se ha usado hace poco, AWS reutiliza el entorno que ya estaba preparado. Aquí no hay retraso de preparación: la función responde al instante.
Primera invocación (frío): [preparar entorno]──[cargar código y librerías]──[ejecutar] └──── retraso extra (cold start) ────┘ Invocaciones siguientes (caliente): [ejecutar] ← entorno ya listo, sin retraso
Analogía: un cold start es como arrancar un coche en una mañana de invierno: el motor frío tarda un poco en ponerse a punto. Una vez en marcha (caliente), arrancas y aceleras al instante. Si lo dejas aparcado un buen rato, vuelve a enfriarse.
Por qué importa (y cuándo no)
El impacto del cold start depende del tipo de aplicación:
- Importa en aplicaciones interactivas donde el usuario espera una respuesta rápida (una API que responde a una app móvil). Un retraso de 1-2 segundos en la primera petición puede notarse.
- No importa en tareas de fondo o asíncronas (procesar un archivo subido, vaciar una cola). Si la tarea tarda unos segundos más en empezar, a nadie le afecta.
También depende del lenguaje: runtimes ligeros como Python o Node.js tienen cold starts cortos; runtimes más pesados como Java o .NET arrancan más despacio (aunque hay técnicas para mejorarlo).
Estrategias para reducir los cold starts
- Provisioned Concurrency (concurrencia aprovisionada)
Es la solución más directa: le dices a AWS que mantenga un número de entornos siempre calientes y listos, esperando peticiones. Así, esas invocaciones nunca sufren cold start.
Provisioned Concurrency = 5 → AWS mantiene 5 entornos siempre calientes → las primeras 5 peticiones simultáneas responden al instante
Es como tener varios coches con el motor ya encendido en el aparcamiento, listos para salir. El compromiso: pagas por mantenerlos calientes (incluso sin uso), así que se usa cuando la latencia de la primera petición es crítica.
- Mantener la función «caliente» con invocaciones periódicas
Una técnica sencilla: programar una invocación cada pocos minutos (con CloudWatch, recuerda el subcapítulo 14.2) para que el entorno no se enfríe. Es un truco económico, aunque menos fiable que la provisioned concurrency, sobre todo si hay muchas peticiones simultáneas.
- Reducir el tamaño del paquete
Cuanto menos código y librerías tenga que cargar AWS, más rápido es el arranque. Por eso conviene:
- Incluir solo las librerías que realmente usas (recuerda el subcapítulo 14.3).
- Usar capas para no inflar el paquete.
- Evitar dependencias pesadas innecesarias.
- Elegir un runtime ligero
Si el cold start es crítico y puedes elegir lenguaje, Python o Node.js suelen arrancar más rápido que Java o .NET. (Para Java existen optimizaciones específicas, pero de partida es más pesado.)
- Inicializar bien el código
Lo que pones fuera del handler (conexiones, configuración) se ejecuta una sola vez por entorno y se reutiliza en los warm starts. Aprovecharlo bien evita repetir trabajo costoso en cada invocación:
import boto3
# Esto se ejecuta UNA VEZ al preparar el entorno (se reutiliza en caliente)
cliente = boto3.client("dynamodb")
def handler(event, context):
# Esto se ejecuta en CADA invocación
return cliente.get_item(...)Tabla resumen
| Estrategia | Qué hace | Compromiso |
|---|---|---|
| Provisioned Concurrency | Mantiene entornos siempre calientes | Pagas por mantenerlos, aun sin uso |
| Invocaciones periódicas | «Despierta» la función cada X minutos | Truco barato, menos fiable |
| Reducir el paquete | Menos código/librerías que cargar | Requiere disciplina con dependencias |
| Runtime ligero | Python/Node arrancan más rápido | Depende de tu elección de lenguaje |
| Inicializar fuera del handler | Reutiliza conexiones entre invocaciones | Buena práctica, sin coste |
¿Debo obsesionarme con esto?
No al principio. Para la mayoría de aplicaciones, los cold starts ocasionales son perfectamente asumibles, y runtimes como Python o Node los hacen muy llevaderos. Preocúpate de ellos solo si tienes una aplicación interactiva sensible a la latencia y mides que los cold starts molestan a los usuarios. Entonces aplica la provisioned concurrency y las demás estrategias. Recuerda: optimizar antes de tener un problema medido suele ser tiempo perdido.
Lo que debes recordar
- Un cold start (arranque en frío) es el retraso extra la primera vez que se invoca una Lambda (o tras un rato sin uso), porque AWS prepara el entorno desde cero. En warm starts ese entorno se reutiliza y no hay retraso.
- Importa en aplicaciones interactivas sensibles a la latencia; no importa en tareas de fondo. Runtimes ligeros (Python, Node) arrancan más rápido.
- Estrategias: Provisioned Concurrency (entornos siempre calientes), invocaciones periódicas, reducir el tamaño del paquete, runtime ligero e inicializar conexiones fuera del handler para reutilizarlas.
- No te obsesiones de entrada: optimiza los cold starts solo si mides que afectan de verdad a tus usuarios.
En el último subcapítulo del capítulo veremos los límites de Lambda y los antipatrones: cuándo Lambda no es la herramienta adecuada.
Cloud, AWS & Terraform — De cero a experto
Capítulo 1 · Qué es el cloud computing
- 1.1 El modelo cliente-servidor tradicional
- 1.2 Problemas que venía a resolver la nube
- 1.3 On-premise vs cloud vs híbrido
- 1.4 Los tres modelos de servicio: IaaS, PaaS, SaaS
- 1.5 Los cinco pilares del cloud (según NIST)
- 1.6 Ventajas reales: elasticidad, pago por uso, disponibilidad global
Capítulo 2 · El mercado cloud y los grandes proveedores
- 2.1 AWS, Azure y GCP: diferencias y cuotas de mercado
- 2.2 Por qué aprender AWS primero
- 2.3 Conceptos que son universales entre proveedores
Capítulo 3 · Regiones, zonas de disponibilidad y edge
- 3.1 Qué es una región AWS y cómo elegirla
- 3.2 Availability Zones: alta disponibilidad desde el diseño
- 3.3 Edge locations y CloudFront
- 3.4 Latencia, resiliencia y soberanía de datos
Capítulo 4 · Cómputo: EC2
- 4.1 Instancias: tipos, familias y cuándo elegir cada una
- 4.2 AMIs, key pairs y Security Groups
- 4.3 Ciclo de vida de una instancia
- 4.4 Elastic IPs y Placement Groups
- 4.5 Savings Plans vs Reserved vs On-Demand vs Spot
Capítulo 5 · Almacenamiento: S3
- 5.1 Buckets, objetos y claves
- 5.2 Clases de almacenamiento (Standard, IA, Glacier…)
- 5.3 Versionado y ciclo de vida de objetos
- 5.4 Políticas de bucket y ACLs
- 5.5 Hosting de sitios web estáticos
Capítulo 6 · Redes: VPC
- 6.1 Qué es una VPC y por qué la necesitas
- 6.2 Subredes públicas y privadas
- 6.3 Internet Gateway y NAT Gateway
- 6.4 Route Tables y Network ACLs
- 6.5 VPC Peering y endpoints
Capítulo 7 · Identidad y acceso: IAM
- 7.1 Usuarios, grupos, roles y políticas
- 7.2 El principio de mínimo privilegio
- 7.3 Políticas basadas en identidad vs en recurso
- 7.4 MFA y credenciales temporales (STS)
- 7.5 Buenas prácticas de seguridad IAM
Capítulo 8 · Bases de datos gestionadas
- 8.1 RDS: motores, Multi-AZ y réplicas de lectura
- 8.2 Aurora y sus ventajas sobre RDS vanilla
- 8.3 DynamoDB: modelo clave-valor / documentos
- 8.4 ElastiCache para caché en memoria
- 8.5 Cuándo usar cada tipo de base de datos
Capítulo 9 · Por qué Infraestructura como Código
- 9.1 Problemas del aprovisionamiento manual
- 9.2 IaC declarativo vs imperativo
- 9.3 Terraform vs CloudFormation vs Pulumi vs CDK
- 9.4 El ciclo plan → apply → destroy
Capítulo 10 · HCL: el lenguaje de Terraform
- 10.1 Bloques resource, variable, output, locals
- 10.2 Tipos de datos: string, number, bool, list, map, object
- 10.3 Expresiones, referencias y funciones built-in
- 10.4 Condicionales y bucles (count, for_each, for)
Capítulo 11 · Providers y estado
- 11.1 Cómo funciona el provider de AWS
- 11.2 El fichero terraform.tfstate y su importancia
- 11.3 State local vs state remoto (S3 + DynamoDB)
- 11.4 Comandos esenciales: init, plan, apply, destroy, fmt, validate
Capítulo 12 · Tu primera infraestructura real en Terraform
- 12.1 Crear una VPC con subredes desde cero
- 12.2 Levantar una instancia EC2 pública
- 12.3 Asociar un Security Group y una Elastic IP
- 12.4 Outputs y referencias entre recursos
- 12.5 Flujo de trabajo en equipo: PR review de planes
Capítulo 13 · Balanceo de carga y autoescalado
- 13.1 Application Load Balancer vs Network Load Balancer
- 13.2 Target Groups, listeners y reglas
- 13.3 Auto Scaling Groups: políticas y métricas
- 13.4 Warm pools y lifecycle hooks
Capítulo 14 · Serverless con Lambda
- 14.1 El modelo de ejecución de Lambda
- 14.2 Triggers: API Gateway, S3, DynamoDB Streams, SQS
- 14.3 Gestión de dependencias y capas (Layers)
- 14.4 Cold starts y estrategias para reducirlos
- 14.5 Límites y antipatrones
Capítulo 15 · Mensajería y eventos
- 15.1 SQS: colas estándar vs FIFO, DLQ
- 15.2 SNS: topics, suscripciones, fan-out
- 15.3 EventBridge: event buses y reglas
- 15.4 Patrones: pub/sub, desacoplamiento, saga
Capítulo 16 · Entrega de contenido y DNS
- 16.1 Route 53: tipos de registros y routing policies
- 16.2 CloudFront: distribuciones, cachés y origins
- 16.3 ACM: certificados SSL/TLS gratuitos
- 16.4 WAF integrado con CloudFront
Capítulo 17 · Contenedores en AWS
- 17.1 Docker: repaso exprés de conceptos clave
- 17.2 ECR: registro privado de imágenes
- 17.3 ECS: task definitions, services, Fargate vs EC2
- 17.4 EKS: cuándo Kubernetes y cuándo no
Capítulo 18 · Módulos: reutilización y composición
- 18.1 Anatomía de un módulo Terraform
- 18.2 Variables de entrada, outputs y dependencias
- 18.3 Módulos locales vs módulos del Terraform Registry
- 18.4 Versionado de módulos con Git tags
- 18.5 Diseño de módulos genéricos vs específicos de dominio
Capítulo 19 · Workspaces y gestión de entornos
- 19.1 Workspaces de Terraform: casos de uso y limitaciones
- 19.2 Estrategia de directorios por entorno (dev/stg/prod)
- 19.3 Terragrunt: DRY para configuraciones de entorno
- 19.4 Variables de entorno y archivos .tfvars
Capítulo 20 · Backends remotos y locking
- 20.1 Configurar S3 + DynamoDB como backend
- 20.2 State locking: evitar corrupción en equipo
- 20.3 Migración de estado entre backends
- 20.4 terraform import: traer recursos existentes al estado
Capítulo 21 · Testing de infraestructura
- 21.1 Terraform validate y fmt en CI
- 21.2 Checkov y tfsec: análisis de seguridad estático
- 21.3 Terratest: tests de integración en Go
- 21.4 Contract testing entre módulos
Capítulo 22 · Terraform en CI/CD
- 22.1 Pipeline básico: lint → plan → apply en GitHub Actions
- 22.2 Atlantis: GitOps para Terraform
- 22.3 Terraform Cloud / HCP Terraform
- 22.4 Drift detection y reconciliación automática
Capítulo 23 · Seguridad en profundidad
- 23.1 AWS Organizations y Service Control Policies
- 23.2 AWS Config: compliance continuo
- 23.3 GuardDuty: detección de amenazas
- 23.4 Security Hub: visión centralizada
- 23.5 KMS: gestión de claves y rotación
- 23.6 Secrets Manager vs Parameter Store
Capítulo 24 · Observabilidad: logs, métricas y trazas
- 24.1 CloudWatch Logs, métricas y alarmas
- 24.2 CloudWatch Dashboards y Contributor Insights
- 24.3 X-Ray: trazado distribuido
- 24.4 OpenTelemetry en AWS
- 24.5 Managed Grafana y Managed Prometheus
Capítulo 25 · Optimización de costes
- 25.1 AWS Cost Explorer y presupuestos con alertas
- 25.2 Trusted Advisor y Compute Optimizer
- 25.3 Rightsizing: cómo detectar sobredimensionamiento
- 25.4 Savings Plans vs Reserved Instances: decisión estratégica
- 25.5 FinOps: cultura y procesos para controlar el gasto
Capítulo 26 · Alta disponibilidad y disaster recovery
- 26.1 RTO y RPO: definir los objetivos
- 26.2 Estrategias: backup/restore, pilot light, warm standby, multi-site
- 26.3 Route 53 health checks y failover automático
- 26.4 AWS Backup: política centralizada de copias
Capítulo 27 · Well-Architected Framework de AWS
- 27.1 Los seis pilares: excelencia operacional, seguridad, fiabilidad, eficiencia de rendimiento, optimización de costes, sostenibilidad
- 27.2 Well-Architected Tool: revisiones formales
- 27.3 Cómo aplicar el framework en decisiones de diseño
Capítulo 28 · Arquitecturas serverless a escala
- 28.1 Event-driven architecture con Lambda + EventBridge
- 28.2 Saga pattern para transacciones distribuidas
- 28.3 Step Functions: orquestación de workflows complejos
- 28.4 Lambda@Edge y CloudFront Functions
Capítulo 29 · Plataformas de datos en AWS
- 29.1 Data Lake con S3, Glue y Athena
- 29.2 Kinesis Data Streams y Firehose para streaming
- 29.3 Redshift: data warehousing a escala
- 29.4 Lake Formation: gobierno del dato
Capítulo 30 · Multi-cuenta y landing zones
- 30.1 Por qué separar workloads en cuentas distintas
- 30.2 AWS Control Tower y Account Factory
- 30.3 Gestión centralizada de logs y seguridad
- 30.4 Terraform a escala multi-cuenta con módulos compartidos
Capítulo 31 · Platform Engineering e Internal Developer Platform
- 31.1 Golden paths y abstracciones sobre Terraform
- 31.2 Service Catalog de AWS
- 31.3 Backstage como portal de desarrolladores
- 31.4 Módulos Terraform como producto interno
Capítulo 32 · Certificaciones AWS relevantes
- 32.1 Cloud Practitioner: ¿vale la pena?
- 32.2 Solutions Architect Associate → Professional
- 32.3 DevOps Engineer Professional
- 32.4 Specialty: Security, Database, Networking
- 32.5 HashiCorp Terraform Associate
Capítulo 33 · Proyectos para consolidar lo aprendido
- 33.1 Proyecto 1: blog serverless (S3 + CloudFront + Lambda + DynamoDB)
- 33.2 Proyecto 2: API REST con ECS Fargate + RDS + ALB
- 33.3 Proyecto 3: plataforma de datos con Glue + Athena + Redshift
- 33.4 Proyecto 4: landing zone multi-cuenta con Terraform y Control Tower
