Introduzione a Terraform per Lakebase

Questa guida illustra come iniziare a usare Terraform per gestire le risorse di Lakebase usando il provider Terraform di Azure Databricks. Si creerà un progetto, si aggiungerà un ramo di sviluppo e un endpoint e quindi li si eliminerà al termine. Si tratta di un flusso di lavoro tipico per la gestione degli ambienti di sviluppo e test.

Suggerimento

Questa guida illustra un subset di comandi Terraform disponibili. Per informazioni di riferimento complete sulle risorse e tutte le opzioni di configurazione disponibili, vedere la documentazione del provider Azure Databricks nel Registro Terraform.

Prerequisiti

Prima di iniziare, è necessario disporre di quanto segue:

Semantica terraform di scalabilità automatica di Lakebase

Le risorse di scalabilità automatica di Lakebase usano la semantica Terraform con campi spec/status per la gestione dello stato dichiarativo. Il spec campo definisce lo stato desiderato, mentre il status campo mostra lo stato corrente.

Importante

Importante: rilevamento del drift e modifiche all'esterno di Terraform

Le modifiche apportate alle risorse lakebase all'esterno di Terraform (usando l'interfaccia utente, l'interfaccia della riga di comando o l'API) non vengono rilevate dal rilevamento della deriva standard di Terraform.

Per informazioni dettagliate sul funzionamento dei campi spec/status, sul comportamento di rilevamento della deriva e sui requisiti di gestione dello stato, vedere la documentazione sulle risorse databricks_postgres_project .

Gerarchia delle risorse

Le risorse Lakebase seguono una gerarchia padre-figlio: si creano le risorse padre prima delle risorse figlio e si eliminano le risorse figlio prima delle risorse padre. Per il modello di risorse completo (progetti, rami, calcolo, database e altro ancora), vedere Modalità di organizzazione dei progetti.

Ordine delle operazioni per questa guida: Project → Branch → Endpoint

Guida introduttiva: Gestire un progetto Lakebase con Terraform

Seguire questa procedura per creare un progetto di lavoro completo con un ramo di sviluppo e un endpoint di calcolo:

1. Configurare l'autenticazione

Configurare il provider Azure Databricks per l'autenticazione usando l'entità servizio configurata nei prerequisiti. Le risorse di Lakebase richiedono l'autenticazione OAuth, quindi si impostano le variabili di ambiente per le credenziali OAuth dell'entità servizio:

export DATABRICKS_HOST="https://your-workspace.cloud.databricks.com"
export DATABRICKS_CLIENT_ID="your-service-principal-client-id"
export DATABRICKS_CLIENT_SECRET="your-service-principal-secret"

Configurare quindi il provider per usare queste variabili di ambiente:

terraform {
  required_version = ">= 1.0"

  required_providers {
    databricks = {
      source  = "databricks/databricks"
      version = "~> 1.0"
    }
  }
}

provider "databricks" {
  # Automatically uses DATABRICKS_HOST, DATABRICKS_CLIENT_ID,
  # and DATABRICKS_CLIENT_SECRET from environment variables
}

Per altre opzioni di autenticazione e informazioni dettagliate sulla configurazione di OAuth, vedere Autorizzare l'accesso dell'entità servizio ad Azure Databricks con OAuth e Databricks Terraform provider.

2. Creare un progetto

Un progetto è la risorsa di primo livello che contiene rami, endpoint, database e ruoli.

Annotazioni

Quando si crea un progetto, Azure Databricks effettua automaticamente il provisioning di un ramo predefinito denominato production con un endpoint di calcolo di lettura/scrittura denominato primary. Per configurare una risorsa , ad esempio per abilitare la disponibilità elevata nell'endpoint, dichiarare una corrispondenza databricks_postgres_branch o databricks_postgres_endpoint con replace_existing = true. Terraform acquisisce la proprietà della risorsa esistente confrontando gli ID noti.

Creare un progetto di base:

resource "databricks_postgres_project" "app" {
  project_id = "my-app"
  spec = {
    pg_version   = 17
    display_name = "My Application"
  }
}

Eseguire questi comandi per formattare la configurazione e creare il progetto:

terraform fmt
terraform apply

3. Ottenere un progetto

Ottenere informazioni sul progetto appena creato usando un'origine dati:

data "databricks_postgres_project" "this" {
  name = databricks_postgres_project.app.name
}

output "project_name" {
  value = data.databricks_postgres_project.this.name
}

output "project_pg_version" {
  value = try(data.databricks_postgres_project.this.status.pg_version, null)
}

output "project_display_name" {
  value = try(data.databricks_postgres_project.this.status.display_name, null)
}

Suggerimento

Le origini dati restituiscono valori nel status campo. Usare try() per accedere in modo sicuro ai campi che potrebbero non essere disponibili in tutte le versioni del provider.

Eseguire questi comandi per applicare la configurazione e visualizzare i dettagli del progetto:

terraform apply
terraform output

4. Creare un ramo

I rami forniscono ambienti di database isolati all'interno di un progetto.

Annotazioni

Un ramo predefinito production viene creato automaticamente quando si crea un progetto e include un endpoint di lettura/scrittura implicito denominato primary. Quando si creano rami aggiuntivi come il ramo di sviluppo seguente, ogni nuovo ramo ottiene anche il proprio endpoint di lettura/scrittura implicito primary . Il passaggio 5 illustra come portare l'endpoint nella gestione di Terraform.

In questo esempio viene creato un ramo di sviluppo:

resource "databricks_postgres_branch" "dev" {
  branch_id = "dev"
  parent    = databricks_postgres_project.app.name
  spec = {
    no_expiry = true
  }
}

output "dev_branch_name" {
  value = databricks_postgres_branch.dev.name
}

