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)"
fi

Paso 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."
fi

Recursos 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