Tutorial de despliegue de un clúster ECS con Fargate en AWS

·

·

Introducción

Amazon ECS (Elastic Container Service) con Fargate permite ejecutar contenedores sin tener que gestionar la infraestructura subyacente. En este tutorial detallado aprenderás a desplegar un clúster ECS con Fargate, creando desde el repositorio de imágenes en Amazon ECR hasta el servicio con balanceo de carga y políticas de autoescalado.

Prerrequisitos

  • Cuenta de AWS con permisos para IAM, ECS, ECR, VPC, CloudWatch y ELB.
  • AWS CLI instalado y configurado (Guía oficial).
  • Docker instalado en tu equipo local (Descarga Docker).
  • Conocimientos básicos de contenedores Docker.

1. Crear un repositorio en Amazon ECR

Paso 1.1: Autenticar Docker con ECR.

aws ecr get-login-password --region us-east-1 
   docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
  

Paso 1.2: Crear el repositorio.

aws ecr create-repository 
  --repository-name mi-app 
  --region us-east-1
  

2. Construcción y push de la imagen Docker

  1. En tu proyecto local crea un Dockerfile:
    FROM node:14-alpine
    WORKDIR /app
    COPY package.json ./
    RUN npm install
    COPY . .
    CMD [npm,start]
    EXPOSE 3000
          
  2. Construir la imagen:
    docker build -t mi-app:latest .
          
  3. Etiquetar y subir:
    docker tag mi-app:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/mi-app:latest
    docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/mi-app:latest
          

3. Configurar red: VPC, Subnets y Security Groups

Puedes utilizar la VPC por defecto o crear una nueva. Asegúrate de tener al menos dos subnets en diferentes zonas de disponibilidad y un security group que permita HTTP (puerto 80 o 3000).

Recurso Configuración recomendada
VPC ID: vpc-xxxxxx
Subnets subnet-aaa (us-east-1a), subnet-bbb (us-east-1b)
Security Group Allow TCP 80, 443 desde 0.0.0.0/0

4. Crear el clúster ECS

Comando:

aws ecs create-cluster 
  --cluster-name mi-cluster-fargate 
  --region us-east-1
  

5. Definir la Task Definition (Fargate)

Guarda el siguiente JSON como task-def.json:

{
  family: mi-app-task,
  networkMode: awsvpc,
  requiresCompatibilities: [FARGATE],
  cpu: 256,
  memory: 512,
  executionRoleArn: arn:aws:iam::123456789012:role/ecsTaskExecutionRole,
  containerDefinitions: [
    {
      name: mi-app-container,
      image: 123456789012.dkr.ecr.us-east-1.amazonaws.com/mi-app:latest,
      portMappings: [
        { containerPort: 3000, protocol: tcp }
      ],
      essential: true,
      logConfiguration: {
        logDriver: awslogs,
        options: {
          awslogs-group: /ecs/mi-app,
          awslogs-region: us-east-1,
          awslogs-stream-prefix: ecs
        }
      }
    }
  ]
}
  

Registrar la definición:

aws ecs register-task-definition 
  --cli-input-json file://task-def.json
  

6. Crear servicio ECS con Fargate

Comando para crear el servicio:

aws ecs create-service 
  --cluster mi-cluster-fargate 
  --service-name mi-app-service 
  --task-definition mi-app-task 
  --launch-type FARGATE 
  --desired-count 2 
  --network-configuration awsvpcConfiguration={subnets=[subnet-aaa,subnet-bbb],securityGroups=[sg-xxxxxx],assignPublicIp=ENABLED} 
  --load-balancers targetGroupArn=arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/mi-app-tg/abcdef0123456789,containerName=mi-app-container,containerPort=3000 
  --region us-east-1
  

7. Configurar Application Load Balancer

  1. Crear un ALB en la misma VPC con listeners en puerto 80 y/o 443.
  2. Crear un Target Group apuntando al puerto 3000, tipo ip, protocolo HTTP.
  3. Asociar el Target Group al listener del ALB.
  4. Verificar salud de los targets deben pasar el health check.

8. Monitoreo y Autoescalado

Utiliza CloudWatch para métricas de CPU y memoria. Configura políticas de autoescalado para el servicio ECS:

  • Escalar hacia arriba cuando CPUUtilization gt 70% por 5 minutos.
  • Escalar hacia abajo cuando CPUUtilization lt 30% por 5 minutos.

Para definir escalado:

aws application-autoscaling register-scalable-target 
  --service-namespace ecs 
  --resource-id service/mi-cluster-fargate/mi-app-service 
  --scalable-dimension ecs:service:DesiredCount 
  --min-capacity 2 
  --max-capacity 10

aws application-autoscaling put-scaling-policy 
  --service-namespace ecs 
  --scalable-dimension ecs:service:DesiredCount 
  --resource-id service/mi-cluster-fargate/mi-app-service 
  --policy-name cpu-scale-out 
  --policy-type TargetTrackingScaling 
  --target-tracking-scaling-policy-configuration {
    TargetValue: 70.0,
    PredefinedMetricSpecification: {PredefinedMetricType:ECSServiceAverageCPUUtilization},
    ScaleOutCooldown: 60,
    ScaleInCooldown: 60
  }
  

Conclusión

En este artículo has aprendido a desplegar un clúster ECS con Fargate paso a paso: creación de repositorio ECR, construcción de imagen Docker, configuración de red, definición de tarea y servicio, balanceo de carga y autoescalado. Con estos conocimientos podrás mover tus aplicaciones a contenedores gestionados por AWS, reduciendo la carga operativa y mejorando la escalabilidad.



Leave a Reply

Your email address will not be published. Required fields are marked *