🚀 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 Lanzamiento | Tú gestionas | Ideal para | Casos de Uso Comunes |
|---|---|---|---|
| AWS Fargate | Nada - totalmente gestionado | Equipos centrados en aplicaciones | • Microservicios • Aplicaciones web • Backends de API |
| EC2 | Instancias EC2 y capacidad | Control 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:
{
"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
- El Cluster proporciona la infraestructura.
- El Servicio mantiene el conteo de tareas deseado.
- La Definición de Tarea especifica cómo se ejecutan los contenedores.
- 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:
- Abre la consola de Amazon ECS.
- Haz clic en Create Cluster.
- Selecciona AWS Fargate (Serverless).
- Configura los ajustes básicos (deja todo lo demás en valores por defecto): Cluster Name:text
rent-a-room-cluster - Haz clic en Create.
Usando la CLI de AWS:
# 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-cluster2️⃣ Crear una Definición de Tarea
Usando la Consola de AWS:
En la consola de ECS, ve a Task Definitions.
Haz clic en Create new Task Definition.
Configura los ajustes: Family:
textrent-a-room-tasktextLaunch type: FARGATE Operating system/Architecture: Linux/ARM64 (⚠️ Asegúrate de cambiar a Linux/ARM64) Task CPU: 1 vCPU Task memory: 3GBAgrega el contenedor (⚠️ Asegúrate de reemplazar el prefijo de la imagen con tu nombre de usuario de Docker Hub):
textContainer name: rent-a-room Image: TU_USUARIO_DOCKERHUB/rent-a-room:latest Nota: El resto de las opciones permanecerán con los valores predeterminados.Haz clic en Create.
Usando la CLI de AWS:
Guarda esto como task-definition.json:
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"
}]
}]
}
EOFLuego ejecuta:
aws ecs register-task-definition --cli-input-json file://task-definition.json3️⃣ Crear el Servicio de ECS
Usando la Consola de AWS:
En tu cluster, haz clic en Create Service.
Configura el servicio:
textTask Definition family: rent-a-room-taskService name (⚠️ El sistema agregará automáticamente una cadena aleatoria. Elimina todo el texto y pega "rent-a-room-service"):
textrent-a-room-servicetextLaunch type: FARGATE Platform Version: LATEST Service Type: Replica Desired Tasks: 1Networking:
textVPC: Default VPC Subnets: Selecciona todas las disponibles (no es necesario cambiar esto) Security group: Create newSecurity Group Name:
textecs-rent-a-room-sgType: 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!
Haz clic en Create Service.
Usando la CLI de AWS:
# 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:
- En la consola de Amazon ECS, navega a tu tarea.
- Haz clic en la tarea que está en ejecución (Running).
- En la sección Networking, busca la Public IP y haz clic en open address.
- 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:
# 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
| Concepto | Entendimiento |
|---|---|
| Cluster de ECS | La base que alberga tus contenedores - como un centro de datos virtual. |
| Tipos de Lanzamiento | Fargate (serverless) vs EC2 (basado en servidores). |
| Definición de Tarea | El plano que define cómo debe ejecutarse tu contenedor. |
| Servicio de ECS | El 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! ▶️
