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

如何在Terragrunt HCL文件中正确为object类型变量赋值?

解决Terragrunt中修改Terraform Object类型变量字段的问题

你的问题源于两种错误的变量传递方式:

  1. 第一种写法cluster_autoscaling.enabled = true违反HCL语法规则——HCL的映射键不能包含.,即便用引号包裹也会被解析为字符串键,而非嵌套对象的字段。
  2. 第二种写法cluster_autoscaling = [{ "enabled" = true }]传递了列表(list)类型值,但变量cluster_autoscaling的类型是object,类型不匹配导致报错。

正确实现方式

由于你的Terraform模块中cluster_autoscaling是包含必填字段的object类型,必须传递完整的对象结构。你可以选择两种方式:

方式一:直接传递完整object

手动写出所有字段,仅将enabled改为true,其他字段保留模块默认值:

inputs = merge(
  {
    name                          = local.parent.inputs.name
    network                       = dependency.vpc.outputs.network_name
    project_id                    = local.parent.inputs.project_name
    cluster_autoscaling = {
      enabled       = true
      min_cpu_cores = 0
      max_cpu_cores = 0
      min_memory_gb = 0
      max_memory_gb = 0
      gpu_resources = []
    }
  },
)

方式二:用merge函数合并默认值与修改项

如果不想重复书写所有默认字段,可以将模块的默认object与需要修改的字段合并:

inputs = merge(
  {
    name                          = local.parent.inputs.name
    network                       = dependency.vpc.outputs.network_name
    project_id                    = local.parent.inputs.project_name
    cluster_autoscaling = merge(
      # 模块的默认配置
      {
        enabled       = false
        min_cpu_cores = 0
        max_cpu_cores = 0
        min_memory_gb = 0
        max_memory_gb = 0
        gpu_resources = []
      },
      # 需要修改的字段
      {
        enabled = true
      }
    )
  },
)

这种方式的优势是,后续模块默认值变更时,只需更新merge中的默认配置部分即可。

额外优化(可选)

如果你的Terraform模块允许,可以将cluster_autoscaling的字段标记为可选(通过optional()修饰符),这样后续传递变量时只需指定需要修改的字段,无需传递完整object。修改后的模块变量定义如下:

variable "cluster_autoscaling" {
  type = object({
    enabled       = optional(bool, false)
    min_cpu_cores = optional(number, 0)
    max_cpu_cores = optional(number, 0)
    min_memory_gb = optional(number, 0)
    max_memory_gb = optional(number, 0)
    gpu_resources = optional(list(object({ resource_type = string, minimum = number, maximum = number })), [])
  })
  default = {}
}

此时在Terragrunt中可以直接传递部分字段:

inputs = merge(
  {
    name                          = local.parent.inputs.name
    network                       = dependency.vpc.outputs.network_name
    project_id                    = local.parent.inputs.project_name
    cluster_autoscaling = {
      enabled = true
    }
  },
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:01:00