Lab 7: Limpieza
Lab 7: Limpieza de Recursos
Elimina todos los recursos creados durante el workshop para evitar cargos en tu cuenta AWS.
Aviso
Ejecuta este lab al finalizar el workshop. Los recursos de AWS generan costos mientras existen, incluso si no están en uso activo. El costo total del workshop es mínimo si limpias rápido, pero puede acumularse si lo dejas días.
Orden de eliminación
Los stacks tienen dependencias entre sí (via exports). Deben eliminarse en este orden:
1. route53-arc-automation (SNS + Lambda)
2. route53-arc-routing (ARC + Health Checks + DNS)
3. route53-arc-secondary (S3 + CloudFront)
4. route53-arc-primary (EC2 + ALB + VPC)
5. Bucket Lambda S3 (manual, no es CloudFormation)Paso 1: Variables de entorno
export AWS_REGION="us-east-1"
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
export LAMBDA_BUCKET="route53-arc-lambda-${AWS_ACCOUNT_ID}"Paso 2: Vaciar el bucket S3 de fallback
CloudFormation no puede eliminar buckets S3 con contenido. Debes vaciarlo primero:
# Obtener nombre del bucket de fallback
CF_BUCKET=$(aws cloudformation describe-stacks \
--stack-name route53-arc-secondary --region $AWS_REGION \
--query 'Stacks[0].Outputs[?OutputKey==`FallbackBucketName`].OutputValue' \
--output text 2>/dev/null)
if [ -n "$CF_BUCKET" ] && [ "$CF_BUCKET" != "None" ]; then
echo "Vaciando bucket: $CF_BUCKET"
aws s3 rm s3://$CF_BUCKET --recursive --region $AWS_REGION
echo "✅ Bucket de fallback vaciado"
else
echo "⚠️ No se encontró el bucket de fallback (puede que ya esté eliminado)"
fiPaso 3: Eliminar los stacks CloudFormation
echo "=== Eliminando stacks en orden ==="
# Lista de stacks a eliminar en orden
STACKS=(
"route53-arc-automation"
"route53-arc-routing"
"route53-arc-secondary"
"route53-arc-primary"
)
for STACK in "${STACKS[@]}"; do
echo ""
echo "▶ Eliminando stack: $STACK"
# Verificar si existe
STATUS=$(aws cloudformation describe-stacks \
--stack-name $STACK --region $AWS_REGION \
--query 'Stacks[0].StackStatus' --output text 2>/dev/null)
if [ -z "$STATUS" ] || [ "$STATUS" = "None" ]; then
echo " ⚠️ Stack $STACK no encontrado o ya eliminado"
continue
fi
echo " Estado actual: $STATUS"
# Iniciar eliminación
aws cloudformation delete-stack \
--stack-name $STACK \
--region $AWS_REGION
echo " Eliminación iniciada. Esperando..."
# Esperar hasta que termine
aws cloudformation wait stack-delete-complete \
--stack-name $STACK \
--region $AWS_REGION
echo " ✅ Stack $STACK eliminado"
done
echo ""
echo "✅ Todos los stacks CloudFormation eliminados"Información
La eliminación del stack route53-arc-routing puede tardar 5-8 minutos porque el ARC Cluster tarda en desaprovisionarse. El stack route53-arc-secondary puede tardar por la distribución CloudFront (~5 min).
Paso 4: Eliminar el bucket Lambda
echo "Eliminando bucket Lambda: $LAMBDA_BUCKET"
aws s3 rm s3://$LAMBDA_BUCKET --recursive --region $AWS_REGION 2>/dev/null || true
aws s3 rb s3://$LAMBDA_BUCKET --region $AWS_REGION 2>/dev/null \
&& echo "✅ Bucket Lambda eliminado" \
|| echo "⚠️ Bucket Lambda no encontrado (puede que ya esté eliminado)"✅ Verificación de Limpieza
echo "=== Verificación Final: Limpieza ==="
echo ""
STACKS=("route53-arc-automation" "route53-arc-routing" "route53-arc-secondary" "route53-arc-primary")
ALL_CLEAN=true
for STACK in "${STACKS[@]}"; do
STATUS=$(aws cloudformation describe-stacks \
--stack-name $STACK --region $AWS_REGION \
--query 'Stacks[0].StackStatus' --output text 2>/dev/null)
if [ -z "$STATUS" ] || echo "$STATUS" | grep -q "DELETE_COMPLETE\|does not exist"; then
echo "✅ Stack $STACK: eliminado"
else
echo "❌ Stack $STACK: $STATUS (aún existe)"
ALL_CLEAN=false
fi
done
echo ""
# Verificar que no queden instancias EC2 con tag del workshop
EC2_COUNT=$(aws ec2 describe-instances \
--filters "Name=tag:Workshop,Values=route53-arc" \
"Name=instance-state-name,Values=running,stopped,stopping" \
--region $AWS_REGION \
--query 'length(Reservations[*].Instances[*])' \
--output text 2>/dev/null)
[ "${EC2_COUNT:-0}" = "0" ] \
&& echo "✅ No quedan instancias EC2 del workshop" \
|| echo "⚠️ Quedan $EC2_COUNT instancias EC2. Revisa en la consola."
# Verificar CloudFront distributions
CF_COUNT=$(aws cloudfront list-distributions \
--query 'length(DistributionList.Items[?Comment==`roLearning - Route53 ARC Fallback Site`])' \
--output text 2>/dev/null)
[ "${CF_COUNT:-0}" = "0" ] \
&& echo "✅ No quedan distribuciones CloudFront del workshop" \
|| echo "⚠️ Quedan $CF_COUNT distribuciones CloudFront. Revisa."
if $ALL_CLEAN; then
echo ""
echo "🎉 ¡Limpieza completada! Tu cuenta AWS está libre de recursos del workshop."
else
echo ""
echo "⚠️ Algunos recursos aún existen. Revisa la consola de CloudFormation."
fiRecursos que pueden necesitar eliminación manual
Si algo falla en el script, revisa estos servicios en la consola:
| Servicio | Qué buscar | Cómo eliminar |
|---|---|---|
| EC2 | Instancias con tag Workshop=route53-arc |
Terminate instances |
| ALB | Load Balancers con nombre route53-arc-* |
Delete |
| S3 | Buckets route53-arc-* |
Empty + Delete |
| CloudFront | Distribuciones con comment “roLearning ARC” | Disable + Delete |
| Route53 | Hosted Zone workshop.internal |
Delete records + Delete zone |
| ARC | Cluster route53-arc-workshop-cluster |
Via consola ARC |
| CloudWatch | Alarma route53-arc-primary-* |
Delete alarm |
| Lambda | route53-arc-failover-handler |
Delete function |
| IAM Roles | route53-arc-* |
Detach policies + Delete |
🎓 ¡Workshop Completado!
Felicitaciones por completar el workshop AWS Route 53 ARC – Detección y Failover Automático.
Lo que aprendiste
- ✅ Desplegar un sitio web con EC2 + ALB usando CloudFormation
- ✅ Crear una página de fallback serverless con S3 + CloudFront
- ✅ Configurar Route 53 Health Checks para detección automática
- ✅ Implementar ARC Routing Controls para failover controlado
- ✅ Recibir notificaciones instantáneas con SNS (email + SMS)
- ✅ Automatizar el failover con Lambda
- ✅ Ejecutar failback de forma segura y deliberada
Próximos pasos
- Adapta esta arquitectura a tu propio dominio con un registro Route 53 real
- Agrega múltiples regiones AWS para una solución multi-región
- Integra con PagerDuty u OpsGenie para gestión de incidentes
- Explora los otros workshops de roLearning en rofriday.com
roLearning – ReadOnly Friday Learning Days