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

Terraform插值失效求助:Azure多环境资源部署报错排查

问题分析与修正方案

核心错误原因

  1. 资源组名称拼接逻辑错误:var.resource_group_name是列表类型,直接在字符串模板中引用会导致类型不匹配——each.value已经是列表中的单个元素(如Test-dev),无需再拼接整个列表。
  2. 未声明var.env变量:代码中引用了var.env但未在variable.tf中定义,且错误提示其为map类型,无法直接与字符串拼接。
  3. 存储账户属性赋值颠倒:resource_group_name应指向资源组的名称,location应指向资源组的位置,原代码两者赋值完全颠倒。

修正后的代码

variable.tf

variable "environments" {
  description = "各环境的配置信息"
  type = list(object({
    name     = string
    location = string
  }))
  default = [
    { name = "Test-dev", location = "East Asia" },
    { name = "Test-uat", location = "East Asia" },
    { name = "Test-prod", location = "East Asia" }
  ]
}

variable "storage_account_prefix" {
  description = "存储账户名称前缀(Azure要求名称全小写、无特殊字符)"
  default     = "teststorageact"
}

main.tf

# 批量创建资源组
resource "azurerm_resource_group" "resgrp" {
  for_each = { for env in var.environments : env.name => env }
  name     = "${each.value.name}-rg"
  location = each.value.location
  tags = {
    Environment = each.value.name
  }
}

# 批量创建存储账户
resource "azurerm_storage_account" "storageact" {
  for_each                 = { for env in var.environments : env.name => env }
  name                     = "${var.storage_account_prefix}${each.value.name}"
  resource_group_name      = azurerm_resource_group.resgrp[each.key].name
  location                 = azurerm_resource_group.resgrp[each.key].location
  account_tier             = "Standard"
  account_replication_type = "LRS"

  tags = {
    Environment = each.value.name
  }
}

扩展:添加SQL数据库与密钥Vault

按照相同的for_each模式,可快速添加需求中的SQL Database和Key Vault资源:

# 批量创建密钥Vault
resource "azurerm_key_vault" "kv" {
  for_each                 = { for env in var.environments : env.name => env }
  name                     = "kv-${each.value.name}"
  location                 = azurerm_resource_group.resgrp[each.key].location
  resource_group_name      = azurerm_resource_group.resgrp[each.key].name
  tenant_id                = data.azurerm_client_config.current.tenant_id
  soft_delete_retention_days = 7

  sku_name = "standard"

  tags = {
    Environment = each.value.name
  }
}

# 批量创建SQL服务器与数据库
resource "azurerm_mssql_server" "sql_server" {
  for_each                 = { for env in var.environments : env.name => env }
  name                     = "sql-${each.value.name}"
  resource_group_name      = azurerm_resource_group.resgrp[each.key].name
  location                 = azurerm_resource_group.resgrp[each.key].location
  version                  = "12.0"
  administrator_login      = "sqladmin"
  administrator_login_password = "yourStrongPassword123!" # 建议从密钥Vault或安全变量传入

  tags = {
    Environment = each.value.name
  }
}

resource "azurerm_mssql_database" "sql_db" {
  for_each      = { for env in var.environments : env.name => env }
  name          = "sqldb-${each.value.name}"
  server_id     = azurerm_mssql_server.sql_server[each.key].id
  sku_name      = "GP_Gen5_2"

  tags = {
    Environment = each.value.name
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:05:22