如何将两组AWS子网ID合并为单列表以创建单个网络ACL资源
Terraform合并子网ID列表实现单网络ACL关联
要合并aws_subnet.prod_public.*.id和aws_subnet.prod2_public.*.id这两个子网ID列表,直接用Terraform的concat()函数即可,它能将多个一维列表合并成一个新的一维列表,正好满足aws_network_acl的subnet_ids参数要求。
实现代码示例
resource "aws_network_acl" "prod_combined" { vpc_id = aws_vpc.prod.id # 替换为你的目标VPC ID # 用concat合并两个子网ID列表 subnet_ids = concat( aws_subnet.prod_public.*.id, aws_subnet.prod2_public.*.id ) # 以下为ACL规则示例,根据实际业务需求调整 egress { from_port = 0 to_port = 0 protocol = "-1" rule_no = 100 action = "allow" cidr_block = "0.0.0.0/0" } ingress { from_port = 0 to_port = 0 protocol = "-1" rule_no = 100 action = "allow" cidr_block = "0.0.0.0/0" } }
为什么之前的方法无效?
- 直接将两个列表放入数组(比如
[aws_subnet.prod_public.*.id, aws_subnet.prod2_public.*.id])会生成嵌套列表,而subnet_ids需要的是一维列表,Terraform会报错。 tostring()会把整个列表转换成字符串,不符合参数类型要求;toset()虽然能合并元素,但会丢失列表顺序,且如果不需要去重的话,concat()是更直接的选择。
额外注意事项
- 如果其中一组子网可能为空(比如
prod2_public没有创建任何子网),concat()依然能正常工作,只会保留非空的那组ID列表。 - 如果需要去除重复的子网ID(一般不会出现),可以用
distinct(concat(aws_subnet.prod_public.*.id, aws_subnet.prod2_public.*.id))。
内容的提问来源于stack exchange,提问作者cybershady
相关产品推荐
相关产品推荐

