Terraform批量创建Azure Databricks工作区时实例池配置报错咨询
问题原因
Terraform根级provider块不支持遍历for_each生成的资源集合,你原有写法直接引用带for_each配置的azurerm_databricks_workspace.workspace资源整体时,没有指定具体实例key,且根provider加载阶段无法动态遍历多实例资源生成多套provider配置,因此触发校验报错。
你当前使用的组件版本(Terraform 0.13、Databricks Provider 0.5.7)完全可以通过「子Module多实例+独立provider上下文」的方案实现批量创建,不需要升级版本。
实现步骤
1. 调整目录结构
把实例池相关配置抽成独立子Module,绕开根provider不能动态遍历的限制,目录结构参考:
. ├── main.tf # 根配置,存放工作区创建逻辑 ├── variables.tf └── modules/ └── databricks_pool/ # 实例池子Module ├── main.tf └── variables.tf
2. 修改根目录配置
根目录的main.tf保留原有Databricks工作区创建逻辑,新增子Module调用块,遍历所有已创建的工作区:
# 原有Azurerm provider配置保留 provider "azurerm" { features {} # 补充你原有Azurerm认证参数 } # 根级Databricks provider只保留全局服务主体认证,不绑定具体工作区 provider "databricks" { azure_client_id = var.azure_client_id azure_client_secret = var.azure_client_secret azure_tenant_id = var.azure_tenant_id } # 原有工作区批量创建逻辑完全保留 resource "azurerm_databricks_workspace" "workspace" { for_each = { for r in var.databricks_workspace_list : r.workspace_nm => r} name = each.key resource_group_name = each.value.resource_group_name location = each.value.location sku = "standard" tags = { Environment = "Dev" } } # 遍历所有工作区,每个工作区对应一个独立的子Module实例 module "workspace_instance_pool" { for_each = azurerm_databricks_workspace.workspace source = "./modules/databricks_pool" workspace_resource_id = each.value.id # 实例池的自定义参数可以通过变量传入子Module }
3. 编写子Module配置
首先在modules/databricks_pool/variables.tf定义入参:
variable "workspace_resource_id" { type = string } # 服务主体认证参数可以定义为变量从根配置传入,也可以直接写固定值 variable "azure_client_id" { type = string } variable "azure_client_secret" { type = string sensitive = true } variable "azure_tenant_id" { type = string }
然后在modules/databricks_pool/main.tf编写工作区绑定逻辑和实例池资源:
# 子Module内的Databricks provider绑定当前迭代对应的工作区ID provider "databricks" { azure_client_id = var.azure_client_id azure_client_secret = var.azure_client_secret azure_tenant_id = var.azure_tenant_id azure_workspace_resource_id = var.workspace_resource_id } # 原有节点类型数据源放到子Module内,筛选逻辑保持和之前一致 data "databricks_node_type" "smallest" { local_disk = true min_cores = 4 gb_per_core = 4 # 补充你原有筛选规则 } # 实例池配置不需要调整 resource "databricks_instance_pool" "smallest_nodes" { instance_pool_name = "Smallest Nodes" min_idle_instances = 0 max_capacity = 300 node_type_id = data.databricks_node_type.smallest.id idle_instance_autotermination_minutes = 10 }
注意事项
- 子Module的每个迭代实例都有独立的provider上下文,会自动把实例池创建到对应绑定的工作区内,不会出现资源错发的问题
- 后续如果需要给每个工作区批量创建集群、作业、Notebook等Databricks资源,直接在子Module内新增对应资源即可,不需要调整provider配置
- 不要在根级别手动为每个工作区编写带
alias的provider块,当工作区数量变动时维护成本极高,不符合批量管理的设计逻辑
内容的提问来源于stack exchange,提问作者nil13
相关产品推荐
相关产品推荐

