You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一Terraform模块中使用Databricks账户与工作区提供商?

Databricks账户级与工作区级Terraform操作共存的提供商配置问题解决

问题场景

在同一套Terraform配置中同时实现Databricks账户级与工作区级操作时,执行terraform apply遇到以下错误:

Error: cannot read metastores: cannot get client metastores: invalid Databricks Account configuration
│ 
│   with module.dbr_unity_catalog_metastore.module.unity_catalog_workspace_assignment.data.databricks_metastores.all,
│   on modules/unity_catalog_workspace_assignment/unity_catalog_workspace_assignment.tf line 1, in data "databricks_metastores" "all":
│    1: data "databricks_metastores" "all" {

原因是unity_catalog_workspace_assignment模块中的databricks_metastores数据源属于账户级操作,但当前继承的是工作区级提供商,导致无法读取账户下的元数据存储。

解决方案

通过层级提供商传递,将根模块定义的databricks.account提供商传递到深层子模块,具体步骤如下:

1. 根模块传递双提供商到dbr_unity_catalog_metastore

修改根模块中dbr_unity_catalog_metastore的调用,同时传递工作区级和账户级提供商:

module "dbr_unity_catalog_metastore" {
    source                            = "./modules/dbr_unity_catalog_metastore"
    providers = {  
        databricks = databricks.workspace  # 供工作区级资源使用
        databricks.account = databricks.account  # 传递账户级提供商到子模块
    }
    # 其他变量保持不变
    depends_on                        = [module.dbr_unity_catalog_azure, module.dbr_workspace]
    azure_resource_group              = var.resource_group_name
    databricks_workspace_id           = module.dbr_workspace.databricks_workspace_id
    metastore_name                    = var.metastore_name
    metastore_storage_account_name    = var.metastore_storage_account_name
    metastore_storage_container_name  = var.metastore_storage_container_name
    access_connector_name             = var.access_connector_name
    access_connector_id               = module.dbr_unity_catalog_azure.access_connector_id
    sp_application_id                 = var.sp_application_id
    sp_display_name                   = var.sp_display_name
    admin_group_id                    = data.databricks_group.admins.id
    tags                              = var.tags
}

2. dbr_unity_catalog_metastore模块接收并转发账户级提供商

在dbr_unity_catalog_metastore模块中,先声明允许使用databricks.account别名,再将其传递给内部的unity_catalog_workspace_assignment模块:

# 模块内的terraform块添加提供商别名声明
terraform {
  required_providers {
    databricks = {
      source = "databricks/databricks"
      configuration_aliases = [databricks.account]
    }
  }
}

# 调用子模块时指定使用账户级提供商
module "unity_catalog_workspace_assignment" {
  source        = "../unity_catalog_workspace_assignment"
  providers = {
    databricks = databricks.account  # 绑定到账户级提供商
  }
  workspace_id  = var.databricks_workspace_id  
  metastore_name = var.metastore_name
}

# 工作区级资源保持使用默认的databricks提供商(即传递过来的workspace别名)
resource "databricks_storage_credential" "external_mi" {
  name = "external_location_mi_credential"
  azure_managed_identity {
    access_connector_id = var.access_connector_id
  }
  owner      = var.sp_application_id
  comment    = "Storage credential for all external locations"
  depends_on = [ module.unity_catalog_workspace_assignment ]
}

3. 确认unity_catalog_workspace_assignment模块的提供商配置

在unity_catalog_workspace_assignment模块中,确保提供商声明正确(无需额外别名,直接使用传递过来的账户级实例):

terraform {
  required_providers {
    databricks = {
      source = "databricks/databricks"
    }
  }
}

data "databricks_metastores" "all" {
  # 自动使用传递过来的账户级提供商,可正常读取账户元数据存储
}

resource "databricks_metastore_assignment" "prod" {
  metastore_id  = data.databricks_metastores.all.ids[var.metastore_name]
  workspace_id  = var.workspace_id
}

核心逻辑

Terraform的提供商采用层级传递机制,根模块的提供商别名必须显式传递给子模块,子模块再显式传递给其下一级子模块。databricks_metastores和databricks_metastore_assignment属于账户级操作,必须使用指向accounts.azuredatabricks.net的账户级提供商,不能复用工作区级提供商。

内容的提问来源于stack exchange,提问作者Filip Drzewiecki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:55:55