大地形态 Splat 表达式给出"Invalid template interpolation value"



我使用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。

有人能帮我显示身份证列表吗?

首先,我想注意的是,如果您不想将此列表与字符串消息组合,则根本不需要将其与字符串消息结合,因为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)}"
}

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

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,但避免了特定排序很重要的含义,如果重要的是它是一个列表,而不管排序如何(

相关内容

最新更新