是否有任何方法来条件存在在数组中,如果空值是在嵌套地图在Terraform?



我想插入dynamodb表的一些项目将在使用模块期间定义。在模块中指定参数时,用户不需要传递所有的变量,因为有些字段是不需要的,比如"timezone"

传递给模块 的输入值

locals {
schedules = {
"reyjkavik-time" = {
"timezone"    = "Atlantic/Reykjavik"
"description" = "office hours in Reykjavik"
"periods"     = ["office-hours"]
}
}
}

locals.tf

schedules = toset(flatten([
for schedule_name, schedule in var.schedules : {
description = schedule.description
timezone = try(schedule.timezone,"")
periods = schedule.periods
}
]))
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({
"description" = {
"S" = each.value.description
},
"timezone" = {
"S" = each.value.timezone
},
"periods" = {
"SS" = each.value.periods
},
})
}

但是如果用户没有传递像"timezone"这样的变量呢?项目将以以下格式添加到dynamodb

{
"timezone": {
"S": ""
},
"description": {
"S": "office hours in reyka"
},
"periods": {
"SS": [
"office-hours"
]
}
}

问题是我使用AWS lambda中的lambdahttps://aws.amazon.com/solutions/implementations/instance-scheduler/和数据库项的格式无效,因为dynamodb显示时区值为空,这是错误的。理想情况下,如果在这种情况下,我可以只插入两个字段(没有时区)

{
"description": {
"S": "office hours in reyka"
},
"periods": {
"SS": [
"office-hours"
]
}
}

你可以检查timezone的空字符串,如果你想跳过它:

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
}},
each.value.timezone != "" ? {"timezone" = {
"S" = each.value.timezone
}} : null,
{"periods" = {
"SS" = each.value.periods
},
}))
}

看起来不怎么漂亮,但是应该可以了。

相关内容