Subes la imagen, creas el servicio y las primeras tareas nunca llegan a RUNNING. Se detienen con un ResourceInitializationError: unable to pull secrets or registry auth. La imagen está bien. Las tareas están en subredes privadas sin ruta a Amazon ECR ni a Secrets Manager, así que Fargate no puede iniciarlas.
Muchos problemas de ECS en Fargate se parecen a este: los contenedores funcionan, pero la red, los roles o los ajustes del balanceador de carga que los rodean no. Este artículo recorre un servicio web de producción en Amazon ECS con AWS Fargate, desde la red y el balanceo de carga hasta IAM, el escalado, los despliegues y ECS vs EKS, con un diagrama que puedes copiar.
Los conceptos de ECS en una tabla
| Concepto | Qué es | En el ejemplo |
|---|---|---|
| Clúster | Un grupo lógico de servicios y tareas | prod |
| Definición de tarea | Plantilla versionada: imagen, CPU, memoria, puertos, roles, secretos, logging | orders-api:42 |
| Tarea | Una copia en ejecución de una definición de tarea; en Fargate tiene su propio kernel, memoria e interfaz de red | De 2 a 10 copias |
| Servicio | Mantiene el número de tareas deseado, registra las tareas en el balanceador de carga, ejecuta los despliegues | orders-api |
| Capacity provider | Dónde se ejecutan las tareas: FARGATE, FARGATE_SPOT, grupos de EC2 Auto Scaling o ECS Managed Instances |
FARGATE y FARGATE_SPOT |
El clúster no es un límite de red: las tareas se ejecutan en las subredes que indiques, detrás de sus propios grupos de seguridad. ECS no cobra nada por la orquestación; Fargate factura por segundo la vCPU, la memoria y el almacenamiento de cada tarea, con un mínimo de un minuto.
Red: una ENI por tarea
Las tareas de Fargate siempre usan el modo de red awsvpc: cada tarea recibe su propia interfaz de red elástica (ENI), una IP privada de su subred y sus propios grupos de seguridad (red de las tareas de Fargate). Tres consecuencias:
- Las subredes necesitan espacio. Cada tarea ocupa una IP y AWS reserva cinco por subred. Sesenta tareas en dos AZ son 30 por subred, y un despliegue progresivo al 200 % necesita 60 por un momento. Una /24 (251 utilizables) basta; una /27 (27 utilizables) no.
- Los grupos de seguridad funcionan por tarea. Abre el puerto del contenedor solo al grupo del balanceador de carga, y el puerto 5432 de la base de datos solo al grupo de las tareas.
- Las tareas necesitan un camino a las API de AWS. Antes de que se ejecute tu código, Fargate descarga la imagen, obtiene los secretos y empieza a enviar logs por la ENI de la tarea.
Desde una subred privada, ese camino es una NAT gateway o endpoints de VPC (precios de US East en el momento de escribir, noviembre de 2026):
| Camino | Qué creas | Coste | Compromiso |
|---|---|---|---|
| NAT gateway | Una por AZ, o una NAT gateway regional | 0,045 USD por hora y AZ más 0,045 USD por GB | También llega a API de terceros |
| Endpoints de VPC | Endpoints de interfaz ecr.api, ecr.dkr, logs, secretsmanager, más el endpoint de gateway de S3 |
0,01 USD por endpoint, hora y AZ más 0,01 USD por GB; el gateway de S3 es gratis | Ningún camino a internet |
No te saltes el endpoint de gateway de S3: ECR guarda las capas de las imágenes en S3 (endpoints de interfaz de ECR). Cuatro endpoints de interfaz en dos AZ cuestan unos 58 USD al mes antes de los datos (8 × 0,01 USD × 730 horas), casi como dos NAT gateways a 66 USD. Los endpoints ganan en cargos por datos y privacidad, y NAT en alcance. Desde noviembre de 2025, una NAT gateway regional abarca las AZ por sí sola y no necesita subred pública. Poner IP públicas a las tareas también funciona, pero deja a cada tarea a una regla de grupo de seguridad de internet. El diagrama de VPC de AWS cubre las rutas y la ubicación de NAT.
El balanceador de carga: target groups y health checks
El ALB necesita subredes en al menos dos AZ, cada una /27 o mayor con ocho direcciones libres. Como una tarea awsvpc es una ENI y no una instancia de EC2, el tipo del target group debe ser ip. Usa un target group por servicio; ECS registra y da de baja las tareas.
| Ajuste | Valor por defecto | Considera |
|---|---|---|
| Intervalo del health check | 30 s | 5 s si el servicio arranca en menos de 10 s (sugerencia de AWS) |
| Umbral de no saludable | 2 comprobaciones | Una tarea que falla sale en cerca de un minuto |
| Umbral de saludable | 5 comprobaciones | Los destinos nuevos solo necesitan una comprobación correcta |
| Retraso de baja del registro (deregistration delay) | 300 s | 30 s o menos para peticiones cortas; las tareas antiguas pueden drenar tanto tiempo |
healthCheckGracePeriodSeconds |
0 | Cubre el tiempo de arranque, o las tareas que arrancan despacio se reemplazan en bucle |
Desde noviembre de 2025, ECS Express Mode puede crear esta configuración de ALB, HTTPS y escalado a partir de una imagen de contenedor. El diagrama de balanceador de carga cubre en general los health checks y el draining.
IAM: el rol de ejecución y el rol de tarea
Dos roles, dos trabajos:
- El rol de ejecución de tareas lo usan ECS y el agente de Fargate, no tu código: descarga la imagen, escribe los logs y lee los secretos nombrados en la definición de tarea (rol de ejecución de tareas).
AmazonECSTaskExecutionRolePolicycubre ECR y los logs; añade tú mismosecretsmanager:GetSecretValue, ykms:Decryptpara una clave administrada por el cliente. - El rol de tarea es el que usa tu código a través del SDK de AWS, para S3 o SQS, y el que necesita ECS Exec.
Los secretos llegan como variables de entorno:
"secrets": [{
"name": "DB_PASSWORD",
"valueFrom": "arn:aws:secretsmanager:us-east-1:111122223333:secret:prod/orders/db-AbCdEf:password::"
}]
ECS lee el valor cuando arranca el contenedor. Un secreto rotado no llega a las tareas en ejecución, así que vuelve a desplegar tras la rotación o deja que la aplicación lea el secreto con su rol de tarea. Elegir una sola clave JSON, como arriba, requiere la versión de plataforma 1.4.0, la actual LATEST.
Escalado: target tracking y Fargate Spot
Para Service Auto Scaling, empieza con target tracking sobre ECSServiceAverageCPUUtilization, ECSServiceAverageMemoryUtilization o ALBRequestCountPerTarget. Escala hacia fuera rápido, hacia dentro despacio y pausa la reducción durante los despliegues; con varias políticas, solo reduce cuando todas coinciden. Mantén al menos una tarea por AZ.
Fargate Spot cuesta hasta un 70 % menos. Cuando AWS recupera la capacidad, la tarea recibe un aviso de dos minutos, como evento de EventBridge con el código de parada SpotInterruption y como SIGTERM (capacity providers de Fargate). stopTimeout tiene un máximo de 120 segundos, y Fargate nunca vuelve por sí solo a la capacidad normal, así que mantén una base:
"capacityProviderStrategy": [
{ "capacityProvider": "FARGATE", "base": 2, "weight": 1 },
{ "capacityProvider": "FARGATE_SPOT", "weight": 1 }
]
Las dos primeras tareas siempre se ejecutan en Fargate normal; el resto se reparte uno a uno. Un servicio de una sola tarea en Spot simplemente se detiene hasta que vuelve la capacidad.
Despliegues: progresivo, blue/green, lineal y canary
El progresivo (rolling) es el predeterminado: con minimumHealthyPercent en 100 y maximumPercent en 200, ECS inicia tareas nuevas antes de detener las antiguas. Activa el deployment circuit breaker con rollback; por defecto, hace fallar un despliegue cuando las tareas fallidas alcanzan la mitad del número deseado (al menos 3, como máximo 200). Las alarmas de CloudWatch pueden activar el mismo rollback.
Desde julio de 2025, ECS ejecuta por sí mismo los despliegues blue/green, sin CodeDeploy, y desde octubre de 2025 también los lineales y canary. Inician la nueva revisión detrás de un segundo target group, desplazan el tráfico del listener y conservan las tareas antiguas durante un bake time, de modo que el rollback es un cambio de tráfico.
| Estrategia | Desplazamiento del tráfico | Rollback | Capacidad extra |
|---|---|---|---|
| Rolling | Tareas reemplazadas por lotes | Volver a desplegar | Hasta maximumPercent |
| Blue/green | Todo a la vez, tras tráfico de prueba opcional | Volver a cambiar | 2x |
| Lineal | Pasos iguales, como un 10 % cada pocos minutos | Volver a cambiar | 2x |
| Canary | Una pequeña parte, luego el resto | Volver a cambiar | 2x |
Los hooks de Lambda o de pausa pueden condicionar cada etapa. El target tracking sobre ALBRequestCountPerTarget no es compatible con blue/green. El diagrama de estrategias de despliegue compara los patrones.
Observabilidad
El controlador awslogs necesita awslogs-group, awslogs-region y, en Fargate, awslogs-stream-prefix. Desde el 25 de junio de 2025, usa por defecto el modo non-blocking con un búfer de 10 MB: un fallo de CloudWatch ya no congela tu aplicación, pero un búfer lleno pierde líneas. Añade Container Insights con observabilidad mejorada, ECS Exec para shells y una regla de EventBridge sobre los cambios de estado de las tareas; el motivo de parada (stopped reason) dice por qué murió una tarea. Para las trazas, ejecuta un OpenTelemetry Collector como sidecar en la tarea; es el nivel de agente de un pipeline de logs, métricas y trazas con OpenTelemetry.
ECS vs EKS
| Amazon ECS | Amazon EKS | |
|---|---|---|
| Plano de control | Gratis | 0,10 USD por hora y clúster, unos 73 USD al mes |
| API | Definiciones de tarea y servicios de AWS | Kubernetes, Helm, operadores |
| Cómputo | Fargate, EC2, ECS Managed Instances | Fargate, grupos de nodos de EC2, EKS Auto Mode |
| Actualizaciones | Ninguna para el plano de control | 14 meses de soporte estándar por versión de Kubernetes, luego 0,60 USD por hora y clúster |
| Despliegues integrados | Rolling, blue/green, lineal, canary | Rolling; los demás con herramientas como Argo Rollouts |
Los precios proceden de la página de precios de EKS en el momento de escribir (noviembre de 2026). Elige EKS cuando necesites la portabilidad de Kubernetes o su ecosistema; el diagrama de arquitectura de Kubernetes muestra ese cuadro. Para trabajo corto y basado en eventos, los diseños serverless basados en Lambda no necesitan ningún servicio en ejecución permanente.
El diagrama de ECS en Fargate
Contenido del diagrama
- VPC
- Public subnet · AZ a
- Public subnet · AZ b
- Private subnet · AZ a
- Private subnet · AZ b
- Application Load Balancer
- orders-api task
- RDS for PostgreSQL
- VPC endpoints
- Users
- Amazon ECR
- Secrets Manager
- CloudWatch Logs
- HTTPS 443
- HTTP 8080
- SQL 5432
- image pull
- secrets at start
- awslogs
Cómo leerlo:
- Las AZ son filas. Cada una tiene una subred pública y una privada. El ALB, RDS y los endpoints están entre las filas porque cada uno abarca las dos AZ: un nodo del ALB en cada subred pública, un standby Multi-AZ para la base de datos.
- El azul continuo es la ruta de las peticiones: HTTPS al ALB, HTTP 8080 a una tarea por AZ, SQL en el puerto 5432.
- El morado discontinuo es el tráfico de la plataforma: la descarga de la imagen, los secretos y los logs, enviados por Fargate con el rol de ejecución de tareas a través de los endpoints de VPC.
- Solo las subredes públicas enrutan 0.0.0.0/0 a la internet gateway.
- El bloque Markdown enumera los ajustes del servicio.
Dibujar diagramas de ECS con claridad
- Pon las tareas dentro de subredes por AZ. Una caja «clúster de ECS» alrededor de todo oculta dónde se ejecutan las tareas y a qué pueden llegar.
- Dibuja una tarea por AZ, con el rango de escalado al lado.
- Muestra el camino a ECR, Secrets Manager y CloudWatch Logs. Un camino que falta es una razón habitual de que las tareas no arranquen.
- Etiqueta la arista del ALB con el puerto y el tipo de destino, y nombra el rol detrás de las aristas discontinuas en una leyenda.
- Deja fuera los sidecars, el CI/CD y los registros DNS, salvo que el diagrama trate de ellos.
La plantilla de arquitectura de tres capas de AWS tiene la misma disposición de VPC con EC2.
Constrúyelo en Archboard
- Inicia sesión con Google o GitHub y crea un diagrama.
- Añade una VPC del paquete Red y cuatro nodos Subred dentro, uno público y uno privado por cada AZ.
- Añade un Balanceador de carga en la nube del paquete Nube entre las subredes públicas, y notas de Texto en las subredes públicas para la ruta y el nodo del ALB.
- Añade una Instancia de cómputo del paquete Nube en cada subred privada, con el tamaño de la tarea en el campo del tipo de instancia.
- Entre las subredes privadas, añade una Base de datos administrada con alta disponibilidad activada y un Recurso en la nube para los endpoints de VPC, ambos del paquete Nube.
- Fuera de la VPC, añade Internet del paquete Red, Registro del paquete Docker, Bóveda del paquete Seguridad y Registros del paquete DevOps.
- Dibuja aristas etiquetadas, discontinuas para el tráfico de la plataforma, y añade un bloque Markdown del paquete Básico con los ajustes.
Las herramientas CloudFormation a diagrama y Terraform a diagrama convierten el código de un stack existente en un primer borrador; al dibujar el servicio a partir de Terraform, recorta el borrador y añade a mano la ruta de las peticiones.
El ejemplo usa 15 nodos de diagrama, dentro del plan Free.
Preguntas frecuentes
¿Fargate exige el modo de red awsvpc?
Sí. Cada tarea de Fargate recibe su propia interfaz de red y dirección IP privada, por eso sus target groups deben usar el tipo de destino ip.
¿Cuál es la diferencia entre el rol de tarea de ECS y el rol de ejecución de tareas? El rol de ejecución permite a ECS iniciar la tarea: descargar la imagen, obtener los secretos, enviar los logs. El rol de tarea es el que usa el código de tu aplicación para sus propias llamadas a AWS.
¿Las tareas de Fargate en subredes privadas necesitan una NAT gateway? No para los servicios de AWS. Bastan los endpoints de interfaz de ECR, CloudWatch Logs y Secrets Manager, más el endpoint de gateway de S3. Solo necesitas NAT para llegar a internet.
¿ECS admite despliegues blue/green sin CodeDeploy? Sí. ECS ejecuta blue/green de forma nativa desde julio de 2025, y lineal y canary desde octubre de 2025, con bake times, lifecycle hooks y rollback basado en alarmas.
¿Es ECS más barato que EKS? En el plano de control, sí: ECS no tiene tarifa de orquestación, mientras que un clúster de EKS cuesta 0,10 USD por hora con soporte estándar. Los precios de Fargate y de las instancias de EC2 son los mismos en ambos.