Amazon ECS: qué es y cómo ejecutar tu primera tarea

Amazon ECS (Elastic Container Service) es el servicio de AWS que orquesta contenedores: toma una definición de tarea y los ejecuta como tareas puntuales o como un servicio que mantiene una cantidad deseada de réplicas. ECS coordina dónde se ejecuta cada tarea; tú eliges la capacidad de cómputo, como AWS Fargate o instancias de Amazon EC2. AWS también ofrece ECS Managed Instances, donde administra las instancias EC2 usadas por las tareas.

La diferencia clave: Docker crea y ejecuta imágenes; Amazon ECR guarda imágenes; ECS las programa y las mantiene en ejecución; Fargate proporciona capacidad de cómputo sin que administres servidores. La guía de Amazon ECS describe estos componentes y opciones.

Cómo se relacionan clústeres, tareas y servicios

ConceptoQué significaCuándo lo usas
Imagen y contenedorLa imagen empaqueta la aplicación y sus dependencias; el contenedor es una instancia en ejecución de esa imagen.Construyes una imagen con Docker o eliges una existente; puedes guardarla en Amazon ECR.
Definición de tareaUn archivo JSON que declara los contenedores, imágenes, CPU y memoria, red, registros y roles de IAM.Defines una vez cómo debe ejecutarse la aplicación. Cada registro crea una revisión numerada.
ClústerUn ámbito lógico de ECS que agrupa tareas y servicios y permite asignarles capacidad de cómputo.Organizas cargas de trabajo; un clúster puede usar Fargate, EC2 o proveedores de capacidad compatibles.
TareaUna ejecución de la definición. Puede terminar al completar un trabajo, como un proceso por lotes.Ejecutas una tarea puntual o la usas como unidad de trabajo de un servicio.
ServicioUn controlador que mantiene el número deseado de tareas y puede reemplazar las que se detienen o se detectan en mal estado.Mantienes activa una aplicación de larga duración. Puedes agregar un balanceador de carga.

Una tarea no equivale a un servicio: al iniciar una tarea puntual, ECS no la vuelve a crear cuando termina. Un servicio sí intenta mantener su recuento deseado. Para que una aplicación tolere fallos de infraestructura o una zona de disponibilidad, hacen falta varias tareas y una configuración distribuida; una sola tarea no garantiza alta disponibilidad.

Amazon ECS en Fargate o en EC2

ECS es el orquestador en ambas opciones. Fargate y EC2 indican dónde corre la tarea:

OpciónQué administrasCuándo puede convenir
ECS con FargateDefines CPU, memoria y red por tarea; AWS administra los servidores subyacentes.Para aprender ECS o ejecutar servicios sin mantener instancias, sistemas operativos y capacidad de clúster.
ECS con EC2Además de ECS, eliges, actualizas y escalas las instancias que aportan capacidad al clúster.Cuando necesitas controlar el tipo de instancia, el sistema operativo o cómo se comparte capacidad entre tareas.

Fargate no aumenta tareas por sí solo. El servicio mantiene el número que configures; para ajustarlo automáticamente debes configurar el escalado de servicios. Con EC2 también debes tener capacidad suficiente en las instancias para ubicar las tareas. ECS Managed Instances es otra opción: AWS aprovisiona, actualiza y escala las instancias EC2, con un cargo de administración adicional. La guía de servicios de ECS explica el recuento deseado, el escalado y el balanceo de carga.

Amazon EKS es el servicio administrado de AWS para Kubernetes. ECS usa el modelo propio de tareas y servicios de AWS; elige EKS cuando necesitas Kubernetes y sus herramientas o APIs. Fargate puede proporcionar capacidad para ECS y EKS.

Qué necesitas antes de ejecutar una tarea

Fargate no exige dos subredes públicas. La red depende de cómo quieras recibir y enviar tráfico. Para una aplicación web de producción, lo habitual es mantener las tareas en subredes privadas y exponer un Application Load Balancer en subredes públicas. Para un ejercicio, también puedes usar una tarea con IP pública y limitar el grupo de seguridad al puerto de la aplicación y a tu IP de origen; no abras SSH (puerto 22) para este ejemplo. AWS detalla la red que requieren las tareas Fargate.

Ejemplo mínimo: un servicio web en Fargate

Antes de ejecutar los comandos, prepara una subred pública con ruta a Internet y un grupo de seguridad que permita TCP 80 solo desde tu dirección de prueba. El servicio mantendrá una tarea Fargate con una IP pública; Fargate factura desde que empieza la descarga de la imagen y la IP pública puede generar cargos adicionales. Este ejemplo crea recursos cuando ejecutas los comandos; no los ejecutes si no quieres aprovisionarlos.

El ejemplo registra una definición basada en la imagen pública de Apache HTTP Server que AWS usa en su tutorial de Fargate. El servicio mantendrá una tarea que escucha en el puerto 80. Primero guarda este JSON como ecs-intro.json:

{
  "family": "ecs-intro",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "256",
  "memory": "512",
  "containerDefinitions": [
    {
      "name": "web",
      "image": "public.ecr.aws/docker/library/httpd:latest",
      "essential": true,
      "portMappings": [
        { "containerPort": 80, "protocol": "tcp" }
      ]
    }
  ]
}

Con el perfil de AWS CLI ya configurado y una subred pública con ruta a Internet, registra el clúster y la definición:

aws ecs create-cluster --cluster-name ecs-intro
aws ecs register-task-definition --cli-input-json file://ecs-intro.json

Luego crea el servicio, reemplazando los identificadores de ejemplo por una subred y un grupo de seguridad de tu VPC:

