如何在同一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
相关产品推荐
相关产品推荐

