Lab 6: Failback

Lab 6: Failback – Restablecimiento 1-Click sin Error Humano

El failover fue automático. El failback (devolver el tráfico al sitio primario) es un proceso deliberado y seguro que elimina el riesgo de errores de tipeo en la terminal y previene restauraciones prematuras.

Una vez reparado el servidor primario, la solución detecta la recuperación y notifica al operador. El operador puede utilizar cualquiera de las 3 opciones “Zero-Command / 1-Click” descritas a continuación.


Cargar variables de entorno

source ~/global.env

Recuperar variables de sesiones anteriores

Si abriste una terminal nueva, recuperá los ARNs necesarios:

# Fuente: CloudFormation (Opción A)
if aws cloudformation describe-stacks --stack-name route53-arc-routing --region $AWS_REGION > /dev/null 2>&1; then
  export PRIMARY_RC_ARN=$(aws cloudformation describe-stacks \
    --stack-name route53-arc-routing --region $AWS_REGION \
    --query 'Stacks[0].Outputs[?OutputKey==`PrimaryRoutingControlArn`].OutputValue' --output text)
  export SECONDARY_RC_ARN=$(aws cloudformation describe-stacks \
    --stack-name route53-arc-routing --region $AWS_REGION \
    --query 'Stacks[0].Outputs[?OutputKey==`SecondaryRoutingControlArn`].OutputValue' --output text)
  export ARC_CLUSTER_ARN=$(aws cloudformation describe-stacks \
    --stack-name route53-arc-routing --region $AWS_REGION \
    --query 'Stacks[0].Outputs[?OutputKey==`ARCClusterArn`].OutputValue' --output text)
# Fuente: Terraform (Opción B)
elif [ -f ~/route53-arc-tf/03_arc/terraform.tfstate ]; then
  export PRIMARY_RC_ARN=$(cd ~/route53-arc-tf/03_arc && terraform output -raw primary_rc_arn 2>/dev/null)
  export SECONDARY_RC_ARN=$(cd ~/route53-arc-tf/03_arc && terraform output -raw secondary_rc_arn 2>/dev/null)
  export ARC_CLUSTER_ARN=$(cd ~/route53-arc-tf/03_arc && terraform output -raw arc_cluster_arn 2>/dev/null)
fi

