Terraform中修改Map属性:更新awslogs_group时避免丢失其他参数
为Terraform嵌套对象参数追加后缀并保留其他字段
问题场景
需要更新Terraform对象中的awslogs_group参数,为其追加后缀(例如foo-bar)。现有变量定义如下:
variable "task_log_drive" { default = { log-drive = "awslogs" options = { awslogs_group = "foo" awslogs_stream_prefix = "foo" awslogs_create_group = "true" awslogs_retention_period = "7" } } }
尝试使用merge函数处理时,虽然成功更新了awslogs_group,但options中的其他参数全部丢失:
locals { modified = merge(var.task_log_drive, { options = {awslogs_group = "${var.task_log_drive.options.awslogs_group}-bar"}}) }
执行后结果:
{ "log-drive" = "awslogs" "options" = { "awslogs_group" = "foo-bar" } }
解决方法
通过对嵌套的options对象进行针对性处理,可保留原有所有参数同时更新目标字段:
方法1:显式保留所有字段(已验证可行)
locals { modified = merge( var.task_log_drive, { options = { awslogs_group = "${var.task_log_drive.options.awslogs_group}-bar", awslogs_stream_prefix = var.task_log_drive.options.awslogs_stream_prefix, awslogs_create_group = var.task_log_drive.options.awslogs_create_group, awslogs_retention_period = var.task_log_drive.options.awslogs_retention_period } } ) }
方法2:更简洁的嵌套merge(优化方案)
无需手动列举所有字段,直接对内层options单独执行merge操作,自动保留原有键值对并覆盖目标字段:
locals { modified = merge( var.task_log_drive, { options = merge( var.task_log_drive.options, { awslogs_group = "${var.task_log_drive.options.awslogs_group}-bar" } ) } ) }
内容的提问来源于stack exchange,提问作者Everton Evaristo
相关产品推荐
相关产品推荐

