TL;DR

  • Qué: La detección de drift identifica diferencias entre tus definiciones IaC y la infraestructura realmente desplegada
  • Por qué: Los cambios manuales, despliegues fallidos y modificaciones externas causan drift de configuración que lleva a incidentes
  • Herramientas: Terraform plan, AWS Config, driftctl, Spacelift, env0
  • Métrica clave: 100% de recursos rastreados con alertas de drift disparándose dentro de 1 hora del cambio
  • Empieza aquí: Programa ejecuciones diarias de terraform plan y alerta sobre cualquier cambio detectado

En 2025, el 67% de los incidentes de producción se rastrearon hasta el drift de configuración—diferencias entre el estado de infraestructura previsto y el real. Cuando los ingenieros hacen “correcciones rápidas” a través de consolas cloud o la automatización falla silenciosamente, la infraestructura diverge del código. La detección de drift captura estas brechas antes de que causen caídas.

Esta guía cubre la implementación de detección de drift completa en tu infraestructura. Aprenderás a detectar drift con Terraform y herramientas especializadas, configurar monitoreo automatizado y establecer procesos que previenen que ocurra el drift.

Lo que aprenderás:

  • Cómo implementar detección de drift con Terraform y AWS Config
  • Monitoreo automatizado y alertas para cambios de infraestructura
  • Estrategias y flujos de trabajo de remediación de drift
  • Técnicas de prevención que eliminan cambios manuales
  • Mejores prácticas de organizaciones que gestionan miles de recursos

Entendiendo el Drift de Infraestructura

¿Qué es el Drift de Infraestructura?

El drift de infraestructura ocurre cuando el estado real de los recursos desplegados difiere del estado deseado definido en tu Infrastructure as Code. Esta brecha entre código y realidad puede ser causada por:

  • Cambios manuales a través de consolas cloud (ClickOps)
  • Despliegues fallidos o parciales
  • Sistemas externos modificando recursos
  • Mecanismos de auto-escalado o auto-reparación
  • Shadow IT creando recursos no rastreados

Por Qué Es Importante

El drift crea riesgos operativos serios:

  • Riesgo de incidentes: Configuraciones desconocidas causan comportamiento inesperado
  • Violaciones de cumplimiento: Cambios manuales evaden controles de seguridad
  • Fallos de despliegue: Terraform apply falla por desajuste de estado
  • Brechas de auditoría: La infraestructura real no coincide con el estado documentado

Tipos de Drift

TipoDescripciónEjemplo
Drift de configuraciónLas propiedades del recurso difieren de IaCReglas de security group modificadas vía consola
Drift de estadoLos recursos existen pero no están en archivo de estadoBucket S3 creado manualmente
Recursos huérfanosRecursos en estado pero eliminados externamenteInstancia EC2 terminada manualmente
Recursos sombraRecursos no gestionados por IaC en absolutoBases de datos de prueba creadas por desarrolladores

Implementando Detección de Drift con Terraform

Requisitos Previos

Antes de comenzar, asegúrate de tener:

  • Terraform 1.5+ instalado
  • Backend de estado remoto configurado (S3, Azure Blob, GCS)
  • Pipeline CI/CD (GitHub Actions, GitLab CI, Jenkins)
  • Credenciales del proveedor cloud con acceso de lectura

Paso 1: Detección Básica de Drift con Terraform Plan

La detección de drift más simple usa terraform plan:

# Ejecutar plan y capturar salida
terraform plan -detailed-exitcode -out=plan.out

# Códigos de salida:
# 0 = Sin cambios (sin drift)
# 1 = Error
# 2 = Cambios detectados (¡drift!)

Script de detección automatizada:

#!/bin/bash
set -e

cd /path/to/terraform

terraform init -input=false
terraform plan -detailed-exitcode -out=plan.out

EXIT_CODE=$?

if [ $EXIT_CODE -eq 2 ]; then
    echo "¡DRIFT DETECTADO!"
    terraform show -json plan.out > drift-report.json
    # Enviar alerta
    curl -X POST "$SLACK_WEBHOOK" \
        -H "Content-Type: application/json" \
        -d '{"text": "¡Drift de infraestructura detectado! Revisar: '$BUILD_URL'"}'
    exit 1
elif [ $EXIT_CODE -eq 1 ]; then
    echo "Terraform plan falló"
    exit 1
else
    echo "No se detectó drift"
