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 值,从而在没有错误的额外引号的情况下获得您需要的结果。它还将确保 idlocation 值被正确转义为 JSON 字符串,而如果其中任何一个包含任何字符 JSON 认为是“特殊的”。