Terraform AWS VPC模块apply后子网ID赋值逻辑咨询
Terraform AWS VPC模块子网CIDR与子网ID的关联逻辑
这个关联完全靠列表索引顺序严格对齐实现,没有额外的CIDR反查逻辑,具体规则如下:
- 你传入模块的
azs、private_subnets、public_subnets三个列表长度必须匹配,模块按下标位置一一映射资源配置:
以给出的3可用区配置为例,索引从0开始对应关系为:- 索引0:可用区
eu-west-1a,对应创建CIDR为10.0.1.0/24的私有子网、CIDR为10.0.101.0/24的公有子网 - 索引1:可用区
eu-west-1b,对应创建CIDR为10.0.2.0/24的私有子网、CIDR为10.0.102.0/24的公有子网 - 索引2:可用区
eu-west-1c,对应创建CIDR为10.0.3.0/24的私有子网、CIDR为10.0.103.0/24的公有子网
- 索引0:可用区
- 模块内部通过Terraform的
count元参数循环创建子网资源,核心逻辑简化后如下:
# 私有子网创建逻辑 resource "aws_subnet" "private" { count = length(var.private_subnets) vpc_id = aws_vpc.this.id cidr_block = var.private_subnets[count.index] availability_zone = var.azs[count.index] # 其余配置:公网IP映射开关、标签、路由表关联等 } # 公有子网创建逻辑 resource "aws_subnet" "public" { count = length(var.public_subnets) vpc_id = aws_vpc.this.id cidr_block = var.public_subnets[count.index] availability_zone = var.azs[count.index] # 其余配置:公网IP映射开关、标签、绑定公网路由表等 }
- 子网ID的输出顺序和传入的CIDR顺序完全一致:循环创建的子网资源会按
count.index顺序存入模块的输出列表,后续引用module.vpc.private_subnets、module.vpc.public_subnets拿到的子网ID列表,第N位的ID就对应当初传入的第N位CIDR创建出的子网,包括NAT网关绑定、路由表关联等所有子网相关的资源关联,都按这个索引顺序完成,不会出现跨CIDR错绑的问题。
注意:如果后续调整配置时在
private_subnets/public_subnets/azs列表中间插入、删除元素,或者打乱列表顺序,Terraform会按新的索引位置匹配资源,导致对应位置的子网被销毁重建,关联关系也会错乱,修改这几个参数时需要保持原有元素的顺序不变。
内容的提问来源于stack exchange,提问作者Swami Viswanadh
相关产品推荐
相关产品推荐

