Typisches Lakebase-Projektsetup mit deklarativen Automatisierungspaketen

Diese Seite zeigt ein vollständiges Bundle für Declarative Automation Bundles für ein produktionsreifes Lakebase-Autoscaling-Projekt mit den am häufigsten verwendeten Funktionen:

  • Geschützte Produktionszweige
  • Hochverfügbare (HA) Lese-Schreib-Endpunkte mit lesbaren sekundären Instanzen
  • Inline-Berechtigung auf Arbeitsbereichsebene CAN_MANAGE für einen Dienstprinzipal
  • Fortlaufendes Synchronisieren von Tabellen aus dem Unity-Katalog
  • Unity-Katalogbindung für die Lakebase-Datenbank
  • Databricks App, die mit dem Lakebase-Projekt verbunden ist

Eine schrittweise Einführung in deklarative Automatisierungspakete mit Lakebase finden Sie unter Manage Lakebase with Declarative Automation Bundles.

Voraussetzungen

Bevor Sie beginnen, benötigen Sie Folgendes:

  • Databricks CLI v1.0.0 oder höher. Führen Sie zum Überprüfen der Version databricks --version aus. Informationen zum Installieren oder Aktualisieren finden Sie unter Installieren oder Aktualisieren der Databricks CLI.
  • Ein Azure Databricks Arbeitsbereich mit aktivierter Lakebase.
  • Ein Dienstprinzipal, der für die OAuth-Computer-zu-Computer-Authentifizierung (M2M) konfiguriert ist. Das Bündel gewährt diesem Prinzipalarbeitsbereich CAN_MANAGE Berechtigungen für das Projekt. Siehe Autorisieren des Dienstprinzipalzugriffs auf Azure Databricks mit OAuth und Verwalten von Projektberechtigungen.
  • Eine Unity Catalog Delta-Tabelle mit aktiviertem CDF (Change Data Feed) als Synchronisierungsquelle. Entfernen Sie die postgres_synced_tables- und postgres_catalogs-Blöcke, wenn Sie keine Datensynchronisierung benötigen.

Vollständige Paketkonfiguration

Das Bündel verwendet Variablen für alle arbeitsbereichspezifischen Werte. Legen Sie sie in einer .databricks/bundle/<target>/variables.json-Datei fest oder übergeben Sie sie bei der Bereitstellung mit --var.

Wenn Sie ein Projekt erstellen, erstellt Azure Databricks automatisch einen production Branch, einen primary Lese-/Schreibendpunkt, eine an Ihre Identität gebundene Postgres-Besitzerrolle und eine databricks_postgres Datenbank. Um diese implizit erstellten Ressourcen zu konfigurieren, deklarieren Sie sie mit replace_existing: true.

bundle:
  name: lakebase-typical-project

variables:
  project_id:
    description: 'Lakebase project ID (lowercase, hyphen-delimited)'
    default: 'my-lakebase-project'
  display_name:
    description: 'Human-readable project name shown in the UI'
    default: 'My Lakebase project'
  pg_version:
    description: 'Postgres major version'
    default: 17
  min_cu:
    description: 'Minimum compute units on the default endpoint'
    default: 0.5
  max_cu:
    description: 'Maximum compute units on the default endpoint'
    default: 4.0
  suspend_timeout:
    description: 'Idle time before the default endpoint suspends. Ignored when no_suspension is true.'
    default: '300s'
  admin_sp_app_id:
    description: 'Application ID of the service principal to grant CAN_MANAGE on the project'
    default: '<your-sp-application-id>'
  source_table:
    description: 'Unity Catalog three-part name of the Delta table to sync (catalog.schema.table)'
    default: '<catalog>.<schema>.<table>'
  primary_key_column:
    description: 'Primary key column of the source Delta table'
    default: '<pk>'
  storage_catalog:
    description: 'Unity Catalog catalog where the sync pipeline stores its metadata'
    default: '<catalog>'
  storage_schema:
    description: 'Unity Catalog schema where the sync pipeline stores its metadata'
    default: '<schema>'
  app_name:
    description: 'Databricks App name (must be unique in the workspace)'
    default: 'my-lakebase-app'
  uc_catalog_id:
    description: 'Name to register the Lakebase database in Unity Catalog'
    default: 'my_lakebase_uc_catalog'
  database_name:
    description: 'Postgres-internal name for the app database'
    default: 'app_database'

