地形抛出错误:运行计划时"Incorrect attribute value type"



I使用来自https://github.com/Oxalide/terraform-fargate-example.

当我按原样运行时,我会出现错误:

Error: Incorrect attribute value type
on main.tf line, in resource "aws_alb" "main":
:   subnets         = ["${aws_subnet.public.*.id}"]
Inappropriate value for attribute "subnets": element 0: string required.

这一行的代码:

resource "aws_alb" "main" {
name            = "tf-ecs-chat"
subnets         = ["${aws_subnet.public.*.id}"] # <--- here is the error
security_groups = ["${aws_security_group.lb.id}"]
}

根据docs的例子,这似乎是正确的。

resource "aws_lb" "test" {
name               = "test-lb-tf"
internal           = false
load_balancer_type = "application"
security_groups    = ["${aws_security_group.lb_sg.id}"]
subnets            = ["${aws_subnet.public.*.id}"]
...

这个错误意味着什么?如何解决?

这个例子似乎是为Terraform的旧版本编写的,不幸的是,它依赖于早期版本的配置语言错误,该错误已经修复。

表达式aws_subnet.public.*.idaws_subnet.public的所有实例产生id属性值的列表。如果您将该表达式放在列表构造括号[]中,则Terraform将其理解为列表列表,如下所示:

[
[
"i-abc123",
"i-def456",
"i-ghi789",
],
]

aws_alb资源类型拒绝将其作为subnets的值,因为该参数被定义为期望字符串列表,而不是字符串列表。

因为aws_subnet.public.*.id已经返回了一个列表,所以您可以直接将其用作subnets:的值

subnets         = aws_subnet.public.*.id

还要注意,我们不需要字符串插值语法,因为我们只是直接使用列表值,而不是从模板构建字符串。

示例中的security_groups参数使用了类似的语法,但在这种情况下,aws_security_group.lb.id已经是单个ID字符串,而不是列表,因此在这种情况中需要[]列表方括号来构建列表。然而,我们仍然可以通过删除不必要的模板插值语法来清理它,得到以下结果:

resource "aws_alb" "main" {
name            = "tf-ecs-chat"
subnets         = aws_subnet.public.*.id
security_groups = [aws_security_group.lb.id]
}

Terraform提供者文档中的一些示例仍然使用旧版本Terraform的语法,特别是在有问题的提供者仍然与旧版本兼容的情况下,我相信在我写这篇文章时,AWS提供者就是这样。

在大多数情况下,这只会导致不必要的冗长语法,但不幸的是,在某些情况下,该示例依赖于前一版本中的一个错误,该错误现已修复,因此该示例本身在当前Terraform版本中不再正常工作。

如果你注意到这样的情况,你可以按照";报告问题";Terraform注册表中提供者页面上的链接。在这种情况下,所讨论的提供者是hashicorp/aws

最新更新