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 plany 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
| Tipo | Descripción | Ejemplo |
|---|---|---|
| Drift de configuración | Las propiedades del recurso difieren de IaC | Reglas de security group modificadas vía consola |
| Drift de estado | Los recursos existen pero no están en archivo de estado | Bucket S3 creado manualmente |
| Recursos huérfanos | Recursos en estado pero eliminados externamente | Instancia EC2 terminada manualmente |
| Recursos sombra | Recursos no gestionados por IaC en absoluto | Bases 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 planse 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 ✅
Ejecuta detección de drift frecuentemente
- Mínimo: diario para producción
- Recomendado: cada 6 horas
- Ideal: continuo con integración CloudTrail
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
Usa estado remoto con bloqueo
- Previene modificaciones concurrentes
- Habilita versionado de estado para rollback
- Restringe acceso a estado solo a CI/CD
Importa recursos existentes
- No dejes recursos sin gestionar
- Usa
terraform importpara infraestructura existente - Documenta todos los recursos importados
No Hacer ❌
No ignores drift “esperado”
- Cambios de auto-escalado deben modelarse en IaC
- Sistemas auto-reparadores necesitan configuración apropiada
- Documenta cualquier drift aceptado
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-onlypara 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
| Herramienta | Mejor Para | Pros | Contras | Precio |
|---|---|---|---|---|
| Terraform Plan | Detección básica de drift | Incorporado, confiable | Solo recursos gestionados | Gratis |
| driftctl | Detección de shadow IT | Encuentra recursos no gestionados | Requiere configuración | Gratis |
| AWS Config | Detección nativa AWS | Tiempo real, integración nativa | Solo AWS | Pago por regla |
| Spacelift | IaC enterprise | Plataforma completa, auto-remediación | Complejo, caro | Pago |
| env0 | Workflows GitOps | Buena detección de drift, visibilidad de costos | Requiere plataforma | Pago |
Criterios de Selección
Elige según:
- Cobertura: Solo Terraform → plan nativo; Shadow IT → driftctl
- Escala: Equipo pequeño → herramientas gratis; Enterprise → Spacelift/env0
- 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ón | Enfoque Básico | Enfoque Avanzado |
|---|---|---|
| Tamaño del equipo | <5 ingenieros | >5 ingenieros |
| Cantidad de recursos | <100 recursos | >100 recursos |
| Implementación | Terraform plan programado | Tiempo real + driftctl |
| Respuesta | Revisión manual | Remediación automatizada |
| Acceso a consola | Permitido con logging | Eliminado completamente |
Midiendo el Éxito
Rastrea estas métricas para la efectividad de detección de drift:
| Métrica | Objetivo | Medición |
|---|---|---|
| Tiempo para detectar drift | <1 hora | Latencia CloudTrail → alerta |
| Tiempo de remediación de drift | <24 horas | Alerta → PR merged |
| Recursos con drift | 0% | Resultados de escaneo de drift |
| Recursos no gestionados | 0 | Escaneo driftctl |
| Cambios de consola | 0/mes | Análisis CloudTrail |
| Incidentes relacionados con drift | 0/trimestre | Post-mortems de incidentes |
Conclusión
Puntos Clave
- La detección de drift es esencial—no puedes gestionar lo que no mides
- Programa escaneos frecuentes—mínimo diario, preferiblemente cada hora
- Detecta shadow IT—usa driftctl para encontrar recursos no gestionados
- Previene en lugar de detectar—elimina acceso a consola donde sea posible
Plan de Acción
- ✅ Hoy: Ejecuta
terraform planen tu infraestructura de producción - ✅ Esta Semana: Configura detección de drift programada en CI/CD
- ✅ 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.