targets:
  prod:
    default: true
    workspace:
      host: https://<your-workspace>.cloud.databricks.com

    resources:
      # Project — top-level container for branches, endpoints, and databases.
      # The permissions block grants workspace-level CAN_MANAGE to the service principal.
      postgres_projects:
        lakebase_project:
          project_id: ${var.project_id}
          # purge_on_delete: true  # Uncomment to permanently delete on destroy (default: soft delete, 7-day retention).
          pg_version: ${var.pg_version}
          display_name: ${var.display_name}
          default_endpoint_settings:
            autoscaling_limit_min_cu: ${var.min_cu}
            autoscaling_limit_max_cu: ${var.max_cu}
            suspend_timeout_duration: ${var.suspend_timeout}
          permissions:
            - service_principal_name: ${var.admin_sp_app_id}
              level: CAN_MANAGE

      # Configure the implicitly created production branch as protected.
      postgres_branches:
        production:
          branch_id: production
          parent: ${resources.postgres_projects.lakebase_project.name}
          no_expiry: true
          is_protected: 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.
      postgres_endpoints:
        primary:
          endpoint_id: primary
          parent: ${resources.postgres_branches.production.name}
          endpoint_type: ENDPOINT_TYPE_READ_WRITE
          autoscaling_limit_min_cu: ${var.min_cu}
          autoscaling_limit_max_cu: ${var.max_cu}
          no_suspension: true
          group:
            min: 2
            max: 2
            enable_readable_secondaries: true
          replace_existing: true

      # Postgres role that owns the app database.
      postgres_roles:
        app_role:
          role_id: app-role # Resource ID: lowercase letters, digits, and hyphens.
          parent: ${resources.postgres_branches.production.name}
          postgres_role: app_role # Postgres identifier: lowercase letters, digits, and underscores.

      # Named Postgres database for the app.
      postgres_databases:
        app_db:
          database_id: app-database
          parent: ${resources.postgres_branches.production.name}
          postgres_database: ${var.database_name}
          role: ${resources.postgres_roles.app_role.id}

      # Sync a Unity Catalog Delta table into the project continuously.
      postgres_synced_tables:
        orders_sync:
          synced_table_id: '${var.storage_catalog}.${var.storage_schema}.orders_synced'
          branch: ${resources.postgres_branches.production.name}
          postgres_database: ${var.database_name}
          source_table_full_name: ${var.source_table}
          primary_key_columns:
            - ${var.primary_key_column}
          scheduling_policy: CONTINUOUS
          create_database_objects_if_missing: true
          new_pipeline_spec:
            storage_catalog: ${var.storage_catalog}
            storage_schema: ${var.storage_schema}

      # Bind the Lakebase database into Unity Catalog so it is queryable as UC data.
      postgres_catalogs:
        lakebase_uc_catalog:
          catalog_id: ${var.uc_catalog_id}
          postgres_database: ${var.database_name}
          branch: ${resources.postgres_branches.production.name}
          create_database_if_missing: true

      # Databricks App connected to the project.
      # Update source_code_path to point to your app source directory.
      apps:
        lakebase_app:
          name: ${var.app_name}
          description: 'App backed by Lakebase autoscaling'
          source_code_path: ./app_src
          config:
            command:
              - flask
              - run
              - --host=0.0.0.0
              - --port=8000
          resources:
            - name: lakebase-db
              postgres:
                branch: ${resources.postgres_branches.production.name}
                database: ${resources.postgres_databases.app_db.name}
                permission: CAN_CONNECT_AND_CREATE

Note

