Lab 4 Desplegando un contenedor con ECS

Clase 19 de 75Curso de AWS Certified Solutions Architect Associate

Resumen

La migración de arquitecturas monolíticas a soluciones más ágiles y resilientes es una necesidad crítica para empresas que no pueden permitirse tiempos de inactividad, especialmente en sectores como la banca. Amazon ECS (Elastic Container Service) ofrece una solución robusta para implementar arquitecturas de microservicios que mejoran la disponibilidad y escalabilidad de las aplicaciones.

¿Por qué migrar de un monolito a microservicios?

Cuando una aplicación crítica como la de tarjetas bancarias sufre caídas, el impacto puede ser devastador tanto para el negocio como para la experiencia del cliente. Los monolitos presentan varios desafíos:

  • Puntos únicos de fallo: cuando algo falla, toda la aplicación se ve afectada.
  • Dificultad para escalar: no se pueden escalar componentes individuales según la demanda.
  • Despliegues complejos: cualquier cambio requiere desplegar toda la aplicación.

La migración hacia arquitecturas basadas en microservicios y soluciones serverless puede ayudar a mitigar estos problemas, permitiendo mayor agilidad y reduciendo los tiempos de inactividad. Amazon ECS emerge como una excelente opción para implementar esta transformación.

¿Cómo configurar Amazon ECS para desplegar microservicios?

Amazon ECS requiere tres componentes principales para funcionar correctamente:

Creación del clúster

El clúster es el entorno donde se ejecutarán nuestras tareas y servicios. Para crearlo:

  1. Asignar un nombre descriptivo (ej. "cluster-test")
  2. Seleccionar la infraestructura:
    • AWS Fargate (serverless, sin administración de servidores)
    • EC2 (configuración manual de instancias)
  3. Activar opciones de monitoreo como CloudWatch Container Insights
// Ejemplo de configuración de clúster (representación conceptual)
{
  "clusterName": "cluster-test",
  "capacityProviders": ["FARGATE"],
  "defaultCapacityProviderStrategy": [
    {
      "capacityProvider": "FARGATE",
      "weight": 1
    }
  ],
  "configuration": {
    "executeCommandConfiguration": {
      "logging": "DEFAULT"
    }
  },
  "settings": [
    {
      "name": "containerInsights",
      "value": "enabled"
    }
  ]
}

Definición de tarea (Task Definition)

La definición de tarea es un documento JSON que especifica cómo se configurarán los contenedores:

  1. Asignar un nombre a la tarea (ej. "test-task")

  2. Seleccionar el tipo de lanzamiento (Fargate)

  3. Configurar recursos:

    • Sistema operativo
    • Arquitectura
    • CPU y memoria asignadas
  4. Configurar roles de IAM:

    • Task Role: permisos para que las aplicaciones dentro del contenedor accedan a otros servicios AWS
    • Task Execution Role: permisos para que el agente de ECS ejecute tareas en nuestro nombre
  5. Configurar el contenedor:

    • Nombre del contenedor
    • URI de la imagen (puede ser de ECR, Docker Hub u otro registro)
    • Mapeo de puertos
    • Configuración de logs (CloudWatch, Splunk, Firehose, etc.)
// Ejemplo simplificado de Task Definition
{
  "family": "test-task",
  "networkMode": "awsvpc",
  "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
  "containerDefinitions": [
    {
      "name": "contenedor-prueba",
      "image": "nginx:latest",
      "essential": true,
      "portMappings": [
        {
          "containerPort": 80,
          "hostPort": 80,
          "protocol": "tcp"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/test-task",
          "awslogs-region": "us-east-1",
          "awslogs-stream-prefix": "ecs"
        }
      }
    }
  ],
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "256",
  "memory": "512"
}

Creación del servicio

El servicio es responsable de mantener un número específico de instancias de la tarea en ejecución:

  1. Seleccionar el clúster donde se ejecutará
  2. Elegir la estrategia de proveedor de capacidad (Fargate)
  3. Seleccionar la definición de tarea y su revisión
  4. Asignar un nombre al servicio (ej. "app-nexia")
  5. Configurar el número de tareas deseadas (réplicas)
  6. Configurar opciones de red:
    • VPC
    • Subredes
    • Grupos de seguridad
  7. Opciones avanzadas (opcionales):
    • Estrategias de despliegue (rolling, blue/green)
    • Balanceo de carga
    • Auto-scaling

¿Cuáles son las ventajas de utilizar ECS con Fargate?

La combinación de ECS con Fargate ofrece numerosos beneficios:

  • Arquitectura serverless: no es necesario administrar servidores subyacentes
  • Alta disponibilidad: el servicio mantiene automáticamente el número deseado de tareas
  • Escalabilidad: se puede aumentar o disminuir el número de tareas según la demanda
  • Aislamiento: cada microservicio puede desplegarse y escalarse de forma independiente
  • Monitoreo integrado: integración nativa con CloudWatch para métricas y logs
  • Seguridad mejorada: roles IAM específicos para cada tarea

Un consejo importante: configura adecuadamente la memoria y CPU para cada tarea en Fargate para optimizar costos. Asignar demasiados recursos puede generar gastos innecesarios, mientras que asignar muy pocos puede afectar el rendimiento.

La migración de arquitecturas monolíticas a microservicios utilizando Amazon ECS representa un paso significativo hacia aplicaciones más resilientes y escalables. Esta transformación no solo mejora la disponibilidad del servicio, sino que también facilita la implementación de prácticas DevOps modernas como integración y despliegue continuos. ¿Has implementado microservicios en tu organización? Comparte tu experiencia en los comentarios.