我正在尝试为表创建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值,从而在没有错误的额外引号的情况下获得所需的结果。它还将确保id
和location
值被正确地转义为JSON字符串,而如果其中任何一个值包含JSON认为是"的任何字符,那么您的原始示例就会失败;特别";。