Terraform Splat 表达式给出“无效的模板插值”

Posted

技术标签:

【中文标题】Terraform Splat 表达式给出“无效的模板插值”【英文标题】:Terraform Splat Expression Giving "Invalid template interpolation value" 【发布时间】: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 列表吗?

【问题讨论】:

你试过使用join(separator, list)函数吗!? 【参考方案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,当它是一组字符串时,但避免暗示特定排序很重要,如果重要的是它是一个列表而不管排序)

【讨论】:

这真的很有帮助!非常感谢你的队友

以上是关于Terraform Splat 表达式给出“无效的模板插值”的主要内容,如果未能解决你的问题,请参考以下文章

webpack 服务给出“无效的正则表达式”错误

Terraform AWS Aurora Serverless MySQL - 错误:无效的数据库引擎

了解范围和数组中的 ruby​​ splat

Terraform:将 SEARCH 表达式与 CloudWatch 警报结合使用

双 * (splat) 运算符有啥作用

Terraform:验证错误...成员必须满足正则表达式模式:arn:aws:iam::