Jedes Lakebase-Projekt erstellt automatisch eine databricks_postgres Datenbank, die einer mit Ihrer Identität verknüpften Postgres-Rolle gehört. Dieses Paket erstellt stattdessen eine separate Datenbank mit eigenem Namen (${var.database_name}), die einer dedizierten App-Rolle gehört, um App-Daten zu isolieren. Um die implizite Datenbank und Rolle direkt zu verwenden, entfernen Sie die Ressourcenblöcke postgres_roles und postgres_databases, legen Sie postgres_database: databricks_postgres direkt auf postgres_synced_tables und postgres_catalogs fest und aktualisieren Sie die App-Ressource auf database: ${resources.postgres_branches.production.name}/databases/databricks-postgres.

Um stattdessen die implizite Besitzerrolle und die databricks_postgresDatenbank unter Bundle-Verwaltung zu stellen, deklarieren Sie sie mit replace_existing: true unter Verwendung ihrer vorhandenen IDs. Die Datenbank-ID ist immer databricks-postgres. Die Rollen-ID wird von Ihrer Databricks-Identität abgeleitet, anstatt ein fester Name zu sein. Suchen Sie sie also zuerst nach:

databricks postgres list-roles projects/<project-id>/branches/production

Deklarieren Sie dann beide Ressourcen, die allen bereits für die Rolle festgelegten Feldern entsprechen. Wenn membership_roles weggelassen wird, wird die DATABRICKS_SUPERUSER-Mitgliedschaft bei der Übernahme aus der Rolle entfernt. Geben Sie sie daher explizit an:

postgres_roles:
  owner:
    role_id: <role-id-from-list-roles>
    parent: ${resources.postgres_branches.production.name}
    postgres_role: user@databricks.com # Or the service principal application ID.
    identity_type: USER # Or SERVICE_PRINCIPAL.
    membership_roles:
      - DATABRICKS_SUPERUSER
    replace_existing: true

postgres_databases:
  databricks_postgres:
    database_id: databricks-postgres
    parent: ${resources.postgres_branches.production.name}
    postgres_database: databricks_postgres
    role: ${resources.postgres_roles.owner.id}
    replace_existing: true

Note

Führen Sie databricks bundle destroy -t prod aus, um die Ressourcen zu löschen, die dieses Bundle erstellt. Standardmäßig wird das Projekt vorläufig gelöscht und 7 Tage vor dem endgültigen Löschen aufbewahrt, sodass Sie es während des Aufbewahrungszeitraums wiederherstellen können. Um nur das Projekt sofort zu löschen, verwenden Sie die Databricks-CLI mit --purge, oder heben Sie die Auskommentierung von purge_on_delete: true in der obigen Projektressource auf, um es bei jedem Destroy-Vorgang endgültig zu löschen:

databricks postgres delete-project projects/<project-id> --purge

Anwenden des Bündels

Überprüfen und Bereitstellen:

databricks bundle validate -t prod
databricks bundle deploy -t prod

Wenn databricks bundle deploy beim ersten Ausführen nicht abgeschlossen wird, führen Sie es erneut aus.

Was bereitgestellt wird

Das Bundle erstellt die folgenden Ressourcen:

  • Ein Lakebase-Autoscaling-Projekt mit den von Ihnen angegebenen Standard-Recheneinstellungen.
  • Eine geschützte production Verzweigung.
  • Ein primärer Endpunkt für Lese- und Schreibzugriffe mit HA und lesbaren sekundären Replikaten.
  • Eine fortlaufende Synchronisierungspipeline, die eine Unity Catalog Delta-Tabelle in die Projektdatenbank streamt.
  • Ein Unity-Katalog, der von der Lakebase-Datenbank unterstützt wird und als Unity-Katalogdaten abgefragt werden kann.
  • Eine Databricks-App, die mit der Projektdatenbank verbunden ist.
  • Berechtigung für den Arbeitsbereich CAN_MANAGE für den von Ihnen angegebenen Dienstprinzipal.

Weitere Ressourcen