Azure多Databricks工作区部署时Terraform Provider配置问题
解决方案
1. 根模块配置多实例Databricks Provider
修改./providers.tf,为每个工作区创建带唯一别名的Databricks Provider实例,确保每个工作区有独立的认证配置:
# ./providers.tf terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 3.29" } databricks = { source = "databricks/databricks" version = "~> 1.6" } } backend "azurerm" { # 环境变量配置保持原有设置 } } provider "azurerm" { features {} } # 为每个Databricks工作区生成独立的Provider实例 provider "databricks" { for_each = toset(var.dbw-names) alias = each.value azure_workspace_resource_id = module.dbw-default[index(var.dbw-names, each.value)].id }
2. 调整根模块的集群模块调用
修改./main.tf,让集群模块与工作区模块一一对应,绑定对应的Provider别名:
# ./main.tf # Databricks workspace 配置保持不变 module "dbw-default" { count = length(var.dbw-names) source = "./modules/dbw" dbw-name = var.dbw-names[count.index] dbw-project = var.project dbw-env = var.env dbw-resource-group-name = module.rg-default[index(var.rg-names, "databricks")].name dbw-location = var.location dbw-sku = var.dbw-sku dbw-tags = merge(var.tags, { "purpose" = "databricks", "env" = var.env }) } # Databricks Cluster:与工作区一一创建 module "db-cluster-default" { count = length(var.dbw-names) source = "./modules/db-cluster" # 绑定对应工作区的Provider实例 providers = { databricks = databricks.${var.dbw-names[count.index]} } # 为集群添加工作区后缀,避免名称冲突 db-cluster-name = "${var.db-cluster-name}-${var.dbw-names[count.index]}" db-cluster-env = var.env db-cluster-project = var.db-cluster-project db-cluster-tags = merge(var.tags, { "purpose" = "databricks", "env" = var.env, "workspace" = var.dbw-names[count.index] }) db-cluster-min-workers = var.db-cluster-min-workers db-cluster-max-workers = var.db-cluster-max-workers db-cluster-autotermination-minutes = var.db-cluster-autotermination-minutes }
3. 优化db-cluster模块配置
移除模块内重复的Provider声明,补充缺失的数据源配置:
# ./modules/db-cluster/main.tf # 移除模块内的terraform required_providers块(根模块已统一管理) # 补充缺失的Spark版本和节点类型数据源 data "databricks_spark_version" "latest_lts" { long_term_support = true } data "databricks_node_type" "smallest" { local_disk = true } resource "databricks_cluster" "shared_autoscaling" { cluster_name = format("db-cluster-%s-%s", var.db-cluster-project, var.db-cluster-env) spark_version = data.databricks_spark_version.latest_lts.id node_type_id = data.databricks_node_type.smallest.id autotermination_minutes = var.db-cluster-autotermination-minutes autoscale { min_workers = var.db-cluster-min-workers max_workers = var.db-cluster-max-workers } }
核心逻辑说明
- Databricks Provider的
azure_workspace_resource_id是全局配置,无法动态切换,因此必须为每个工作区创建独立的Provider实例,通过别名区分。 - 集群模块调用时必须显式指定对应的Provider别名,确保Terraform将集群绑定到正确的工作区。
- 为集群名称添加工作区后缀,避免多工作区下的资源名称冲突。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

