[英]How to combine aws_subnet.prod_subnet.*.id with aws_subnet.prod2_subnet.*.id into a single list
我正在尝试合并所有 su.net 以便能够将 ACL 附加到它们。
我有两个存在不同资源名称的 su.net,所以它迫使我有两个我不想要的 ACL 块。
现在,两个 ACL 块的 ACL su.net_id 块读取为:
resource "aws_network_acl" "prod_public" {
vpc_id = aws_vpc.prod.id
subnet_ids = aws_subnet.prod_public.*.id
}
resource "aws_network_acl" "prod2_public" {
vpc_id = aws_vpc.prod.id
subnet_ids = aws_subnet.prod2_public.*.id
}
这行得通,但我想要一些东西来创建一组 su.net_ids 的列表,这样我就可以成为一个块。
我试过这样的事情,但没有奏效。
resource "aws_network_acl" "prods_public" {
vpc_id = aws_vpc_prod_id
subnet_ids = [aws_subnet.prod_public.*.id, aws_subnet.prod2_public.*.id]
}
我也试过使用 tostring 和 toset 也没有用。
你应该使用concat :
subnet_ids = concat(aws_subnet.prod_public.*.id, aws_subnet.prod2_public.*.id)
因为这些资源都没有使用count
参数,splat 运算符*
在这里是多余的,只需为每个资源引用单个 object 就足够了:
resource "aws_network_acl" "prods_public" {
vpc_id = aws_vpc_prod_id
subnet_ids = [
aws_subnet.prod_public.id,
aws_subnet.prod2_public.id,
]
}
使用旧的 splat 运算符.*
(或其现代等效项[*]
)使 Terraform 将每个 object 转换为包含该 object 的单元素列表,因此在您的示例中,您创建了一个字符串列表列表,而不仅仅是一个列表字符串。
如果您对这些资源使用count
,那么它们的值实际上是列表,因此在这种情况下,将 splat 运算符用于 select 只是每个资源的id
属性是合适的,但您需要使用 function将多个列表组合在一起。 因为su.net_ids
需要一组su.net ID 字符串(su.net 没有有意义的顺序),最清晰的表示方式是使用setunion
function,它将生成一组包含所有不同元素的字符串在所有给定的列表中:
resource "aws_network_acl" "prods_public" {
vpc_id = aws_vpc_prod_id
subnet_ids = setunion(
aws_subnet.prod_public[*].id,
aws_subnet.prod2_public[*].id,
)
}
使用concat
function 也可以,但最终 Terraform 会将其结果转换为一组字符串以传递给su.net_ids
,因此使用concat
可能会误导未来的读者,他们可能会认为这意味着 su. net IDs 在某种程度上很重要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.