Terraform嵌套映射含空值时如何向DynamoDB条件插入可选字段
解决方案
你需要在构造DynamoDB Item的JSON结构时动态过滤空值字段,同时调整本地值的处理逻辑,避免给非必填字段默认赋值空字符串,具体修改如下:
1. 修正locals配置
原有locals逻辑存在两个问题:一是未将schedule名称存入对象,导致后续for_each引用schedule.name会报错;二是timezone不存在时默认赋值为空字符串,需调整为默认赋值null方便后续过滤。
修改后的代码:
locals { schedules = toset(flatten([ for schedule_name, schedule in var.schedules : { name = schedule_name description = schedule.description timezone = try(schedule.timezone, null) periods = schedule.periods } ])) }
2. 调整DynamoDB表项资源配置
使用merge函数动态组合字段,仅当非必填字段值不为null时才将其加入最终的Item结构:
resource "aws_dynamodb_table_item" "schedules" { for_each = { for schedule in local.schedules : schedule.name => schedule } table_name = aws_dynamodb_table.config_table.name hash_key = aws_dynamodb_table.config_table.hash_key item = jsonencode(merge( # 必填字段固定写入 { "description" = { "S" = each.value.description }, "periods" = { "SS" = each.value.periods } }, # 非必填字段仅在有值时写入 each.value.timezone != null ? { "timezone" = { "S" = each.value.timezone } } : {} )) }
修改后如果用户未传入timezone参数,最终生成的DynamoDB Item将不会包含timezone字段,符合目标格式要求。
内容的提问来源于stack exchange,提问作者corey
相关产品推荐
相关产品推荐

