BOOL型DynamoDB项目出现问题



我正在尝试为表创建BOOL类型的属性,如下所示:

resource "aws_dynamodb_table_item" "items" {
table_name = aws_dynamodb_table.dynamodb-table.name
hash_key = aws_dynamodb_table.dynamodb-table.hash_key
range_key = aws_dynamodb_table.dynamodb-table.range_key
for_each = {
"0" = {
location = "Madrid",
coordinates = ["40.49", "-3.56"],
visible = "false",
destinations = ["0", "4"]
},
"1" = {
location = "Mexico City",
coordinates = ["52.36", "13.51"],
visible = "true",
destinations = ["1", "4"]
},
}
item = <<EOF
{
"id": { "N": "${each.key}"},
"location": {"S" : "${each.value.location}"},
"coordinates": {"NS": ${jsonencode(each.value.coordinates)}},
"destinations": {"NS": ${jsonencode(each.value.destinations)}},
"visible": {"BOOL": "${each.value.visible}"}
}
EOF
}

但我得到以下错误:

错误:"的格式无效;项目":解码失败:json:无法将字符串解组为BOOL 类型的Go结构字段AttributeValue.BOOL

根据AWS文档,属性值似乎是正确的:

BOOL
布尔类型的属性。例如:
"BOOL":true
类型:布尔型
必需:无

如果尝试另存为S(字符串(,它会起作用。

在这个例子中我做错了什么?

"visible": {"BOOL": ${each.value.visible}}

没有引号!:-p

这种意外行为是尝试通过字符串串联构建JSON字符串的常见结果。您在模板中包含了引号,因此Terraform保留了引号,使布尔值在结果中显示为字符串。

为了使其更具可读性并减少出现此类错误的机会,您应该使用jsonencode构建整个JSON值,而不仅仅是其中的一小部分:

item = jsonencode({
id           = { N = each.key }
location     = { S = each.value.location }
coordinates  = { NS = each.value.coordinates }
destinations = { NS = each.value.destinations }
visible      = { BOOL = each.value.visible }
})

这种模式使得Terraform的工作是使用jsonencode文档中描述的类型映射规则将整个值转换为有效的JSON。特别是,该函数知道如何将Terraformbool值转换为JSON Bool值,从而在没有错误的额外引号的情况下获得所需的结果。它还将确保idlocation值被正确地转义为JSON字符串,而如果其中任何一个值包含JSON认为是"的任何字符,那么您的原始示例就会失败;特别";。

最新更新