如何在Terragrunt HCL文件中正确为object类型变量赋值?
解决Terragrunt中修改Terraform Object类型变量字段的问题
你的问题源于两种错误的变量传递方式:
- 第一种写法
cluster_autoscaling.enabled = true违反HCL语法规则——HCL的映射键不能包含.,即便用引号包裹也会被解析为字符串键,而非嵌套对象的字段。 - 第二种写法
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
相关产品推荐
相关产品推荐

