BOOL 类型 DynamoDB 项目的问题
Issue with BOOL type DynamoDB Item
我正在尝试为 table 创建一个 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
}
但我收到以下错误:
Error: Invalid format of "item": Decoding failed: json: cannot
unmarshal string into Go struct field AttributeValue.BOOL of type bool
根据 AWS documentation 属性值似乎是正确的:
BOOL
An attribute of type Boolean. For example:
"BOOL": true
Type: Boolean
Required: No
如果尝试另存为 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 的工作是使用 the jsonencode
documentation 中描述的类型映射规则将整个值转换为有效 JSON。特别是,该函数知道将 Terraform bool
值转换为 JSON Bool 值,从而在没有错误的额外引号的情况下获得您需要的结果。它还将确保 id
和 location
值被正确转义为 JSON 字符串,而如果其中任何一个包含任何字符 JSON 认为是“特殊的”。
我正在尝试为 table 创建一个 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
}
但我收到以下错误:
Error: Invalid format of "item": Decoding failed: json: cannot unmarshal string into Go struct field AttributeValue.BOOL of type bool
根据 AWS documentation 属性值似乎是正确的:
BOOL
An attribute of type Boolean. For example:
"BOOL": true
Type: Boolean
Required: No
如果尝试另存为 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 的工作是使用 the jsonencode
documentation 中描述的类型映射规则将整个值转换为有效 JSON。特别是,该函数知道将 Terraform bool
值转换为 JSON Bool 值,从而在没有错误的额外引号的情况下获得您需要的结果。它还将确保 id
和 location
值被正确转义为 JSON 字符串,而如果其中任何一个包含任何字符 JSON 认为是“特殊的”。