【问题标题】:Terraform Splat Expression Giving "Invalid template interpolation value"Terraform Splat 表达式给出“无效的模板插值”
【发布时间】:2021-07-03 14:30:54
【问题描述】:

我正在使用 Terraform 中的数据源来获取我的安全组的 ID 列表,如下所示:

data "aws_security_groups" "test" {
  filter {
    name   = "group-name"
    values = ["the-name"]
  }
}

output "security_group_id" {
  value = "The id is ${data.aws_security_groups.test.ids[*]}"
}

但是,这给了我以下错误:

Error: Invalid template interpolation value

on main.tf line 11, in output "security_group_id":
  11:   value = "The id is ${data.aws_security_groups.test.ids[*]}"
    |----------------
    | data.aws_security_groups.test.ids is list of string with 1 element

Cannot include the given value in a string template: string required.

但如果我改用data.aws_security_groups.test.ids[0],它会显示 ID。

有人可以帮我显示 ID 列表吗?

【问题讨论】:

标签: amazon-web-services terraform terraform-provider-aws aws-security-group


【解决方案1】:

首先,我要注意的是,如果您不想,则根本不需要将此列表与字符串消息组合,因为 Terraform 将接受任何类型的输出值:

output "security_group_ids" {
  value = data.aws_security_groups.test.ids
}

如果将它们作为更大字符串的一部分包含对您的潜在问题很重要,那么您需要决定如何在单个字符串中显示这些多个 id。有多种不同的方法可以做到这一点,具体取决于您打算如何处理这些信息。

一个相对简单的答案是使用jsonencode 使字符串包含列表的 JSON 表示,如下所示:

output "security_group_id_message" {
  value = "The ids are ${jsonencode(data.aws_security_groups.test.ids)}"
}

如果您想要更人性化的演示文稿,那么您可能更喜欢使用多行字符串,在这种情况下,您可以使用 string templates 自定义输出。

output "security_group_id_message" {
  value = <<-EOT
  The ids are:
  %{ for id in data.aws_security_groups.test.ids ~}
  - ${id}
  %{ endfor ~}
  EOT
}

或者,对于介于两者之间的答案,您可以使用 join 将值与简单的分隔符连接在一起,如下所示:

output "security_group_id_message" {
  value = "The ids are ${join(",", data.aws_security_groups.test.ids)}"
}

请注意,我在所有这些示例中从您的参考中删除了 [*],因为它在这里并没有真正做任何事情:data.aws_security_groups.test.ids 已经是一个可迭代的集合,因此与我的所有语言功能兼容在上面的例子中使用。

IIRC 提供者认为此 ids 属性是一组字符串而不是字符串列表,因此 [*] 后缀在其他情况下可能很有用,可以在需要时强制将集合转换为列表以这种方式输入,尽管如果这是您的意图,那么我建议使用以下其中一种,以便将来的读者更清楚它的作用:

  • sort(data.aws_security_groups.test.ids)(如果它的词法顺序对行为很重要;无论如何,Terraform 默认使用词法排序,但调用 sort 是一个很好的提示,可以让不熟悉 Terraform 的读者查找该函数以查看实际排序是什么顺序是。)
  • tolist(data.aws_security_groups.test.ids)(功能上等同于上面的sort,当它是一组字符串时,但避免暗示特定排序很重要,如果重要的是它是一个列表而不管排序)

【讨论】:

  • 这真的很有帮助!非常感谢你的队友
猜你喜欢
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 2023-04-03
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多