【发布时间】:2019-10-22 22:06:37
【问题描述】:
我想在 Terraform 0.12 中连接两个数组。在我的示例中,有公共子网和私有子网。我想将它们都分配给相同的网络访问列表。以下代码缩短:
data "aws_subnet_ids" "private" {
vpc_id = aws_vpc.main.id
tags = {
subnet-type = "private"
}
}
data "aws_subnet_ids" "public" {
vpc_id = aws_vpc.main.id
tags = {
subnet-type = "public"
}
}
resource "aws_network_acl" "networks" {
vpc_id = aws_vpc.main.id
subnet_ids = concat(data.aws_subnet_ids.private.ids, data.aws_subnet_ids.public.ids)
[...]
}
如果我使用以下输出:
output "private_subnets" {
value = data.aws_subnet_ids.private.ids
}
output "public_subnets" {
value = data.aws_subnet_ids.public.ids
}
生成以下输出:
private_subnets = [
"subnet-243zr427rhhfjseb9",
"subnet-we789rh2438fchb6e",
"subnet-092rz7g82fhhkui74",
]
public_subnets = [
"subnet-12230qegvg764e9d",
"subnet-123465svgvgf0d7e",
]
所以一切都应该工作。但是报错如下:
iptizer@machine:~/src/infra$ terraform12 apply
[...]
Error: Invalid function argument
on nacls.tf line 19, in resource "aws_network_acl" "networks":
19: subnet_ids = concat(data.aws_subnet_ids.private.ids, data.aws_subnet_ids.public.ids)
|----------------
| data.aws_subnet_ids.private.ids is set of string with 3 elements
Invalid value for "seqs" parameter: all arguments must be lists or tuples; got
set of string.
Bug.. 还是我错过了什么?
【问题讨论】:
-
这看起来像是 Terraform 核心中的一个有趣的错误,
concat()仅适用于列表而不是集合。我看不出它不能在集合而不是列表上工作的明显原因(除了类型检查),但你可能想在github.com/hashicorp/terraform/issues 上提出这个问题 -
确实很奇怪。在深入研究时,您可以尝试将结果投射到列表 (terraform.io/docs/configuration/functions/tolist.html)。
标签: terraform