aws ecs create-service \
  --cluster ecs-intro \
  --service-name web \
  --task-definition ecs-intro \
  --desired-count 1 \
  --launch-type FARGATE \
  --network-configuration "awsvpcConfiguration={subnets=[subnet-REEMPLAZAR],securityGroups=[sg-REEMPLAZAR],assignPublicIp=ENABLED}"

Al indicar solo la familia ecs-intro, ECS usa su revisión activa más reciente. Si necesitas fijar una revisión concreta, utiliza la que devolvió register-task-definition; consulta los parámetros de definición de servicios.

En la consola de ECS, comprueba que el servicio alcance su estado estable y que la tarea esté RUNNING. Revisa los detalles de red de la tarea para encontrar su IP pública y abre esa dirección en el navegador.

El ejemplo sirve para entender el ciclo básico, no para publicar una aplicación real: usa una sola tarea, no crea un balanceador HTTPS y deja la tarea funcionando. Al terminar, reduce el servicio a cero y comprueba que no queden tareas en ejecución ni pendientes:

aws ecs update-service \
  --cluster ecs-intro \
  --service web \
  --desired-count 0

aws ecs describe-services \
  --cluster ecs-intro \
  --services web \
  --query "services[0].{deseadas:desiredCount,activas:runningCount,pendientes:pendingCount}"

aws ecs list-tasks \
  --cluster ecs-intro \
  --service-name web \
  --desired-status STOPPED

Confirma que activas y pendientes sean cero. La última consulta muestra las tareas detenidas recientes del servicio. Luego, elimina el servicio y el clúster si ya no los necesitas; revisa también los recursos de red, balanceadores, logs y registros de imágenes que hayas creado.

Para desplegar tu propia aplicación, construye y prueba su imagen, súbela a Amazon ECR y reemplaza la imagen pública del ejemplo por la ruta del repositorio. Si el contenedor lee o escribe en otro servicio AWS, asocia un rol de tarea con permisos mínimos para esos recursos. El rol de ejecución y el rol de tarea resuelven necesidades distintas, como explica la guía de roles de IAM para ECS.

Comprobaciones de salud y errores frecuentes

Una comprobación de salud del contenedor ejecuta un comando dentro de la imagen. Debes declarar ese comando en la definición de tarea para que ECS lo supervise; no basta con que exista una comprobación en la imagen Docker. Un balanceador puede tener además su propia comprobación HTTP o HTTPS hacia el puerto y la ruta de la aplicación. Si ECS reemplaza tareas repetidamente, compara ambas comprobaciones, el puerto del contenedor y las reglas del grupo de seguridad. Consulta cómo determina ECS la salud de una tarea.

Empieza por los eventos del servicio; luego abre la tarea detenida y revisa su código de salida y mensaje de error. Los motivos como CannotPullContainerError o ResourceInitializationError ayudan a acotar si el problema está en la imagen, los permisos o el acceso de red. La referencia oficial de errores de tareas detenidas reúne los códigos y su diagnóstico.

Cuánto cuesta Amazon ECS

El costo depende de la capacidad y de los demás recursos que utilice tu aplicación. Para Fargate, AWS cobra por CPU y memoria solicitadas desde que empieza la descarga de la imagen hasta que se detiene la tarea; para Linux hay un mínimo de un minuto. En EC2 pagas las instancias, volúmenes y otros recursos que mantengas. La orquestación de ECS no tiene un cargo separado para las modalidades comunes de Fargate y EC2, pero ECS Managed Instances sí añade una tarifa de administración. Un balanceador, NAT Gateway, almacenamiento, logs, IP pública y transferencia de datos también pueden generar cargos. Las tarifas varían según región y configuración: consulta los precios actuales de Amazon ECS antes de desplegar.

Para una tarea que forma parte de un proceso con varios pasos, AWS Step Functions puede iniciar una tarea ECS y esperar a que termine. La integración oficial de Step Functions con ECS muestra ese patrón; como siguiente lectura, consulta AWS Step Functions: qué es y cómo elegir Standard o Express.

Recursos en español y comunidades para seguir aprendiendo

Para familiarizarte con ECS a través de grabaciones de comunidades AWS, puedes empezar por “Containers en AWS: Construyendo el ecosistema de contenedores en ECS”, publicada por AWS User Group Ecuador. Para ver un caso de aplicación, “Amazon ECS con Flask, Fargate y DynamoDB” es una grabación de Rossana Suárez sobre ese despliegue.

Si ya conoces lo básico, el repositorio Demo ECS Fargate con Flask y DynamoDB incluye una aplicación de ejemplo con Terraform y una opción local con Docker Compose. El laboratorio ECS Canary in Action aborda despliegues canary y reversión en ECS; tiene una modalidad local con Docker y otra que aprovisiona en AWS un balanceador, recursos de ECS, ECR, DynamoDB, CloudWatch y roles de IAM. La modalidad local no usa una cuenta AWS; si ejecutas la modalidad en AWS, revisa los cargos y destruye los recursos al finalizar.

También puedes aprender con otras personas y consultar agendas actualizadas. AWS User Group Ecuador organiza meetups y talleres sobre varios temas de AWS; publica sus próximas fechas en Meetup. AWS Women Colombia comparte grabaciones de su comunidad y enlaza sus encuentros próximos. Si estudias en Córdoba, revisa la agenda del AWS Student Builder Group de la UTN. Los temas, fechas, modalidad, cupos y condiciones de inscripción dependen de cada actividad: consulta la ficha vigente antes de planificar.