Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ważna
Obsługa Terraform dla Lakebase jest w wersji beta.
Ta strona przedstawia kompletną konfigurację Terraform dla produkcyjnego projektu Lakebase z najczęściej używanymi funkcjami:
- Chroniona gałąź produkcyjna
- Punkt końcowy odczytu i zapisu o wysokiej dostępności z czytelnymi elementami pomocniczymi
- Jednostka usługi z uprawnieniami do
DATABRICKS_SUPERUSERbazy danych - Baza danych Postgres należąca do aplikacji
- Baza danych Postgres zarejestrowana w katalogu Unity Catalog na potrzeby zapytań Lakehouse Federation z poziomu Databricks SQL i notebooków
- Ciągłe strumieniowanie zsynchronizowanej tabeli z Unity Catalog
- Aplikacja databricks połączona z projektem Lakebase
Aby zapoznać się z samouczkiem krok po kroku dotyczącym korzystania z Terraform z usługą Lakebase, zobacz Jak zacząć korzystać z Terraform z usługą Lakebase.
Wymagania wstępne
Przed rozpoczęciem musisz mieć następujące elementy:
- Zainstalowany program Terraform (wersja 1.0 lub nowsza). Zobacz Instalowanie programu Terraform.
- Podmiot usługi skonfigurowany do uwierzytelniania OAuth typu maszyna-maszyna (M2M) z uprawnieniem
CAN_MANAGEw projekcie Lakebase. Zobacz Autoryzowanie dostępu jednostki usługi do usługi Azure Databricks przy użyciu protokołu OAuth i Zarządzanie uprawnieniami projektu. - Tabela Delta w katalogu Unity z włączoną funkcją Change Data Feed (CDF), używana jako źródło synchronizacji.
Kompletna konfiguracja
Podczas tworzenia projektu Azure Databricks automatycznie tworzy production gałąź, primary punkt końcowy odczytu i zapisu, rolę właściciela bazy danych Postgres powiązaną z twoją tożsamością databricks_postgres i bazę danych. Aby skonfigurować te niejawnie utworzone zasoby, zadeklaruj je w narzędziu Terraform za pomocą polecenia replace_existing = true. Aby uzyskać więcej informacji, zobacz databricks_postgres_branch, databricks_postgres_endpoint, databricks_postgres_rolei databricks_postgres_database.
Ostrzeżenie
Ta konfiguracja ustawia is_protected = true na gałęzi production i zawiera zmienną unprotect_for_destroy powiązaną ze specyfikacją gałęzi. Program Terraform nie może usunąć projektu zawierającego chronione gałęzie, a production gałąź nie może zostać usunięta bezpośrednio, ponieważ jego cykl życia jest kontrolowany przez projekt. Aby prawidłowo usunąć zasoby, użyj dwuetapowego procesu usuwania:
# Step 1: unprotect the branch
terraform apply -var="unprotect_for_destroy=true"
# Step 2: destroy all resources
terraform destroy -var="unprotect_for_destroy=true"
Po uruchomieniu terraform destroyprojekt jest usuwany nietrwale i przechowywany przez 7 dni przed trwałym usunięciem. Aby natychmiast trwale go usunąć, ustaw purge_on_delete = true dla zasobu databricks_postgres_project przed uruchomieniem polecenia destroy.
variable "admin_sp_app_id" {
description = "Application ID of the service principal to grant admin access"
type = string
}
variable "unprotect_for_destroy" {
description = "Set to true before destroy to unprotect the production branch"
type = bool
default = false
}
# Project — top-level container for branches, endpoints, databases, and roles.
resource "databricks_postgres_project" "this" {
project_id = "my-lakebase-project"
# purge_on_delete = true # Uncomment to permanently delete on destroy (default: soft delete, 7-day retention).
spec = {
pg_version = 17
display_name = "My Lakebase Project"
default_endpoint_settings = {
autoscaling_limit_min_cu = 0.5
autoscaling_limit_max_cu = 4.0
suspend_timeout_duration = "300s"
}
}
}
# Configure the implicitly created production branch as protected.
resource "databricks_postgres_branch" "production" {
branch_id = "production"
parent = databricks_postgres_project.this.name
spec = {
no_expiry = true
is_protected = var.unprotect_for_destroy ? false : true
}
replace_existing = true
}
# Configure the implicitly created primary endpoint with HA.
# HA requires no_suspension = true. group.min = 2 adds a standby for automatic failover.
resource "databricks_postgres_endpoint" "primary" {
endpoint_id = "primary"
parent = databricks_postgres_branch.production.name
spec = {
endpoint_type = "ENDPOINT_TYPE_READ_WRITE"
autoscaling_limit_min_cu = 0.5
autoscaling_limit_max_cu = 4.0
no_suspension = true
group = {
min = 2
max = 2
enable_readable_secondaries = true
}
}
replace_existing = true
}
# Grant workspace-level CAN_MANAGE on the project to the service principal.
# Use status.project_id (bare ID) not .name (full resource path) — the permissions
# API rejects the full path with a "resource type not found" error.
resource "databricks_permissions" "project" {
database_project_name = databricks_postgres_project.this.status.project_id
access_control {
service_principal_name = var.admin_sp_app_id
permission_level = "CAN_MANAGE"
}
}
# Create a Postgres role backed by the service principal with full database privileges.
# depends_on serializes creation — Lakebase processes one branch operation at a time.
resource "databricks_postgres_role" "admin_sp" {
role_id = "admin-sp"
parent = databricks_postgres_branch.production.name
spec = {
identity_type = "SERVICE_PRINCIPAL"
postgres_role = var.admin_sp_app_id
auth_method = "LAKEBASE_OAUTH_V1"
membership_roles = ["DATABRICKS_SUPERUSER"]
attributes = {
createdb = true
createrole = true
bypassrls = true
}
}
depends_on = [databricks_postgres_endpoint.primary]
}
# Create a Postgres database owned by the admin SP role.
resource "databricks_postgres_database" "app" {
database_id = "app"
parent = databricks_postgres_branch.production.name
spec = {
postgres_database = "app"
role = databricks_postgres_role.admin_sp.name
}
}
# Register the Postgres database in Unity Catalog. This makes the database queryable
# from Databricks SQL and notebooks through Lakehouse Federation, and serves as the
# parent namespace for synced tables that live inside the Lakebase Catalog.
# create_database_if_missing is set explicitly because the database is managed by
# the databricks_postgres_database resource above.
resource "databricks_postgres_catalog" "app_catalog" {
catalog_id = "app_catalog"
spec = {
postgres_database = databricks_postgres_database.app.status.postgres_database
branch = databricks_postgres_branch.production.name
create_database_if_missing = false
}
}
# Sync a Unity Catalog Delta table into the Lakebase database continuously.
# Prefixing synced_table_id with the Lakebase Catalog name places the synced table
# inside the catalog so it's discoverable alongside the rest of the catalog's contents.
# postgres_database references the catalog's status, which implicitly orders this
# resource after the catalog without an explicit depends_on.
resource "databricks_postgres_synced_table" "orders" {
synced_table_id = "app_catalog.default.orders_synced"
spec = {
branch = databricks_postgres_branch.production.name
postgres_database = databricks_postgres_catalog.app_catalog.status.postgres_database
source_table_full_name = "my_catalog.default.orders"
primary_key_columns = ["order_id"]
scheduling_policy = "CONTINUOUS"
create_database_objects_if_missing = true
new_pipeline_spec = {
storage_catalog = "my_catalog"
storage_schema = "default"
}
}
}
# Databricks App connected to the Lakebase project.
# database must be the full resource name (databricks_postgres_database.app.name),
# not the Postgres database name. permission must be "CAN_CONNECT_AND_CREATE".
resource "databricks_app" "this" {
name = "my-lakebase-app"
description = "App backed by Lakebase autoscaling project"
depends_on = [databricks_postgres_database.app]
resources = [{
name = "lakebase-db"
postgres = {
branch = databricks_postgres_branch.production.name
database = databricks_postgres_database.app.name
permission = "CAN_CONNECT_AND_CREATE"
}
}]
}
Note
Ta konfiguracja tworzy oddzielną rolę (admin_sp) i bazę danych (app) zamiast zarządzać niejawną rolą właściciela i databricks_postgres bazą danych. Aby zamiast tego objąć te zasoby niejawne zarządzaniem w Terraform, zadeklaruj je za pomocą replace_existing = true, używając ich istniejących identyfikatorów. Identyfikator bazy danych to zawsze databricks-postgres. Identyfikator roli pochodzi z tożsamości, która utworzyła gałąź: część wiadomości e-mail przed @ (małe litery, znaki inne niż alfanumeryczne zastąpione łącznikami) dla użytkownika lub sp-<application-id> dla jednostki usługi. Jeśli nie jesteś pewien dokładnej wartości, przeczytaj ją z aplikacji Lakebase lub API Postgres zamiast wyprowadzać ją ręcznie.
spec.membership_roles zastępuje przynależności roli przy każdym zastosowaniu, zamiast je scalać. Zachowaj DATABRICKS_SUPERUSER na liście; pozostawienie jej na liście spowoduje usunięcie wszystkich członkostw roli.
resource "databricks_postgres_role" "owner" {
role_id = "jane-doe" # normalized login of the creating identity
parent = databricks_postgres_branch.production.name
spec = {
postgres_role = "jane.doe@databricks.com" # the raw login
membership_roles = ["DATABRICKS_SUPERUSER"]
attributes = {
createdb = true
createrole = true
bypassrls = true
}
}
replace_existing = true
}
resource "databricks_postgres_database" "databricks_postgres" {
database_id = "databricks-postgres"
parent = databricks_postgres_branch.production.name
spec = {
postgres_database = "databricks_postgres"
# spec.role is omitted, so the database keeps its existing owner.
}
replace_existing = true
}
Dodatkowe zasoby
- Wysoka dostępność obejmuje wzorce HA i informacje o tym, kiedy używać ich w środowisku produkcyjnym.
- Tabele synchronizacji obejmują opcje planowania i zarządzanie potokami.
- Zarządzanie uprawnieniami projektu obejmuje mechanizmy kontroli dostępu na poziomie obszaru roboczego i na poziomie bazy danych.
- Usługa Databricks Apps with Lakebase pokazuje, jak połączyć aplikacje z projektami skalowania automatycznego.
- Usługa Terraform Registry udostępnia pełne odwołanie do zasobów.