Eseguire questi comandi per creare il ramo e visualizzarne il nome:

terraform apply
terraform output dev_branch_name

5. Creare un endpoint

Gli endpoint forniscono risorse di calcolo per l'esecuzione di query su un ramo.

Annotazioni

Ogni ramo creato include un endpoint di lettura/scrittura creato in modo implicito denominato primary. Per integrarlo nella gestione di Terraform e applicare la propria configurazione ad esso, dichiarare una databricks_postgres_endpoint risorsa con endpoint_id = "primary" e impostare replace_existing = true. Questo indica a Terraform di assumere la proprietà dell'endpoint esistente invece di tentare di crearne uno nuovo. Senza replace_existing, l'applicazione ha esito negativo con un errore di operazioni in conflitto.

Assumi la proprietà dell'endpoint primario del branch di sviluppo e applica la tua configurazione ad esso.

resource "databricks_postgres_endpoint" "dev_primary" {
  endpoint_id = "primary"
  parent      = databricks_postgres_branch.dev.name
  spec = {
    endpoint_type = "ENDPOINT_TYPE_READ_WRITE"
  }
  replace_existing = true
}

output "dev_endpoint_name" {
  value = databricks_postgres_endpoint.dev_primary.name
}

Eseguire questi comandi per applicare la configurazione e visualizzare il nome dell'endpoint:

terraform apply
terraform output dev_endpoint_name

Per altri modelli di endpoint, incluse le repliche di sola lettura e la scalabilità automatica personalizzata, consultare il riferimento databricks_postgres_endpoint.

6. Elencare gli endpoint

Elencare gli endpoint nel ramo di sviluppo per visualizzare i dettagli sull'endpoint di lettura/scrittura creato:

data "databricks_postgres_endpoints" "dev" {
  parent = databricks_postgres_branch.dev.name
}

output "dev_endpoint_names" {
  value = [for e in data.databricks_postgres_endpoints.dev.endpoints : e.name]
}

output "dev_endpoint_types" {
  value = [
    for e in data.databricks_postgres_endpoints.dev.endpoints :
    try(e.status.endpoint_type, null)
  ]
}

Eseguire questi comandi per applicare la configurazione e visualizzare i dettagli dell'endpoint:

terraform apply
terraform output dev_endpoint_names
terraform output dev_endpoint_types

Suggerimento

Quando si esegue terraform apply e vengono modificati solo gli output (nessuna modifica dell'infrastruttura), Terraform mostra "Modifiche agli output" e aggiorna lo stato senza modificare le risorse.

7. Elencare i rami

Elencare tutti i rami nel progetto. Verranno restituiti due rami: il ramo di produzione creato automaticamente con il progetto e il ramo di sviluppo creato in un passaggio precedente:

data "databricks_postgres_branches" "all" {
  parent = databricks_postgres_project.app.name
}

output "branch_names" {
  value = [for b in data.databricks_postgres_branches.all.branches : b.name]
}

Eseguire questi comandi per applicare la configurazione e visualizzare i nomi dei rami:

terraform apply
terraform output branch_names

8. Eliminare un ramo

Eliminare ora il ramo di sviluppo creato in precedenza. Si tratta di un flusso di lavoro tipico: creare un ramo per lo sviluppo o il test ed eliminarlo al termine.

Quando si elimina un ramo, eliminare tutti gli endpoint associati e quindi eliminare definitivamente il ramo.

8.1 Eliminare definitivamente l'endpoint

Eliminare l'endpoint per il ramo di sviluppo:

terraform destroy -target=databricks_postgres_endpoint.dev_primary

8.2 Distruggere il ramo

Eliminare definitivamente il ramo di sviluppo:

terraform destroy -target=databricks_postgres_branch.dev

8.3 Rimuovere dalla configurazione

Dopo l'eliminazione definitiva mirata, rimuovere o impostare come commento i blocchi di risorse dai file di configurazione per impedire a Terraform di ricrearli:

  • Rimuovere databricks_postgres_branch.dev e i suoi output
  • Rimuovere databricks_postgres_endpoint.dev_primary e i suoi output
  • Aggiornare tutte le origini dati che fanno riferimento al ramo eliminato (ad esempio, list_endpoints.tf)

Riconciliare quindi lo stato:

terraform apply

Suggerimento

Alternativa: rimuovere tutti contemporaneamente

È anche possibile rimuovere i blocchi di risorse dalla configurazione, quindi eseguire terraform apply. Terraform intende distruggere le risorse. Questo approccio illustra il piano di distruzione completo prima dell'esecuzione.

Serializzare le risorse sorelle con depends_on

Lakebase elabora un solo ruolo, un database o un'operazione endpoint alla volta all'interno di un singolo ramo. Se si dichiarano due risorse di pari livello di questi tipi nello stesso ramo e Terraform non dispone già di un margine di dipendenza tra di essi (ad esempio, un database che fa riferimento a un ruolo tramite spec.role), Terraform tenta di crearli in parallelo e uno ha esito negativo con un errore di conflitto-operazioni.

La correzione consiste nell'aggiungere un elemento esplicito depends_on in modo che Terraform serializzi l'applicazione:

resource "databricks_postgres_role" "schema_owner" {
  role_id = "schemamigrator"
  parent  = databricks_postgres_branch.main.name
  spec = {
    postgres_role    = "schemamigrator"
    membership_roles = ["DATABRICKS_SUPERUSER"]
  }
}

resource "databricks_postgres_role" "application" {
  role_id = "application"
  parent  = databricks_postgres_branch.main.name
  spec = {
    postgres_role = "application"
  }

  depends_on = [databricks_postgres_role.schema_owner]
}

Passaggi successivi