Terraform Databricks: Automatiza Pipelines de Datos 2025

Terraform Databricks - Automatiza infraestructura de datos con código

Terraform Databricks es el proveedor oficial que permite automatizar la gestión completa de infraestructura y recursos en Databricks mediante código declarativo. En esta guía aprenderás a crear clusters, notebooks, jobs y Unity Catalog de manera automatizada, integrando pipelines de datos con IA y ML usando infraestructura como código, reduciendo errores manuales y acelerando tus despliegues en entornos multi-cloud.

¿Qué es Databricks y por qué usar Terraform?

Databricks es una plataforma unificada de análisis de datos construida sobre una arquitectura lakehouse que combina lo mejor de data warehouses y data lakes. Fundada por los creadores de Apache Spark, ofrece capacidades para procesamiento de big data, machine learning y análisis en tiempo real sobre AWS, Azure y Google Cloud Platform.

La gestión manual de recursos en Databricks mediante la interfaz web es propensa a errores y difícil de escalar. Aquí es donde Terraform transforma el flujo de trabajo: permite definir toda la infraestructura en archivos de configuración versionados, replicar entornos consistentemente, y mantener un histórico auditable de cambios.

Terraform Databricks Provider: Características Clave

El proveedor oficial de Terraform para Databricks está mantenido por el equipo de Databricks y soporta la gestión de más de 100 recursos diferentes. Las características principales incluyen:

  • Gestión de Workspace: Control completo de usuarios, grupos, permisos y configuraciones de seguridad
  • Compute Resources: Creación y configuración de clusters interactivos y job clusters con políticas de escalado
  • Jobs y Workflows: Definición de pipelines de datos orquestados con dependencias entre tareas
  • Unity Catalog: Automatización de catálogos, schemas, tablas y políticas de acceso granulares
  • MLOps: Registro de modelos, endpoints de serving y monitoreo de ML
  • Networking: Configuración de VPC endpoints, private links y conectividad segura

El proveedor se integra nativamente con herramientas DevOps y sistemas de CI/CD, permitiendo despliegues automatizados en múltiples entornos.

Requisitos Previos para Terraform Databricks

Antes de comenzar a trabajar con el proveedor, necesitas:

  1. Terraform CLI versión 1.0 o superior instalado
  2. Workspace de Databricks activo en AWS, Azure o GCP
  3. Credenciales de autenticación: token de acceso personal o service principal
  4. Permisos adecuados: privilegios de administrador para crear recursos

Configuración Inicial de Terraform Databricks

La configuración del proveedor varía según tu proveedor cloud. Aquí un ejemplo completo para AWS:

terraform {
  required_providers {
    databricks = {
      source  = "databricks/databricks"
      version = "~> 1.40"
    }
  }
}

provider "databricks" {
  host  = "https://your-workspace.cloud.databricks.com"
  token = var.databricks_token
}

# Obtener información del usuario actual
data "databricks_current_user" "me" {}

# Obtener versión más reciente de Spark LTS
data "databricks_spark_version" "lts" {
  long_term_support = true
}

# Seleccionar tipo de nodo óptimo
data "databricks_node_type" "smallest" {
  local_disk = true
}

Para entornos de producción, es recomendable usar backends remotos de Terraform como S3 con bloqueo en DynamoDB para gestionar el estado de forma segura y colaborativa.

Autenticación en el Provider Terraform Databricks

El proveedor soporta múltiples métodos de autenticación. Para Azure, puedes usar Azure Active Directory con service principals:

provider "databricks" {
  host                        = "https://adb-1234567890123456.7.azuredatabricks.net"
  azure_workspace_resource_id = "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Databricks/workspaces/xxx"
  azure_client_id             = var.azure_client_id
  azure_client_secret         = var.azure_client_secret
  azure_tenant_id             = var.azure_tenant_id
}

Para CI/CD moderno, la autenticación OIDC (OpenID Connect) es la opción más segura y está soportada desde la versión 1.21 del proveedor. Esta aproximación elimina la necesidad de almacenar credenciales secretas en tu pipeline, mejorando significativamente la postura de seguridad.

Crear Cluster con Terraform Databricks: Ejemplo Práctico

Los clusters son el núcleo computacional de Databricks. Aquí un ejemplo de cluster optimizado para jobs de datos:

resource "databricks_cluster" "analytics_cluster" {
  cluster_name            = "Analytics Cluster"
  spark_version           = data.databricks_spark_version.lts.id
  node_type_id            = data.databricks_node_type.smallest.id
  autotermination_minutes = 60

  autoscale {
    min_workers = 1
    max_workers = 8
  }

  spark_conf = {
    "spark.databricks.delta.preview.enabled"         = "true"
    "spark.databricks.cluster.profile"               = "serverless"
    "spark.databricks.repl.allowedLanguages"         = "python,sql"
  }

  aws_attributes {
    availability           = "SPOT_WITH_FALLBACK"
    zone_id               = "us-west-2a"
    first_on_demand       = 1
    spot_bid_price_percent = 100
  }

  library {
    pypi {
      package = "pandas==2.0.0"
    }
  }

  library {
    pypi {
      package = "scikit-learn"
    }
  }
}

Este cluster usa instancias spot con fallback a on-demand, reduciendo costos hasta un 70% mientras mantiene disponibilidad. El escalado automático ajusta workers según la carga, optimizando el balance entre rendimiento y precio.

Gestión de Notebooks con Terraform Databricks

Los notebooks se pueden versionar y desplegar automáticamente:

resource "databricks_notebook" "etl_pipeline" {
  path     = "${data.databricks_current_user.me.home}/ETL/daily_ingestion"
  language = "PYTHON"
  source   = "${path.module}/notebooks/daily_ingestion.py"
}

resource "databricks_notebook" "sql_analysis" {
  path     = "${data.databricks_current_user.me.home}/Analysis/sales_report"
  language = "SQL"
  content_base64 = base64encode(<<-EOT
    -- Análisis de ventas diarias
    SELECT
      date_trunc('day', order_date) as day,
      SUM(total_amount) as revenue,
      COUNT(DISTINCT customer_id) as unique_customers
    FROM sales.orders
    WHERE order_date >= current_date - INTERVAL 30 DAYS
    GROUP BY 1
    ORDER BY 1 DESC
  EOT
  )
}

Esta aproximación permite mantener notebooks en repositorios Git, aplicar revisiones de código y automatizar despliegues con pipelines CI/CD documentados por Databricks.

Jobs y Workflows Automatizados con Terraform Databricks

Definir jobs mediante código permite orquestar pipelines complejos con dependencias:

resource "databricks_job" "daily_etl_workflow" {
  name = "Daily ETL Pipeline"

  job_cluster {
    job_cluster_key = "etl_cluster"
    new_cluster {
      num_workers   = 4
      spark_version = data.databricks_spark_version.lts.id
      node_type_id  = data.databricks_node_type.smallest.id
    }
  }

  task {
    task_key = "extract_data"

    job_cluster_key = "etl_cluster"

    notebook_task {
      notebook_path = databricks_notebook.etl_pipeline.path
      base_parameters = {
        environment = "production"
        source_table = "raw.events"
      }
    }
  }

  task {
    task_key = "transform_data"
    depends_on {
      task_key = "extract_data"
    }

    job_cluster_key = "etl_cluster"

    spark_python_task {
      python_file = "dbfs:/scripts/transform.py"
      parameters  = ["--input", "bronze.events", "--output", "silver.events_clean"]
    }
  }

  task {
    task_key = "generate_report"
    depends_on {
      task_key = "transform_data"
    }

    sql_task {
      warehouse_id = databricks_sql_endpoint.analytics.id
      query {
        query_id = databricks_query.daily_summary.id
      }
    }
  }

  schedule {
    quartz_cron_expression = "0 0 2 * * ?"
    timezone_id            = "America/Los_Angeles"
  }

  email_notifications {
    on_failure = ["[email protected]"]
    on_success = ["[email protected]"]
  }

  max_concurrent_runs = 1
  timeout_seconds     = 7200
}

Este workflow implementa un patrón medallion architecture (bronze → silver → gold) ejecutándose diariamente a las 2 AM, con notificaciones automáticas y límites de concurrencia para evitar conflictos.

Unity Catalog con Terraform Databricks

Unity Catalog proporciona gobernanza centralizada de datos. Aquí cómo configurarlo:

resource "databricks_catalog" "analytics" {
  name         = "analytics"
  comment      = "Catálogo de datos para análisis empresarial"
  owner        = "data_engineers"

  properties = {
    environment = "production"
  }
}

resource "databricks_schema" "sales" {
  catalog_name = databricks_catalog.analytics.name
  name         = "sales"
  comment      = "Esquema de datos de ventas"
  owner        = "sales_team"
}

resource "databricks_grant" "sales_read" {
  catalog = databricks_catalog.analytics.name
  schema  = databricks_schema.sales.name
  principal  = "analysts"
  privileges = ["SELECT"]
}

resource "databricks_grant" "sales_write" {
  catalog = databricks_catalog.analytics.name
  schema  = databricks_schema.sales.name
  principal  = "data_engineers"
  privileges = ["SELECT", "MODIFY", "CREATE"]
}

Unity Catalog permite implementar políticas de acceso basadas en roles (RBAC), auditoría completa de acceso a datos, y linaje automático de datos a través de toda tu organización.

SQL Endpoints y Warehouses

Para consultas SQL optimizadas, Databricks SQL Warehouses ofrecen rendimiento serverless:

resource "databricks_sql_endpoint" "analytics" {
  name             = "Analytics Warehouse"
  cluster_size     = "Medium"
  max_num_clusters = 2

  auto_stop_mins = 20

  tags {
    custom_tags {
      key   = "Team"
      value = "Analytics"
    }
  }

  enable_photon        = true
  enable_serverless_compute = true
  warehouse_type       = "PRO"
}

resource "databricks_permissions" "endpoint_usage" {
  sql_endpoint_id = databricks_sql_endpoint.analytics.id

  access_control {
    group_name       = "analysts"
    permission_level = "CAN_USE"
  }

  access_control {
    group_name       = "admins"
    permission_level = "CAN_MANAGE"
  }
}

Photon engine acelera consultas SQL hasta 3x más rápido que Spark SQL tradicional, ideal para dashboards interactivos y reportes ad-hoc.

Gestión de Secretos y Configuración Segura

Para manejar credenciales de forma segura, integra Databricks con gestores de secretos:

resource "databricks_secret_scope" "app_secrets" {
  name = "application-secrets"
}

resource "databricks_secret" "db_password" {
  key          = "postgres_password"
  string_value = var.database_password
  scope        = databricks_secret_scope.app_secrets.name
}

resource "databricks_secret_acl" "read_access" {
  principal  = "data_engineers"
  permission = "READ"
  scope      = databricks_secret_scope.app_secrets.name
}

Los secretos nunca se exponen en notebooks ni logs, accediéndose mediante dbutils.secrets.get() en runtime.

Testing y Validación

Desde Terraform 1.6, el comando terraform test permite validar configuraciones:

# tests/cluster_test.tftest.hcl
run "validate_cluster_creation" {
  command = plan

  assert {
    condition     = databricks_cluster.analytics_cluster.autoscale[0].max_workers <= 10
    error_message = "Cluster no debe superar 10 workers"
  }

  assert {
    condition     = databricks_cluster.analytics_cluster.autotermination_minutes <= 120
    error_message = "Auto-terminación debe ser <= 120 minutos"
  }
}

Esta práctica evita despliegues costosos o inseguros antes de aplicar cambios a producción. Para entornos críticos, considera implementar monitoreo continuo de tus recursos Databricks.

Módulos Reutilizables

Encapsula patrones comunes en módulos Terraform para reutilización:

# modules/databricks-job/main.tf
variable "job_name" {}
variable "notebook_path" {}
variable "schedule_cron" {}

resource "databricks_job" "this" {
  name = var.job_name

  task {
    task_key = "main_task"

    new_cluster {
      num_workers   = 2
      spark_version = data.databricks_spark_version.lts.id
      node_type_id  = data.databricks_node_type.smallest.id
    }

    notebook_task {
      notebook_path = var.notebook_path
    }
  }

  schedule {
    quartz_cron_expression = var.schedule_cron
    timezone_id            = "UTC"
  }
}

# Uso del módulo
module "sales_job" {
  source = "./modules/databricks-job"

  job_name      = "Sales Report"
  notebook_path = databricks_notebook.sales_report.path
  schedule_cron = "0 0 6 * * ?"
}