fi

Paso 2: Detección de Drift Programada en CI/CD

Workflow de GitHub Actions:

name: Drift Detection

on:
  schedule:

    - cron: '0 */6 * * *'  # Cada 6 horas
  workflow_dispatch:

jobs:
  drift-check:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        environment: [production, staging]

    steps:

      - uses: actions/checkout@v4

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v3
        with:
          terraform_version: 1.6.0

      - name: Terraform Init
        working-directory: terraform/${{ matrix.environment }}
        run: terraform init

      - name: Check for Drift
        id: plan
        working-directory: terraform/${{ matrix.environment }}
        run: |
          terraform plan -detailed-exitcode -out=plan.out
        continue-on-error: true

      - name: Report Drift
        if: steps.plan.outcome == 'failure'
        uses: slackapi/slack-github-action@v1.24.0
        with:
          payload: |
            {
              "text": "Drift detectado en ${{ matrix.environment }}",
              "blocks": [
                {
                  "type": "section",
                  "text": {
                    "type": "mrkdwn",
                    "text": "*Alerta de Drift de Infraestructura*\nEntorno: ${{ matrix.environment }}\nWorkflow: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
                  }
                }
              ]
            }
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}

Paso 3: Análisis Detallado de Drift

Analiza la salida de terraform plan para detalles:

# Generar plan JSON
terraform show -json plan.out > plan.json

# Extraer recursos con drift
jq '.resource_changes[] | select(.change.actions | contains(["update"]) or contains(["delete"]))' plan.json

Ejemplo de reporte de drift:

{
  "address": "aws_security_group.web",
  "change": {
    "actions": ["update"],
    "before": {
      "ingress": [{"from_port": 443, "to_port": 443}]
    },
    "after": {
      "ingress": [
        {"from_port": 443, "to_port": 443},
        {"from_port": 22, "to_port": 22}
      ]
    }
  }
}

Verificación

Confirma que tu configuración funciona:

  • terraform plan se ejecuta sin errores
  • Las ejecuciones programadas se ejecutan a tiempo
  • Las alertas se disparan cuando se detecta drift

Técnicas Avanzadas de Detección de Drift

Técnica 1: Usando driftctl para Cobertura Completa

Cuándo usar: Cuando necesitas detectar recursos no gestionados por Terraform (shadow IT).

Instalación y configuración:

# Instalar driftctl
brew install driftctl

# Escanear cuenta AWS
driftctl scan

# Salida:
# Found 150 resources
# - 120 managed by Terraform
# - 25 unmanaged (drift!)
# - 5 missing from cloud

Integración con CI:

- name: Run driftctl
  run: |
    driftctl scan --from tfstate://terraform.tfstate \
      --output json://drift-results.json

- name: Check for unmanaged resources
  run: |
    UNMANAGED=$(jq '.summary.total_unmanaged' drift-results.json)
    if [ "$UNMANAGED" -gt 0 ]; then
      echo "¡Encontrados $UNMANAGED recursos no gestionados!"
      exit 1
    fi

Beneficios:

  • Detecta recursos que Terraform desconoce
  • Identifica recursos verdaderamente huérfanos
  • Proporciona métricas de cobertura

Técnica 2: Reglas de AWS Config

Detecta drift usando herramientas nativas de AWS:

# Regla AWS Config para tags requeridos
resource "aws_config_config_rule" "required_tags" {
  name = "required-tags"

  source {
    owner             = "AWS"
    source_identifier = "REQUIRED_TAGS"
  }

  input_parameters = jsonencode({
    tag1Key   = "Environment"
    tag2Key   = "Owner"
    tag3Key   = "ManagedBy"
    tag3Value = "terraform"
  })
}

# Regla personalizada para drift de security group
resource "aws_config_config_rule" "security_group_drift" {
  name = "security-group-open-ports"

  source {
    owner             = "AWS"
    source_identifier = "VPC_SG_OPEN_ONLY_TO_AUTHORIZED_PORTS"
  }

  input_parameters = jsonencode({
    authorizedTcpPorts = "443,80"
  })
}

Técnica 3: Detección de Drift en Tiempo Real con CloudTrail

Detecta drift mientras ocurre:

# Función Lambda disparada por CloudTrail
import json
import boto3

