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

  1. 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.

  1. 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.

  1. 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.

  1. 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.)

  1. 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

Capítulo 2 · El mercado cloud y los grandes proveedores

Capítulo 3 · Regiones, zonas de disponibilidad y edge

Capítulo 4 · Cómputo: EC2

Capítulo 5 · Almacenamiento: S3

Capítulo 6 · Redes: VPC

Capítulo 7 · Identidad y acceso: IAM

Capítulo 8 · Bases de datos gestionadas

Capítulo 9 · Por qué Infraestructura como Código

Capítulo 10 · HCL: el lenguaje de Terraform

Capítulo 11 · Providers y estado

Capítulo 12 · Tu primera infraestructura real en Terraform

Capítulo 13 · Balanceo de carga y autoescalado

Capítulo 14 · Serverless con Lambda

Capítulo 15 · Mensajería y eventos

Capítulo 16 · Entrega de contenido y DNS

Capítulo 17 · Contenedores en AWS

Capítulo 18 · Módulos: reutilización y composición

Capítulo 19 · Workspaces y gestión de entornos

Capítulo 20 · Backends remotos y locking

Capítulo 21 · Testing de infraestructura

Capítulo 22 · Terraform en CI/CD

Capítulo 23 · Seguridad en profundidad

Capítulo 24 · Observabilidad: logs, métricas y trazas

Capítulo 25 · Optimización de costes

Capítulo 26 · Alta disponibilidad y disaster recovery

Capítulo 27 · Well-Architected Framework de AWS

Capítulo 28 · Arquitecturas serverless a escala

Capítulo 29 · Plataformas de datos en AWS

Capítulo 30 · Multi-cuenta y landing zones

Capítulo 31 · Platform Engineering e Internal Developer Platform

Capítulo 32 · Certificaciones AWS relevantes

Capítulo 33 · Proyectos para consolidar lo aprendido

Capítulo 34 · Recursos y comunidad

© Copyright 2024. Todos los derechos reservados