有条件地更新 terraform 变量中的键值

Conditional update of key values in a terraform variable

我正在尝试通过加载某些 JSON 文件中的数据来创建变量。 我有下面的代码,看起来应该可以工作,但是我在条件行上遇到了一个奇怪的错误。 example.json

{
  "title": "Group",
  "description": "",
  "tags": [
    "test1:test1",
    "type:test2"
  ]
}

main.tf

locals {
  default_tags = ["testtag:test value"]
  my_path = "${path.module}/environments/${var.environment}/json/"
  temp_config = flatten([
    for my_file in fileset("${local.my_path}", "*.json") : [
      for k, v in jsondecode(file("${local.my_path}/${my_file}")) : {
        key = k
        value = k == "tags" ? concat(v, local.default_tags): v
      }
    ]
  ])
}

output "output" {
  value = local.temp_config
}

我的错误:

Error: Inconsistent conditional result types
│
│   on mytest.tf line 8, in locals:
│    8:         value = k == "tags" ? concat(v, local.default_tags): v
│     ├────────────────
│     │ local.default_tags is tuple with 1 element
│
│ The true and false result expressions must have consistent types. The given expressions are tuple and tuple, respectively.

这个错误非常令人困惑。有没有人有类似的问题?

在这种情况下,Terraform 的类型推断似乎没有成功地找到自动解决方案来解决如何使条件语句的真假臂具有相同类型的问题。

在这种情况下,如果您添加更多有关您的意图的信息,Terraform 通常可以提供更好的错误消息(或者,在理想情况下,select 直接提供可行的解决方案)。在这种情况下,您的意图似乎是让这个 value 属性成为一个字符串列表,因此您可以给 Terraform 的一个额外提示是使用 [=14 将条件的两边明确标记为列表=]:

        value = k == "tags" ? tolist(concat(v, local.default_tags)) : tolist(v)

通过这些额外的 tolist 调用,Terraform 应该正确理解您打算在两种情况下生成字符串列表,或者应该 return 解释为什么可以处理一个或这两个表达式都是字符串列表。