Skip to content

🚀 Desplegando en Amazon ECS

📚 Entendiendo los Conceptos de ECS

¿Qué es ECS?

Amazon Elastic Container Service (ECS) es el servicio de orquestación de contenedores de AWS. Piensa en él como un sistema que gestiona dónde y cómo se ejecutan tus contenedores Docker en la nube.

🚀 Tipos de Lanzamiento (Launch Types) de ECS

Tipo de LanzamientoTú gestionasIdeal paraCasos de Uso Comunes
AWS FargateNada - totalmente gestionadoEquipos centrados en aplicaciones• Microservicios • Aplicaciones web • Backends de API
EC2Instancias EC2 y capacidadControl de infraestructura• Apps legadas • Cargas de trabajo de GPU • Optimización de costos

AWS Fargate (Serverless)

  • No hay servidores que gestionar ni mantener.
  • Paga solo por los recursos que utilizan tus contenedores.
  • Escalado automático y alta disponibilidad.
  • Perfecto para equipos que quieren centrarse en el desarrollo de aplicaciones.

Amazon EC2

  • Control total sobre la infraestructura.
  • Tipos de instancias y configuraciones personalizadas.
  • Acceso al sistema operativo de la instancia.
  • Ideal cuando necesitas hardware específico o requisitos de cumplimiento.

Componentes Clave de ECS

1. Cluster de ECS

  • Una agrupación lógica de recursos.
  • Como un edificio de apartamentos que alberga tus contenedores.
  • Puede contener múltiples servicios y tareas.

2. Definición de Tarea (Task Definition)

Piensa en esto como el plano (blueprint) para tu aplicación. Incluye:

  • Qué imagen de contenedor usar.
  • Cuánta CPU y memoria asignar.
  • Mapeos de puertos.
  • Variables de entorno.
  • Configuraciones de almacenamiento.

Ejemplo de componentes de una Task Definition:

json
{
  "family": "web-app",
  "containerDefinitions": [
    {
      "name": "web",
      "image": "nginx:latest",
      "cpu": 256,
      "memory": 512,
      "portMappings": [
        {
          "containerPort": 80
        }
      ]
    }
  ]
}

3. Servicio de ECS (ECS Service)

  • Asegura que el número deseado de tareas esté siempre en ejecución.
  • Gestiona el balanceo de carga y el escalado.
  • Reinicia contenedores fallidos automáticamente.

Piensa en él como el gerente de un restaurante que:

  • Se asegura de que siempre haya suficientes camareros (tareas).
  • Distribuye a los clientes (tráfico) de manera uniforme.
  • Reemplaza al personal enfermo (contenedores fallidos).

🔄 Cómo funciona todo junto

  1. El Cluster proporciona la infraestructura.
  2. El Servicio mantiene el conteo de tareas deseado.
  3. La Definición de Tarea especifica cómo se ejecutan los contenedores.
  4. Los Contenedores ejecutan tu aplicación.

📌 Qué haremos

En esta sección realizaremos lo siguiente:

  • ✅ Crear un Cluster de ECS.
  • ✅ Configurar una Definición de Tarea.
  • ✅ Desplegar un Servicio de ECS.
  • ✅ Acceder a nuestra aplicación.

1️⃣ Crear un Cluster de ECS

Usando la Consola de AWS:

  1. Abre la consola de Amazon ECS.
  2. Haz clic en Create Cluster.
  3. Selecciona AWS Fargate (Serverless).
  4. Configura los ajustes básicos (deja todo lo demás en valores por defecto): Cluster Name:
    text
    rent-a-room-cluster
  5. Haz clic en Create.

Usando la CLI de AWS:

bash
# Verifica si el rol vinculado al servicio ECS ya existe
if ! aws iam get-role --role-name AWSServiceRoleForECS &> /dev/null; then
  echo "Creando el rol vinculado al servicio ECS..."
  aws iam create-service-linked-role --aws-service-name ecs.amazonaws.com
  
  # Esperar a que el rol se propague
  echo "Esperando a que el rol se propague..."
  sleep 20
else
  echo "✅ El rol vinculado al servicio ECS ya existe"
fi

# Crear el cluster de ECS
echo "Creando el cluster de ECS..."
aws ecs create-cluster --cluster-name rent-a-room-cluster

2️⃣ Crear una Definición de Tarea

Usando la Consola de AWS:

  1. En la consola de ECS, ve a Task Definitions.

  2. Haz clic en Create new Task Definition.

  3. Configura los ajustes: Family:

    text
    rent-a-room-task
    text
    Launch type: FARGATE
    Operating system/Architecture: Linux/ARM64 (⚠️ Asegúrate de cambiar a Linux/ARM64)
    Task CPU: 1 vCPU
    Task memory: 3GB
  4. Agrega el contenedor (⚠️ Asegúrate de reemplazar el prefijo de la imagen con tu nombre de usuario de Docker Hub):

    text
    Container name: rent-a-room
    Image: TU_USUARIO_DOCKERHUB/rent-a-room:latest
    Nota: El resto de las opciones permanecerán con los valores predeterminados.
  5. Haz clic en Create.

Usando la CLI de AWS:

Guarda esto como task-definition.json:

bash
cat << EOF > task-definition.json
{
    "family": "rent-a-room-task",
    "networkMode": "awsvpc",
    "requiresCompatibilities": ["FARGATE"],
    "cpu": "256",
    "memory": "512",
    "runtimePlatform": {
        "cpuArchitecture": "ARM64",
        "operatingSystemFamily": "LINUX"
    },
    "containerDefinitions": [{
        "name": "rent-a-room",
        "image": "${DOCKER_USERNAME}/rent-a-room:latest",
        "portMappings": [{
            "containerPort": 80,
            "hostPort": 80,
            "protocol": "tcp"
        }]
    }]
}
EOF

