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:
- Terraform CLI versión 1.0 o superior instalado
- Workspace de Databricks activo en AWS, Azure o GCP
- Credenciales de autenticación: token de acceso personal o service principal
- 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:
- Documentación oficial del provider Databricks
- Guía Databricks para Terraform
- Repositorio de ejemplos oficiales
- Tutoriales HashiCorp Terraform
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.
