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

Terraform多层Map变量类型定义报错求助

解决Terraform多层Map结构变量类型不匹配的问题

情况1:每个DB服务器仅对应单个数据库

你的本地变量中,每个dbserver的databases是单个对象,而非键值对形式的Map。因此变量定义里的databases类型需要修正为object,而非map(object(...)):

variable "database_servers" {
  type = map(object({
    storage    = number
    db_version = string
    databases = object({
      name      = string
      collation = string
      charset   = string
    })
  }))
}

错误原因

之前的变量定义将databases声明为map(object(...)),Terraform会期望它是一个键值对集合(比如{ mgmt = { ... } }),但你的实际数据中databases是直接包含name等属性的单个对象,导致类型校验失败。报错提示"element 'name': object required",本质是Terraform误把name当成了Map的键,而键对应的值应该是object,但实际并非如此。

情况2:每个DB服务器对应多个数据库

如果你的需求是每个服务器可以包含多个数据库,需要先调整本地变量的结构,将databases改为键值对形式的Map:

locals {
  dbservers = {
    managementDBserver = {
      storage    = 32768
      db_version = "12"
      databases = {
        mgmt = {
          name      = "mgmt"
          collation = "en_US.utf8"
          charset   = "utf8"
        }
      }
    }
    reportingDBserver = {
      storage    = 32768
      db_version = "12"
      databases = {
        reports = {
          name      = "reports"
          collation = "en_US.utf8"
          charset   = "utf8"
        }
      }
    }
    coreDBserver = {
      storage    = 32768
      db_version = "12"
      databases = {
        core = {
          name      = "core"
          collation = "en_US.utf8"
          charset   = "utf8"
        }
      }
    }
  }
}

此时你最初的变量定义即可正常工作:

variable "database_servers" {
  type = map(object({
    storage    = number
    db_version = string
    databases = map(object({
      name      = string
      collation = string
      charset   = string
    }))
  }))
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:47:26