Luego ejecuta:

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

3️⃣ Crear el Servicio de ECS

Usando la Consola de AWS:

  1. En tu cluster, haz clic en Create Service.

  2. Configura el servicio:

    text
    Task Definition family: rent-a-room-task

    Service name (⚠️ El sistema agregará automáticamente una cadena aleatoria. Elimina todo el texto y pega "rent-a-room-service"):

    text
    rent-a-room-service
    text
    Launch type: FARGATE
    Platform Version: LATEST
    Service Type: Replica
    Desired Tasks: 1
  3. Networking:

    text
    VPC: Default VPC
    Subnets: Selecciona todas las disponibles (no es necesario cambiar esto)
    Security group: Create new

    Security Group Name:

    text
    ecs-rent-a-room-sg

    Type: Custom TCP Port Range: 80 Source: Custom Values: Tu dirección IP/32 (Para obtener tu IP personal, navega aquí, deberás agregar /32 al final del valor que veas. Ej: 123.123.123.123/32). ⚠️ Si esta dirección es incorrecta, ¡no podrás acceder al servicio ECS!

  4. Haz clic en Create Service.

Usando la CLI de AWS:

bash
# Obtener el ID de la VPC por defecto
VPC_ID=$(aws ec2 describe-vpcs \
    --filters Name=isDefault,Values=true \
    --query 'Vpcs[0].VpcId' \
    --output text)

# Obtener el ID de la primera subred de la VPC por defecto
SUBNET_ID=$(aws ec2 describe-subnets \
    --filters Name=vpc-id,Values=$VPC_ID \
    --query 'Subnets[0].SubnetId' \
    --output text)

# Crear el grupo de seguridad
SECURITY_GROUP_ID=$(aws ec2 create-security-group \
    --group-name ecs-rent-a-room-sg \
    --description "Grupo de seguridad para el servicio ECS Rent-A-Room" \
    --vpc-id $VPC_ID \
    --query 'GroupId' \
    --output text)

# Agregar regla de entrada para el puerto 80
aws ec2 authorize-security-group-ingress \
    --group-id $SECURITY_GROUP_ID \
    --protocol tcp \
    --port 80 \
    --cidr 0.0.0.0/0

# Crear el servicio de ECS con valores dinámicos
aws ecs create-service \
    --cluster rent-a-room-cluster \
    --service-name rent-a-room-service \
    --task-definition rent-a-room-task \
    --desired-count 1 \
    --launch-type FARGATE \
    --network-configuration "awsvpcConfiguration={subnets=[$SUBNET_ID],securityGroups=[$SECURITY_GROUP_ID],assignPublicIp=ENABLED}"

4️⃣ Acceder a tu Aplicación

Usando la Consola de AWS:

  1. En la consola de Amazon ECS, navega a tu tarea.
  2. Haz clic en la tarea que está en ejecución (Running).
  3. En la sección Networking, busca la Public IP y haz clic en open address.
  4. Accede a tu aplicación: http://[PUBLIC_IP].

⚠️ Asegúrate de conectar vía http y no https. Si aún no puedes conectar, ve al Servicio, bajo Network Configuration, haz clic en el Security Group, luego en Edit inbound rules -> Haz clic en el desplegable de Source y selecciona My IP. Intenta acceder a la IP de la tarea nuevamente.

Usando la CLI de AWS:

bash
# Esperar a que el servicio esté estable
echo "Esperando a que el servicio de ECS esté estable..."
aws ecs wait services-stable \
    --cluster rent-a-room-cluster \
    --services rent-a-room-service

# Obtener el ARN de la tarea
TASK_ARN=$(aws ecs list-tasks \
    --cluster rent-a-room-cluster \
    --service-name rent-a-room-service \
    --query 'taskArns[0]' \
    --output text)

# Obtener la IP pública
ENI_ID=$(aws ecs describe-tasks \
    --cluster rent-a-room-cluster \
    --tasks $TASK_ARN \
    --query 'tasks[0].attachments[0].details[?name==`networkInterfaceId`].value' \
    --output text)

PUBLIC_IP=$(aws ec2 describe-network-interfaces \
    --network-interface-ids $ENI_ID \
    --query 'NetworkInterfaces[0].Association.PublicIp' \
    --output text)

echo "Tu aplicación está disponible en: http://$PUBLIC_IP:80"

🔍 Monitoreo

Monitorea tu aplicación usando:

  • Panel de la consola de ECS.
  • Métricas de CloudWatch.
  • Container Insights (si está habilitado).

💡 Consejos Pro

  • Empieza con Fargate por simplicidad.
  • Usa Task Definitions para despliegues repetibles.
  • Implementa el auto-escalado del servicio para producción.
  • Considera usar un Application Load Balancer para aplicaciones web.

🎯 Puntos Clave

ConceptoEntendimiento
Cluster de ECSLa base que alberga tus contenedores - como un centro de datos virtual.
Tipos de LanzamientoFargate (serverless) vs EC2 (basado en servidores).
Definición de TareaEl plano que define cómo debe ejecutarse tu contenedor.
Servicio de ECSEl gestor que mantiene el estado deseado de tu contenedor.

🚀 Próximos Pasos

Ahora que has:

  • ✅ Creado un cluster de ECS.
  • ✅ Desplegado una aplicación contenedorizada.
  • ✅ Aprendido sobre los componentes de ECS.
  • ✅ Accedido a tu aplicación en ejecución.

✨ ¡Continúa con la configuración del pipeline de CI/CD! ▶️

Released under the GPL-3.0 License.