Los módulos promueven consistencia, reducen código duplicado y facilitan mantenimiento en equipos grandes.

CI/CD con Terraform Databricks

Integra despliegues automatizados con GitHub Actions:

name: Deploy Databricks Infrastructure

on:
  push:
    branches: [main]

jobs:
  terraform:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - uses: hashicorp/setup-terraform@v2
        with:
          terraform_version: 1.7.0

      - name: Terraform Init
        run: terraform init
        env:
          DATABRICKS_HOST: ${{ secrets.DATABRICKS_HOST }}
          DATABRICKS_TOKEN: ${{ secrets.DATABRICKS_TOKEN }}

      - name: Terraform Plan
        run: terraform plan -out=tfplan

      - name: Terraform Apply
        if: github.ref == 'refs/heads/main'
        run: terraform apply -auto-approve tfplan

Este workflow ejecuta terraform plan en cada push, y aplica cambios automáticamente solo en la rama main, implementando un flujo GitOps completo.

Best Practices Terraform Databricks

  • Separación de entornos: Usa workspaces o directorios diferentes para dev/staging/prod
  • Variables parametrizadas: Evita hardcodear valores, usa archivos .tfvars por entorno
  • Remote state: Almacena estado en S3/Azure Storage/GCS con versionado habilitado
  • State locking: Implementa bloqueo con DynamoDB o equivalentes para evitar conflictos
  • Módulos versionados: Publica módulos internos en registros privados con semantic versioning
  • Cost management: Configura autotermination y autoscaling agresivos para jobs no críticos
  • Tagging strategy: Aplica tags consistentes para tracking de costos y compliance

Troubleshooting Común

Error: «Cluster already exists»

Si importas recursos existentes, usa terraform import:

terraform import databricks_cluster.existing <cluster-id>

Error: «Insufficient permissions»

Verifica que tu service principal tiene privilegios de administrador o usa token de administrador workspace.

State lock timeout

Si terraform apply se congela, puede haber un lock huérfano. Forzar desbloqueo con precaución:

terraform force-unlock <lock-id>

Recursos Adicionales

Para profundizar en el proveedor, consulta:

Preguntas Frecuentes sobre Terraform Databricks

¿Terraform Databricks soporta multi-cloud?

Sí, el mismo proveedor funciona con Databricks en AWS, Azure y Google Cloud Platform. Solo cambia la configuración de autenticación específica de cada cloud provider.

¿Cómo migro recursos existentes a Terraform?

Usa terraform import para cada recurso existente, o herramientas como terraformer para importación masiva. Después valida con terraform plan que el estado coincida.

¿Qué pasa si borro un recurso por accidente en Terraform?

Si ejecutas terraform apply después de borrar la definición, el recurso se destruirá en Databricks. Usa terraform state para remover del estado sin destruir, o recupera de backups del state file.

¿Puedo gestionar múltiples workspaces desde un solo código Terraform?

Sí, usa múltiples bloques provider con alias diferentes, cada uno apuntando a un workspace distinto. Útil para gestionar dev/prod o múltiples proyectos.

¿Cómo manejo secretos sensibles en Terraform Databricks?

Nunca comitas secretos en Git. Usa variables de entorno, archivos .tfvars en .gitignore, o integra con HashiCorp Vault, AWS Secrets Manager o Azure Key Vault.

Conclusión

Terraform Databricks transforma radicalmente la forma en que gestionas infraestructura de datos moderna. Al adoptar infraestructura como código, eliminas configuraciones manuales propensas a errores, aceleras despliegues multi-entorno, y estableces una fuente única de verdad versionada para toda tu plataforma de datos.

La combinación de capacidades de gobernanza de Unity Catalog, orquestación de workflows con jobs multi-tarea, y automatización completa mediante el proveedor oficial, posiciona a esta solución como estándar de facto para equipos de datos que buscan escalar operaciones de forma sostenible.

Empieza con configuraciones simples de clusters y notebooks, evoluciona hacia módulos reutilizables, e integra pipelines CI/CD para alcanzar madurez completa en tus prácticas DataOps. La inversión en automatización se recupera rápidamente mediante reducción de tiempos de aprovisionamiento, menor tasa de errores, y capacidad de replicar entornos complejos en minutos.

Avatar

Por Mid

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x