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

Azure中使用Terraform创建子网时遇属性类型错误问题

问题排查与修复:Azure子网Terraform创建错误

错误原因

你在azurerm_subnet资源的name字段中,错误地将local.subnets[each.key]赋值给它——这个表达式返回的是整个子网配置对象(包含cidrs、service等属性),而name要求的是字符串类型的子网名称,这就是报错的根源。

实际上,你的local.subnets是一个键值对,键本身就是子网名称(比如snet-general-prod-cus-5315),所以直接使用each.key即可。另外原代码还缺少服务端点和子网委派的实际配置逻辑,即使修复name字段,这些配置也不会生效,需要补充完整。

修复后的完整代码

locals {
  subnets = {
    "snet-general-prod-cus-5315" = {
      cidrs = [cidrsubnet(data.azurerm_virtual_network.default.address_space[0],3,0)]
      service = { 
        endpoints = [
          "Microsoft.KeyVault",
          "Microsoft.Storage",
          "Microsoft.Web",
          "Microsoft.EventHub",
          "Microsoft.Sql",
          "Microsoft.AzureCosmosDB"
        ],
        delegations = {}
      }
    }
    "snet-webapp-prod-cus-6401" = {
      cidrs = [cidrsubnet(data.azurerm_virtual_network.default.address_space[0],3,1)]
      service = { 
        endpoints = [ ],
        delegations = {
          "Microsoft.Web/serverFarms" = {
            actions = ["Microsoft.Network/virtualNetworks/subnets/action"]
            name    = "Microsoft.Web/serverFarms"
          }
        }
      }
    }
    "snet-sqlmi-prod-cus-5951" = {
      cidrs = [cidrsubnet(data.azurerm_virtual_network.default.address_space[0],3,2)]
      service = { 
        endpoints = [ ],
        delegations = {
          "Microsoft.Sql/managedinstances" = {
            actions = ["Microsoft.Network/virtualNetworks/subnets/action"]
            name    = "Microsoft.Sql/managedinstances"
          }
        }
      }
    }
  }
}

data "azurerm_virtual_network" "default" {
  name                = local.virtual_network_name
  resource_group_name = local.managed_resource_group_name
}

resource "azurerm_subnet" "default" {
  for_each             = local.subnets 
  name                 = each.key  # 修复:直接使用键作为子网名称
  address_prefixes     = each.value.cidrs  # 优化:简化属性引用
  resource_group_name  = local.managed_resource_group_name
  virtual_network_name = data.azurerm_virtual_network.default.name

  # 配置服务端点
  dynamic "service_endpoint" {
    for_each = each.value.service.endpoints
    content {
      service = service_endpoint.value
    }
  }

  # 配置子网委派
  dynamic "delegation" {
    for_each = each.value.service.delegations
    content {
      name = delegation.key

      dynamic "service_delegation" {
        for_each = [delegation.value]
        content {
          name    = service_delegation.value.name
          actions = service_delegation.value.actions
        }
      }
    }
  }
}

关键修改点

  • name字段修复:将name = local.subnets[each.key]改为name = each.key,直接使用子网配置的键作为名称,符合字符串类型要求。
  • 简化属性引用:用each.value.cidrs替代local.subnets[each.key].cidrs,代码更简洁易读。
  • 补充服务端点配置:通过dynamic "service_endpoint"块遍历配置中的服务端点列表,自动创建对应端点。
  • 补充子网委派配置:通过嵌套dynamic块处理子网委派,确保Web App和SQL托管实例的委派配置生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:22:10