Instancias Spot de AWS: Guía Práctica para Ahorrar hasta 90% en 2026
Ahorra hasta 90% en EC2 con instancias Spot de AWS. Guía práctica con Terraform, Karpenter en EKS y las estrategias de diversificación que evitan interrupciones en producción.
Las instancias Spot de AWS son capacidad EC2 sobrante que Amazon vende con descuentos de hasta el 90% frente al precio bajo demanda, a cambio de poder reclamarla con dos minutos de aviso. Honestamente, en 2026 y con los nuevos algoritmos de asignación price-capacity-optimized (más Karpenter integrado en EKS), es perfectamente viable ejecutar cargas de producción sobre Spot si diseñas la flota con diversificación de tipos, zonas y familias. Esta guía cubre la teoría, los patrones que funcionan y el código exacto para desplegarlos en cuentas multi-equipo.
Spot ofrece descuentos medios del 70–90% frente a On-Demand, pero AWS puede recuperar la capacidad con un aviso de dos minutos.
La estrategia de asignación price-capacity-optimized (por defecto desde 2023) reduce interrupciones un 30–45% frente a lowest-price.
Diversificar sobre al menos 10 tipos de instancia y 3 AZ baja la tasa de interrupción por debajo del 5% mensual en la mayoría de familias.
Karpenter con consolidation.when: Underutilized y capacity-type: [spot, on-demand] es hoy la forma más eficiente de correr EKS sobre Spot.
Fargate Spot cuesta un 70% menos que Fargate estándar y funciona bien para trabajos batch y colas SQS.
Sin tagging por cost-center y sin un dashboard de ahorros vs precio On-Demand equivalente, no puedes demostrar el valor de Spot a Finanzas.
¿Qué son las instancias Spot de AWS?
Las instancias Spot son EC2 idénticas a las On-Demand (mismo hardware, mismo hipervisor, misma AMI) que AWS pone a la venta sobre la capacidad ociosa de cada zona de disponibilidad. La diferencia está en el contrato: pagas el precio Spot vigente en el momento de arranque, mucho más bajo que On-Demand, pero AWS puede reclamar la capacidad si un cliente con reserva o Savings Plan la necesita. Cuando eso ocurre, tu instancia recibe una interruption notice a través de los metadatos y del EventBridge, y dos minutos después AWS la detiene, la hiberna o la termina, según cómo la hayas configurado.
En 2026 el precio Spot dejó de fluctuar cada pocos minutos como lo hacía hasta 2017. Ahora se recalibra cada varias horas usando señales de oferta y demanda a plazo. Esto significa que puedes planificar presupuestos con precios estables y usar describe-spot-price-history para hacer proyecciones fiables a 30 días. La API es la misma que para On-Demand: RunInstances con InstanceMarketOptions, o cualquier ASG / EC2 Fleet.
¿Cuánto se puede ahorrar con instancias Spot?
Los descuentos Spot reales que vengo midiendo en clientes durante 2026 caen en tres tramos, según la familia y la región:
Familias compute optimizadas antiguas (c5, c6i): 78–92% de descuento medio en us-east-1, 70–85% en eu-west-1.
Familias generales modernas (m7i, m7g Graviton): 55–75% de descuento; menos capacidad ociosa porque son las que más se reservan.
GPU (g5, g6, p5): 40–60%, muy volátil. Para IA e inferencia mejor combinar con estrategias FinOps específicas de GPU y evaluar alternativas como Trainium.
Para calcular el ahorro real no basta con mirar el precio: hay que descontar la sobrecarga operativa de gestionar interrupciones y sobreprovisionar capacidad para absorber caídas súbitas. En mi hoja de cálculo de referencia asumo un 12% de overhead por seguridad, y aun así los ahorros netos rondan el 60–75% para cargas bien diversificadas. Si el equipo compara Spot con opciones de compromiso, escribí antes una comparativa Savings Plans vs Reserved Instances que ayuda a decidir qué combinar.
Cómo funcionan las interrupciones y el aviso de 2 minutos
Cuando AWS decide reclamar una instancia Spot, ocurren cuatro cosas en este orden exacto:
Se publica un evento EC2 Spot Instance Interruption Warning en EventBridge dentro de tu cuenta.
El endpoint de metadatos http://169.254.169.254/latest/meta-data/spot/instance-action deja de devolver 404 y empieza a devolver un JSON con la acción (stop, hibernate o terminate) y el timestamp objetivo.
Pasados 120 segundos, AWS ejecuta la acción configurada.
Si el ASG tiene Capacity Rebalancing activo, se lanza una instancia sustituta antes de que la original muera, dando tiempo para drenar conexiones.
Tu trabajo es escuchar el aviso y drenar la instancia con elegancia. En un proyecto reciente perdimos 40 minutos de trabajo batch por no tener este handler funcionando, así que ahora lo meto en todas las AMIs base:
# /usr/local/bin/spot-interruption-handler.sh
# Se lanza al arrancar la instancia via systemd; hace polling cada 5 s.
#!/usr/bin/env bash
set -euo pipefail
TOKEN=$(curl -sX PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
while true; do
STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
-H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/spot/instance-action)
if [ "$STATUS" = "200" ]; then
logger -t spot-handler "Aviso de interrupcion recibido, drenando..."
# 1. Sacar la instancia del ALB target group
aws elbv2 deregister-targets --target-group-arn "$TG_ARN" \
--targets Id=$(ec2-metadata -i | cut -d' ' -f2)
# 2. Vaciar la cola de trabajos en curso (SQS ejemplo)
systemctl stop worker.service
# 3. Confirmar shutdown limpio
sync && logger -t spot-handler "Drenado completo"
exit 0
fi
sleep 5
done
Auto Scaling Group con Spot y On-Demand mezclados
El patrón que uso por defecto en producción es un MixedInstancesPolicy con base de On-Demand para la capacidad crítica y el resto Spot con múltiples tipos. Este Terraform crea un ASG con 4 instancias On-Demand siempre encendidas y hasta 20 Spot por encima, distribuidas sobre seis tipos de instancia y tres zonas:
El punto crítico aquí es spot_allocation_strategy = "price-capacity-optimized". Esta estrategia, lanzada en 2022 y por defecto en la consola desde 2023, pide a EC2 que elija los pools con más capacidad disponible entre los más baratos, en lugar de simplemente el más barato. En mis mediciones reduce interrupciones en un 30–45% con un sobrecoste de menos del 3%.
EC2 Fleet vs Spot Fleet: qué API usar en 2026
Estas dos APIs se confunden constantemente. Spot Fleet es la API original de 2015; EC2 Fleet es la superset moderna que la reemplaza. AWS no ha marcado Spot Fleet como deprecated formalmente, pero desde 2023 las nuevas funcionalidades (Capacity Blocks, Placement Score API, atributos de instancia) solo se añaden a EC2 Fleet.
Característica
Spot Fleet
EC2 Fleet
Soporta On-Demand + Spot en un solo request
Sí
Sí
Attribute-Based Instance Selection
No
Sí
Integración con Capacity Blocks (H100/H200)
No
Sí
Uso en ASG con MixedInstancesPolicy
N/A
N/A (el ASG usa su propia API)
Consola web moderna
Limitada
Completa
Recomendación 2026
Solo mantener flotas antiguas
Elegir siempre para nuevo trabajo
En proyectos nuevos siempre uso EC2 Fleet en modo instant para cargas batch (te devuelve la lista de instancias lanzadas en la misma llamada) o maintain para flotas persistentes. La documentación oficial de EC2 Fleet mantiene una comparación detallada actualizada.
Diversificación: la estrategia que evita el 80% de interrupciones
Una instancia Spot se interrumpe cuando su pool específico (combinación de tipo + tamaño + AZ) se queda sin capacidad. Si toda tu flota corre sobre c6i.large en us-east-1a, un solo evento de escasez la tumba entera. Si en cambio corre sobre 10 tipos distintos en 3 AZs, la probabilidad de que todos los pools fallen a la vez es despreciable.
Mi regla de multi-cuenta para flotas de producción:
Mínimo 10 tipos de instancia en el MixedInstancesPolicy, mezclando familias compatibles (m7i, m6i, m5, y si el software lo aguanta m7a AMD y m7g Graviton).
Mínimo 3 zonas de disponibilidad. Cada tipo debería estar presente en las 3 AZs.
Attribute-Based Instance Selection en lugar de listas fijas: le pides a EC2 "dame cualquier instancia con 4-16 vCPUs, 8-32 GiB, x86_64, no bare metal" y EC2 escoge el pool más profundo del momento.
Spot en contenedores: EKS con Karpenter y Fargate Spot
Sobre Kubernetes, Karpenter reemplazó al Cluster Autoscaler tradicional y en 2026 es la forma canónica de mezclar Spot y On-Demand en EKS. La configuración clave está en el NodePool y el EC2NodeClass:
Karpenter elige Spot por defecto porque tiene spot antes que on-demand en el array de values. Cuando recibe la notificación de interrupción (vía SQS que configuraste con --enable-spot-interruption-handling), inicia el drenado del nodo, marca los pods como no schedulables y lanza reemplazo. Si conoces el ecosistema, encaja perfectamente con el patrón que describí en la guía de optimización de costos en Kubernetes.
Para cargas serverless-container, Fargate Spot vale un 70% menos que Fargate estándar. La única condición: solo funciona con perfiles ECS (no EKS Fargate a día de agosto 2026) y las tareas deben aguantar reinicios. Lo uso mucho para consumidores de SQS y para procesamiento asíncrono de eventos.
Capacity Rebalancing y Spot Placement Score
Estas dos funcionalidades son las que más impacto tienen en fiabilidad, y también las que menos gente configura. Capacity Rebalancing hace que el ASG o EC2 Fleet reciba un aviso anticipado, a veces horas antes, cuando AWS predice que un pool va a interrumpirse. En lugar de esperar al aviso de 2 minutos, tu flota lanza reemplazo con tiempo de sobra para drenar limpio. Se activa con una sola línea en Terraform (capacity_rebalance = true) y no tiene coste extra.
Spot Placement Score es una API que responde una pregunta muy concreta: "si intento lanzar N instancias con estos requisitos, ¿en qué regiones o AZs es más probable que lo consiga sin interrupciones inmediatas?" Devuelve un score de 1 a 10. Lo uso semanalmente para elegir regiones donde desplegar cargas nuevas, sobre todo cuando el equipo pide GPUs:
Si un pool devuelve score <7 lo evito, aunque el precio sea el más bajo. Consultar el reference oficial de Spot Placement Score antes de expandir a una región nueva ahorra sorpresas.
Cargas que no deberían ejecutarse en Spot
Spot no es universal. Después de años metiendo cargas en pools, tengo una lista clara de casos donde no vale la pena:
Bases de datos primarias. RDS, Aurora writer, MongoDB primary, cualquier nodo con estado no replicable en tiempo real. Réplicas de lectura sí pueden ir en Spot.
Trabajos con SLA de latencia extrema. Si un reemplazo de nodo de 60 segundos rompe tu SLA de 99.99%, no es candidato.
Jobs largos sin checkpointing. Entrenamiento ML de 12 horas sin guardar estado intermedio: una interrupción a la hora 11 te cuesta todo. Añade checkpoints o quédate en On-Demand.
Nodos control plane. etcd, controladores Kubernetes, brokers Kafka con estado. Aunque técnicamente se puede, el riesgo operativo no lo compensa.
Cargas críticas sin código de drenado. Si tu aplicación no responde a SIGTERM en menos de 90 segundos, no está lista para Spot.
Cómo trackear ahorros de Spot por cuenta y equipo
Aquí es donde la mayoría de equipos falla. Ahorran el 75% pero no lo pueden demostrar a Finanzas porque no separan Spot de On-Demand en su reporting, ni comparan el gasto Spot contra el precio On-Demand equivalente que habrían pagado. Mi checklist multi-cuenta:
Tag capacity-type obligatorio en cada launch template. Valores: spot, on-demand, reserved. Sin esto no puedes agrupar en Cost Explorer.
Report de "ahorro nocional" en Athena sobre CUR (Cost and Usage Report). La query base multiplica horas Spot × precio On-Demand del mismo tipo para calcular lo que habrías pagado:
SELECT
line_item_usage_account_id AS account,
resource_tags_user_cost_center AS cost_center,
product_instance_type AS instance_type,
SUM(line_item_usage_amount) AS spot_hours,
SUM(line_item_unblended_cost) AS spot_cost,
SUM(line_item_usage_amount * pricing_public_on_demand_cost) AS ondemand_equivalent,
SUM(line_item_usage_amount * pricing_public_on_demand_cost)
- SUM(line_item_unblended_cost) AS savings
FROM cur.cur_daily
WHERE line_item_line_item_type = 'Usage'
AND product_marketoption = 'Spot'
AND year = '2026' AND month = '8'
GROUP BY 1, 2, 3
ORDER BY savings DESC;
Esta query es la base de mis dashboards mensuales. La cruzo con el tag cost-center (que debería existir en toda cuenta, aunque rara vez lo hace), así que suelo empezar por un audit de tagging tal como describí en la guía de etiquetado Cloud con Terraform. Con esos dos elementos puedes generar un informe por equipo, exportarlo a Google Sheets, y presentarlo en la revisión mensual de FinOps con números defendibles.
El detalle final que pocos hacen: normaliza la métrica a "ahorro por hora de cómputo entregada". Un ASG que ahorra 5.000 USD/mes con 2 millones de horas de cómputo es más eficiente que otro que ahorra 5.000 USD con 500.000 horas. Esa relación aparece bonita en una tabla dinámica de Excel y hace mucho más fácil justificar el trabajo de ingeniería que costó llegar allí.
Preguntas frecuentes
¿Se pueden usar instancias Spot en producción?
Sí, siempre que la carga sea tolerante a interrupciones (stateless, replicable o con checkpointing), diversifiques sobre 10+ tipos en 3 AZs y actives Capacity Rebalancing. Servicios como Netflix, Airbnb y Yelp ejecutan cargas críticas sobre Spot desde hace años. Lo que no debe ir en Spot son nodos con estado único (writer de RDS, etcd) y jobs largos sin checkpoints.
¿Cuál es la diferencia entre Spot y Savings Plans?
Savings Plans es un compromiso financiero (1 o 3 años) a cambio de un descuento del 15–72% sobre On-Demand. Spot es capacidad ociosa sin compromiso, con descuento del 70–90% pero interrumpible con 2 minutos de aviso. Ambos combinan: usa Savings Plans para tu baseline estable y Spot para el pico elástico por encima.
¿Qué es un Spot Fleet y cuándo debo usarlo?
Spot Fleet es la API original de AWS para lanzar y mantener una flota de instancias Spot (y opcionalmente On-Demand) según una capacidad objetivo. En 2026 conviene usar EC2 Fleet en su lugar para todo trabajo nuevo. Spot Fleet solo se mantiene por compatibilidad con integraciones existentes y no recibe nuevas funcionalidades desde 2023.
¿Cómo evito perder trabajo cuando AWS interrumpe una instancia Spot?
Implementa un handler que consulte el endpoint de metadatos /latest/meta-data/spot/instance-action cada 5 segundos y ejecute drenado (deregister del target group, vaciado de colas, sync a disco) al recibir el 200. Combínalo con Capacity Rebalancing activado en el ASG para tener sustituto listo antes de que la instancia muera.
¿Fargate Spot vale la pena para cargas serverless?
Sí, especialmente para consumidores de colas SQS, procesamiento asíncrono y jobs batch. Cuesta un 70% menos que Fargate estándar. Su limitación actual es que solo está disponible en ECS (no en EKS Fargate a agosto 2026) y las tareas deben aguantar reinicios ordenados vía SIGTERM.
Cómo reducir hasta un 40% la factura de AWS Lambda en 2026: migración a ARM/Graviton2, ajuste de memoria con Power Tuning, SnapStart, Savings Plans y control de CloudWatch Logs.
Cuándo elegir Savings Plans o Reserved Instances en AWS: descuentos hasta 72 %, cobertura por servicio, cuándo combinar ambos y cómo calcular el ahorro real sin sobrecomprometer capital.
Los costos de transferencia de datos son el tercer gasto más alto en AWS y el más incomprendido. Guía 2026 con siete estrategias para reducir egreso, NAT Gateway, IPv4 e inter-AZ entre 60% y 85% usando Terraform.