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 表达式给出“无效的模板插值”的主要内容,如果未能解决你的问题,请参考以下文章
Terraform AWS Aurora Serverless MySQL - 错误:无效的数据库引擎