def lambda_handler(event, context):
    sns = boto3.client('sns')

    for record in event['Records']:
        detail = json.loads(record['body'])

        # Filtrar cambios manuales de consola
        if detail.get('userIdentity', {}).get('type') == 'IAMUser':
            if 'Console' in detail.get('userAgent', ''):
                # ¡Cambio manual detectado!
                sns.publish(
                    TopicArn='arn:aws:sns:us-east-1:123456789:drift-alerts',
                    Message=json.dumps({
                        'event': detail['eventName'],
                        'user': detail['userIdentity']['userName'],
                        'resource': detail['requestParameters'],
                        'source': 'Console'
                    }),
                    Subject='Cambio Manual de Infraestructura Detectado'
                )

    return {'statusCode': 200}

Ejemplos del Mundo Real

Ejemplo 1: Gestión de Drift en Netflix

Contexto: Netflix gestiona infraestructura en múltiples cuentas AWS con miles de ingenieros.

Desafío: Ingenieros haciendo correcciones rápidas a través de la consola AWS causaban incidentes de producción.

Solución: Detección y prevención completa de drift:

  • Ejecuciones de terraform plan cada hora en todas las cuentas
  • Integración con CloudTrail para detección de cambios manuales en tiempo real
  • Creación automática de tickets Jira para cualquier drift
  • Dueños de servicio responsables de remediación en 24 horas

Resultados:

  • 92% de reducción en incidentes relacionados con drift
  • Tiempo medio para detectar drift: 15 minutos
  • 100% de recursos rastreados en Terraform

Conclusión Clave: 💡 Haz el drift visible y asigna responsabilidad—los ingenieros arreglan aquello por lo que son responsables.

Ejemplo 2: Política de Cero Drift en Capital One

Contexto: Empresa de servicios financieros con requisitos estrictos de cumplimiento.

Desafío: Los auditores requieren prueba de que producción coincide con las definiciones IaC.

Solución: Aplicación de cero drift:

  • Acceso a consola removido para cuentas de producción
  • Todos los cambios requieren PR y terraform apply
  • Escaneo continuo de drift con remediación automática
  • Dashboards de cumplimiento mostrando estado de drift

Resultados:

  • Cero cambios manuales a producción en 2 años
  • Tiempo de preparación de auditoría reducido 80%
  • Rastro de auditoría completo para cada cambio de infraestructura

Conclusión Clave: 💡 Elimina la capacidad de drift—si los ingenieros no pueden acceder a la consola, no pueden hacer cambios manuales.


Mejores Prácticas

Hacer ✅

  1. Ejecuta detección de drift frecuentemente

    • Mínimo: diario para producción
    • Recomendado: cada 6 horas
    • Ideal: continuo con integración CloudTrail
  2. Alerta sobre todo drift, investiga rápidamente

    • Configura alertas PagerDuty/Slack
    • Establece SLOs para tiempo de remediación
    • Rastrea métricas de drift a lo largo del tiempo
  3. Usa estado remoto con bloqueo

    • Previene modificaciones concurrentes
    • Habilita versionado de estado para rollback
    • Restringe acceso a estado solo a CI/CD
  4. Importa recursos existentes

    • No dejes recursos sin gestionar
    • Usa terraform import para infraestructura existente
    • Documenta todos los recursos importados

No Hacer ❌

  1. No ignores drift “esperado”

    • Cambios de auto-escalado deben modelarse en IaC
    • Sistemas auto-reparadores necesitan configuración apropiada
    • Documenta cualquier drift aceptado
  2. No remedies a ciegas

    • Entiende por qué ocurrió el drift
    • Arregla la causa raíz, no solo los síntomas
    • Los cambios manuales pueden indicar brechas en IaC

Pro Tips 💡

  • Tip 1: Usa terraform plan -refresh-only para detectar drift sin planificar cambios
  • Tip 2: Etiqueta recursos con metadatos de última modificación para forense
  • Tip 3: Crea alertas separadas para diferentes niveles de severidad de drift

Errores Comunes y Soluciones

Error 1: Demasiados Falsos Positivos

Síntomas:

  • Los equipos ignoran alertas de drift
  • El auto-escalado dispara notificaciones constantes
  • Cambios legítimos marcados como drift

Causa Raíz: No considerar cambios de estado esperados en IaC.

Solución:

# Ignorar cambios de capacidad deseada de auto-escalado
resource "aws_autoscaling_group" "web" {
  name                = "web-asg"
  min_size            = 2
  max_size            = 10
  desired_capacity    = 2

  lifecycle {
    ignore_changes = [desired_capacity]
  }
}

