🔧 Capítulo 13 · Nivel Avanzado

DevOps para Data Engineering

Las prácticas de desarrollo de software modernas aplicadas a los datos. Cómo versionar, paquetizar, desplegar y mantener la infraestructura y el código de manera predecible, segura y automática.

⏱️ Lectura: ~60 min
🎯 Nivel: Avanzado
📌 Herramientas: Git, Docker, K8s, Terraform, GitHub Actions

DataOps vs DevOps

El término DataOps (Data Operations) es la aplicación de los principios ágiles y de DevOps a la analítica de datos. Mientras DevOps se enfoca en entregar software, DataOps se enfoca en entregar datos de calidad a alta velocidad.

Git Avanzado y Branching Strategies

En equipos de datos modernos, todo es código: los pipelines de Airflow, los modelos dbt, y la infraestructura. Git es obligatorio.

🌿 GitFlow para Data Teams
  • main: Código en producción (siempre desplegable).
  • develop: Código en integración/staging.
  • feature/*: Nuevos pipelines o modelos (e.g. feature/add-stripe-ingestion).
  • hotfix/*: Parches rápidos en producción.
# Flujo típico de un Data Engineer
git checkout -b feature/new-dbt-model
# (Escribir el código y tests locales)
git add models/staging/stg_stripe__payments.sql
git commit -m "feat: add stripe payments staging model"
git push origin feature/new-dbt-model
# (Crear un Pull Request en GitHub/GitLab)

Docker y Kubernetes para Datos

Empaquetar aplicaciones en contenedores elimina el problema de "en mi máquina sí funciona". En Data Engineering, Docker es vital para Airflow, Spark jobs, y microservicios de ingesta.

Dockerfile Ejemplo para un Job de Python

# Usar una imagen base ligera
FROM python:3.10-slim

# Establecer directorio de trabajo
WORKDIR /app

# Instalar dependencias
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Copiar el código del job
COPY src/ .

# Comando por defecto (sobreescribible)
CMD ["python", "ingest_api_data.py"]

Kubernetes (K8s)

Kubernetes orquesta los contenedores. Para DE, Kubernetes es donde corren nuestros Executors de Airflow (ej. KubernetesPodOperator) o clusters de Spark on K8s.

Infrastructure as Code (IaC) con Terraform

Crear recursos en AWS/GCP a mano usando la consola web es un anti-patrón. Terraform permite definir recursos cloud usando código (HCL).

# Ejemplo: Crear un bucket de S3 para el Data Lake con Terraform
provider "aws" {
  region = "us-east-1"
}

resource "aws_s3_bucket" "data_lake_raw" {
  bucket = "company-datalake-raw-2026"
  
  tags = {
    Environment = "Production"
    Team        = "Data Engineering"
  }
}

# Configurar versionamiento en el bucket
resource "aws_s3_bucket_versioning" "raw_versioning" {
  bucket = aws_s3_bucket.data_lake_raw.id
  versioning_configuration {
    status = "Enabled"
  }
}

CI/CD Pipelines (GitHub Actions)

La Integración Continua y Despliegue Continuo validan el código y lo mueven a producción automáticamente.

Pipeline CI/CD para dbt

name: dbt CI/CD Pipeline

on:
  pull_request:
    branches: [ main ]
  push:
    branches: [ main ]

jobs:
  test_dbt:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.10'
          
      - name: Install dependencies
        run: pip install dbt-snowflake
        
      - name: dbt deps
        run: dbt deps
        
      - name: dbt build (test in staging)
        env:
          SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
          SNOWFLAKE_USER: ${{ secrets.SNOWFLAKE_USER }}
          SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }}
        run: dbt build --target ci

  deploy_production:
    needs: test_dbt
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to Airflow Production
        # Aquí iría un paso para actualizar el repositorio de Airflow o hacer trigger de un DAG
        run: echo "Desplegando modelos aprobados a Producción"
Capítulo 12
Cloud Platforms