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

如何在Terraform中基于输入变量动态创建多个独立资源

Terraform for_each 与 dynamic 适用场景解答

首先给明确结论:不能用dynamic块在资源外部实现独立资源的批量创建需求,两种语法的适用场景完全不重叠,具体说明如下:

  • dynamic块的定位是处理单资源内部的重复嵌套配置段,只能写在资源/数据源/provider等块的内部,不能放在资源块外层,也不具备生成多个独立资源实例的能力。它的典型使用场景是生成同个资源里的多个重复嵌套参数,比如安全组的出入站规则块、存储账号的网络规则块等。
  • 你当前用资源根层级for_each批量创建独立azurerm_mssql_firewall_rule的方案,是Terraform官方推荐的标准实现,完全符合最佳实践。

如果你需要基于set类型的输入变量实现同样的批量创建逻辑,只需要在for_each处做个简单的类型转换即可,参考实现如下:

# 子模块变量定义改为set类型
variable "azureSQLAllowedIPs" {
  type = set(object({
    name = string
    ipAddress = string
  }))
}

# 资源侧将set转换为map,用规则名作为唯一索引键避免实例重复
resource "azurerm_mssql_firewall_rule" "azureSQLFirewall"{
  for_each = { for ip_rule in var.azureSQLAllowedIPs : ip_rule.name => ip_rule }
  name             = each.value.name
  server_id        = azurerm_mssql_server.azureSqlServer.id
  start_ip_address = each.value.ipAddress
  end_ip_address   = each.value.ipAddress
}

附dynamic块的典型使用示例,方便你对比两者差异:

resource "azurerm_mssql_server" "example" {
  name                         = "demo-sql-server"
  resource_group_name          = azurerm_resource_group.demo.name
  location                     = azurerm_resource_group.demo.location
  version                      = "12.0"
  administrator_login          = "admin"
  administrator_login_password = "TestPassw0rd!"

  # 动态生成资源内部的多个azuread_administrator嵌套配置块
  dynamic "azuread_administrator" {
    for_each = var.sql_ad_admin_list
    content {
      login_username = azuread_administrator.value.login_name
      object_id      = azuread_administrator.value.object_id
      tenant_id      = data.azurerm_client_config.current.tenant_id
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:54:03