# Obtener cluster endpoint
read CLUSTER_ENDPOINT ENDPOINT_REGION <<< $(aws route53-recovery-control-config describe-cluster \
  --cluster-arn $ARC_CLUSTER_ARN --region $AWS_REGION \
  --query 'Cluster.ClusterEndpoints' --output json | python3 -c "
import json, sys
eps = json.load(sys.stdin)
target = next((e for e in eps if e.get('Region') == 'us-east-1'), eps[0])
print(target.get('Endpoint'), target.get('Region'))
")

echo "PRIMARY_RC_ARN:   ${PRIMARY_RC_ARN:-❌ no seteado}"
echo "CLUSTER_ENDPOINT: ${CLUSTER_ENDPOINT:-❌ no seteado}"

Paso 1: Reparar el Sitio Primario

Si en el Lab 5 detuviste Nginx vía SSM, reiniciá el servicio:

if [ -f ~/route53-arc-tf/01_primary/terraform.tfstate ]; then
  export EC2_ID=$(cd ~/route53-arc-tf/01_primary && terraform output -raw ec2_instance_id 2>/dev/null)
else
  export EC2_ID=$(aws cloudformation describe-stacks \
    --stack-name route53-arc-primary --region $AWS_REGION \
    --query 'Stacks[0].Outputs[?OutputKey==`EC2InstanceID`].OutputValue' --output text)
fi

aws ssm send-command \
  --instance-ids $EC2_ID \
  --document-name AWS-RunShellScript \
  --parameters 'commands=["systemctl start nginx && systemctl status nginx --no-pager"]' \
  --region $AWS_REGION

echo "✅ Nginx reiniciado. El Health Check volverá a estado OK en ~90 segundos."

Si habías apagado la instancia EC2:

aws ec2 start-instances --instance-ids $EC2_ID --region $AWS_REGION
echo "⏳ La instancia tardará ~2 minutos en arrancar y pasar el Health Check."

Opción A (Recomendada): 1-Click desde el Email de Notificación

Información

⏱️ El email de recuperación puede tardar hasta 10 minutos en llegar. CloudWatch necesita 3 evaluaciones OK consecutivas (una cada 60 segundos) antes de cambiar el estado de la alarma a OK y disparar la notificación SNS. Si reparaste el servidor pero no llega el email, esperá — es normal.

Una vez que el Health Check detecte la recuperación, la Lambda enviará un email con asunto:

[SITIO PRIMARIO RECUPERADO] Listo para Failback 1-Click

El cuerpo del email incluye el enlace directo a la Lambda Failback:

🔗 FAILBACK 1-CLICK:
https://<id>.lambda-url.us-east-1.on.aws/

Abrí ese enlace en tu navegador. Verás la confirmación:

✅ Failback Exitoso
El tráfico ha sido devuelto al Sitio Primario (EC2 + ALB).
Routing Controls: Primario = ON | Secundario = OFF
Información

Si usaste el Método 2 (forzar ALARM) en el Lab 5, el Health Check real puede nunca haber cambiado a OK. En ese caso el email de recuperación no llegará automáticamente — usá la Opción C más abajo para hacer el failback manualmente.


Opción B: 1-Click desde AWS Systems Manager (SSM Automation)

  1. Ingresá a la consola de AWS Systems Manager → Automation.
  2. Buscá el documento route53-arc-failback-ssm.
  3. Hacé clic en Execute automation.
  4. La automatización invocará la Lambda de Failback y restablecerá Primario=ON | Secundario=OFF en segundos.
Consejo

💡 Extensión Enterprise / ChatOps:
En producción se integra con Slack, Microsoft Teams o AWS Chatbot con botones interactivos de aprobación ([Aprobar Failback] / [Rechazar]). El ingeniero de guardia aprueba directamente desde el chat, sin consola ni CLI.


Opción C: AWS CLI manual

# Restablecer Routing Controls: Primario=ON | Secundario=OFF (llamada atómica)
aws route53-recovery-cluster update-routing-control-states \
  --update-routing-control-state-entries \
    "[{\"RoutingControlArn\":\"$PRIMARY_RC_ARN\",\"RoutingControlState\":\"On\"},
      {\"RoutingControlArn\":\"$SECONDARY_RC_ARN\",\"RoutingControlState\":\"Off\"}]" \
  --endpoint-url $CLUSTER_ENDPOINT \
  --region $ENDPOINT_REGION

# Si simulaste el incidente con Método 2 (set-alarm-state), restablecé la alarma también
aws cloudwatch set-alarm-state \
  --alarm-name "route53-arc-primary-unhealthy-with-sns" \
  --state-value OK \
  --state-reason "Sitio primario recuperado - failback completado" \
  --region $AWS_REGION

echo "✅ Failback Manual Completado: Primario=ON | Secundario=OFF"

✅ Verificación del Lab 6

echo "=== Verificación Lab 6: Failback ==="

P=$(aws route53-recovery-cluster get-routing-control-state \
  --routing-control-arn $PRIMARY_RC_ARN \
  --endpoint-url $CLUSTER_ENDPOINT --region $ENDPOINT_REGION \
  --query 'RoutingControlState' --output text 2>/dev/null)

S=$(aws route53-recovery-cluster get-routing-control-state \
  --routing-control-arn $SECONDARY_RC_ARN \
  --endpoint-url $CLUSTER_ENDPOINT --region $ENDPOINT_REGION \
  --query 'RoutingControlState' --output text 2>/dev/null)

[ "$P" = "On"  ] && echo "✅ Routing Control Primario:   $P" || echo "❌ Primario:   $P"
[ "$S" = "Off" ] && echo "✅ Routing Control Secundario: $S" || echo "❌ Secundario: $S"

echo ""
echo "🎉 Ciclo completo exitoso:"
echo "   Caída → Detección → SNS → Failover Automático → Notificación → Reparación → Failback 1-Click"
Información

¿La CloudWatch Alarm sigue en rojo (ALARM) en la consola? Es normal si usaste la Opción A (email) o la Opción B (SSM) para el failback. Esas opciones restablecen los Routing Controls pero no fuerzan el estado de la alarma. La alarma volverá a estado OK automáticamente en los próximos 1-3 minutos cuando el Health Check detecte que el sitio primario responde. Si querés acelerarlo, podés forzarlo manualmente:

aws cloudwatch set-alarm-state \
  --alarm-name "route53-arc-primary-unhealthy-with-sns" \
  --state-value OK \
  --state-reason "Sitio primario recuperado - failback completado" \
  --region $AWS_REGION

Siguiente paso → Lab 7: Limpieza de Recursos