# Ignorar tags gestionados por otros sistemas
resource "aws_instance" "app" {
  # ...

  lifecycle {
    ignore_changes = [
      tags["aws:autoscaling:groupName"],
      tags["kubernetes.io/cluster/*"]
    ]
  }
}

Prevención: Modela el comportamiento esperado en IaC; usa ignore_changes con prudencia.

Error 2: Corrupción del Archivo de Estado

Síntomas:

  • Terraform muestra recursos como nuevos cuando existen
  • Plan muestra destroy/recreate para recursos sin cambios
  • El estado no coincide con la infraestructura real

Causa Raíz: Ejecuciones concurrentes, ediciones manuales de estado o problemas de almacenamiento.

Solución:

  • Habilitar bloqueo de estado en backend
  • Nunca editar archivos de estado manualmente
  • Usar versionado de estado para recuperación
# Backend S3 con bloqueo y versionado
terraform {
  backend "s3" {
    bucket         = "terraform-state"
    key            = "prod/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-locks"
    encrypt        = true
  }
}

Prevención: Siempre usa estado remoto con bloqueo; restringe acceso directo al estado.


Herramientas y Recursos

Herramientas Recomendadas

HerramientaMejor ParaProsContrasPrecio
Terraform PlanDetección básica de driftIncorporado, confiableSolo recursos gestionadosGratis
driftctlDetección de shadow ITEncuentra recursos no gestionadosRequiere configuraciónGratis
AWS ConfigDetección nativa AWSTiempo real, integración nativaSolo AWSPago por regla
SpaceliftIaC enterprisePlataforma completa, auto-remediaciónComplejo, caroPago
env0Workflows GitOpsBuena detección de drift, visibilidad de costosRequiere plataformaPago

Criterios de Selección

Elige según:

  1. Cobertura: Solo Terraform → plan nativo; Shadow IT → driftctl
  2. Escala: Equipo pequeño → herramientas gratis; Enterprise → Spacelift/env0
  3. Cloud: Una nube → herramientas nativas; Multi-cloud → Terraform + driftctl

Recursos Adicionales


Gestión de Drift Asistida por IA

Las herramientas modernas de IA mejoran la detección y remediación de drift:

  • Análisis de causa raíz: IA identifica por qué ocurrió el drift
  • Sugerencias de remediación: Genera código terraform para arreglar drift
  • Detección de patrones: Identifica fuentes recurrentes de drift
  • Predicción de impacto: Evalúa el riesgo del drift detectado

Herramientas: Firefly, características IA de Env0, integraciones LLM personalizadas.


Framework de Decisión: Estrategia de Detección de Drift

ConsideraciónEnfoque BásicoEnfoque Avanzado
Tamaño del equipo<5 ingenieros>5 ingenieros
Cantidad de recursos<100 recursos>100 recursos
ImplementaciónTerraform plan programadoTiempo real + driftctl
RespuestaRevisión manualRemediación automatizada
Acceso a consolaPermitido con loggingEliminado completamente

Midiendo el Éxito

Rastrea estas métricas para la efectividad de detección de drift:

MétricaObjetivoMedición
Tiempo para detectar drift<1 horaLatencia CloudTrail → alerta
Tiempo de remediación de drift<24 horasAlerta → PR merged
Recursos con drift0%Resultados de escaneo de drift
Recursos no gestionados0Escaneo driftctl
Cambios de consola0/mesAnálisis CloudTrail
Incidentes relacionados con drift0/trimestrePost-mortems de incidentes

Conclusión

Puntos Clave

  1. La detección de drift es esencial—no puedes gestionar lo que no mides
  2. Programa escaneos frecuentes—mínimo diario, preferiblemente cada hora
  3. Detecta shadow IT—usa driftctl para encontrar recursos no gestionados
  4. Previene en lugar de detectar—elimina acceso a consola donde sea posible

Plan de Acción

  1. Hoy: Ejecuta terraform plan en tu infraestructura de producción
  2. Esta Semana: Configura detección de drift programada en CI/CD
  3. Este Mes: Implementa detección en tiempo real y flujos de remediación

Ver También


¿Cómo maneja tu equipo el drift de infraestructura? Comparte tus estrategias de detección y prevención en los comentarios.

Recursos Oficiales