Lab 7: Limpieza

Lab 7: Limpieza de Recursos (Destroy)

Eliminá todos los recursos creados durante el workshop para evitar cargos innecesarios en tu cuenta AWS.

Aviso

Ejecutá este laboratorio al finalizar el taller. Los recursos en AWS generan costos mientras sigan activos en tu cuenta.


Cargar variables de entorno

source ~/global.env

Opción A: Limpieza con CloudFormation (Base)

Los stacks de CloudFormation tienen dependencias vía exports. Se eliminan en orden inverso al de creación:

1. route53-arc-automation  (SNS + Lambda + SSM)
2. route53-arc-routing     (ARC Cluster + Health Checks + DNS)
3. route53-arc-secondary   (Amplify o S3+CloudFront)
4. route53-arc-primary     (EC2 + ALB + VPC)
5. Buckets S3 temporales   (Lambda code bucket)

Script de Eliminación CloudFormation

echo "=== Eliminando Stacks CloudFormation ==="

# 1. Si usaste Amplify (opción default del Lab 2), el stack no tiene recursos S3 que vaciar.
#    Si usaste CloudFront+S3, vaciamos el bucket primero.
CF_BUCKET="route53-arc-fallback-${AWS_ACCOUNT_ID}"
# Vaciar bucket S3 solo si existe (solo aplica si usaste CloudFront+S3 en Lab 2)
if aws s3 ls s3://$CF_BUCKET --region $AWS_REGION > /dev/null 2>&1; then
  echo "▶ Vaciando bucket $CF_BUCKET..."
  aws s3 rm s3://$CF_BUCKET --recursive --region $AWS_REGION
else
  echo "ℹ️  Bucket $CF_BUCKET no existe (usaste Amplify en Lab 2 — ok)"
fi

# 2. Eliminar stacks en orden
STACKS=(
  "route53-arc-automation"
  "route53-arc-routing"
  "route53-arc-secondary"
  "route53-arc-primary"
)

for STACK in "${STACKS[@]}"; do
  echo "▶ Eliminando stack: $STACK..."
  aws cloudformation delete-stack --stack-name $STACK --region $AWS_REGION 2>/dev/null || true
  aws cloudformation wait stack-delete-complete --stack-name $STACK --region $AWS_REGION 2>/dev/null \
    && echo "  ✅ Stack $STACK eliminado" \
    || echo "  ℹ️  Stack $STACK ya no existe o tardó más de lo esperado"
done

# 3. Eliminar bucket S3 del código Lambda (creado manualmente en el Lab 4)
LAMBDA_BUCKET="route53-arc-lambda-${AWS_ACCOUNT_ID}"
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 || true

echo "✅ Limpieza de CloudFormation completada"
Aviso

⏱️ El stack route53-arc-routing puede tardar 5-10 minutos en eliminarse. AWS desaprovisiona los endpoints globales del ARC Cluster durante ese tiempo. El script espera automáticamente — no lo interrumpas.


Opción B: Limpieza con Terraform (Segunda Opción)

En Terraform ejecutamos terraform destroy en cada módulo en orden inverso:

04_automation → 03_arc → 02_secondary → 01_primary
echo "=== Eliminando Módulos Terraform ==="

# 1. Destroy Lab 4 (Automation)
if [ -d ~/route53-arc-tf/04_automation ]; then
  cd ~/route53-arc-tf/04_automation
  terraform destroy -var="notification_email=$NOTIFICATION_EMAIL" -auto-approve
  echo "✅ Lab 4 destruido"
fi

# 2. Destroy Lab 3 (ARC) — puede tardar 5-10 minutos por el ARC Cluster
if [ -d ~/route53-arc-tf/03_arc ]; then
  echo "⏳ Destruyendo ARC Cluster (5-10 min)..."
  cd ~/route53-arc-tf/03_arc
  terraform destroy -auto-approve
  echo "✅ Lab 3 destruido"
fi

# 3. Destroy Lab 2 (Secondary — Amplify o CloudFront+S3)
if [ -d ~/route53-arc-tf/02_secondary ]; then
  cd ~/route53-arc-tf/02_secondary
  terraform destroy -auto-approve
  echo "✅ Lab 2 destruido"
fi

# 4. Destroy Lab 1 (Primary)
if [ -d ~/route53-arc-tf/01_primary ]; then
  cd ~/route53-arc-tf/01_primary
  terraform destroy -var="vpc_mode=${VPC_MODE}" -var="instance_type=t4g.micro" -auto-approve
  echo "✅ Lab 1 destruido"
fi

echo "✅ Limpieza de Terraform completada"

✅ Verificación de Limpieza Final

echo "=== Verificación Final de Recursos AWS ==="

# EC2
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[])' --output text 2>/dev/null)
[ "${EC2_COUNT:-0}" = "0" ] \
  && echo "✅ Sin instancias EC2 activas" \
  || echo "⚠️  Quedan $EC2_COUNT instancias EC2 — eliminá manualmente desde la consola"

# ALB
ALB_COUNT=$(aws elbv2 describe-load-balancers --region $AWS_REGION \
  --query "length(LoadBalancers[?contains(LoadBalancerName,'route53-arc')])" \
  --output text 2>/dev/null)
[ "${ALB_COUNT:-0}" = "0" ] \
  && echo "✅ Sin Load Balancers activos" \
  || echo "⚠️  Quedan $ALB_COUNT ALBs"

# Lambdas
aws lambda get-function --function-name route53-arc-failover-handler \
  --region $AWS_REGION > /dev/null 2>&1 \
  && echo "⚠️  Lambda Failover aún existe" || echo "✅ Lambda Failover eliminada"

aws lambda get-function --function-name route53-arc-failback-handler \
  --region $AWS_REGION > /dev/null 2>&1 \
  && echo "⚠️  Lambda Failback aún existe" || echo "✅ Lambda Failback eliminada"

# ARC Cluster
ARC_CLUSTERS=$(aws route53-recovery-control-config list-clusters \
  --region $AWS_REGION \
  --query "length(Clusters[?contains(Name,'route53-arc')])" \
  --output text 2>/dev/null)
[ "${ARC_CLUSTERS:-0}" = "0" ] \
  && echo "✅ Sin ARC Clusters activos" \
  || echo "⚠️  Quedan $ARC_CLUSTERS ARC Clusters — puede estar aún eliminándose"

# Amplify
AMPLIFY_COUNT=$(aws amplify list-apps --region $AWS_REGION \
  --query "length(apps[?name=='route53-arc-fallback'])" \
  --output text 2>/dev/null)
[ "${AMPLIFY_COUNT:-0}" = "0" ] \
  && echo "✅ Sin apps Amplify activas" \
  || echo "⚠️  App Amplify 'route53-arc-fallback' aún existe"

echo ""
echo "🎉 ¡Limpieza completa! Gracias por realizar el AWS Route 53 ARC Workshop de roLearning."

Información

Si querés repetir el workshop: esperá al menos 5 minutos después de que todos los recursos estén eliminados antes de volver a deployar. Algunos recursos como el ARC Cluster tienen nombres fijos (route53-arc-workshop-cluster) y AWS puede tardar en liberar el nombre después del delete.

roLearning – ReadOnly Friday Learning Days