在Terraform AWS Provider中,default_route_table_id与main_route_table_id的区别
主路由表与默认路由表的区别:其实是同一个资源
先给你明确结论:AWS VPC的「主路由表」和「默认路由表」是同一个资源的两种不同叫法,本质没有区别。
具体细节拆解
- 资源本质:当你创建一个VPC时,AWS会自动生成一个路由表,这个路由表就是官方文档里时而提到的「主路由表」(Main Route Table),时而提到的「默认路由表」(Default Route Table)。它的默认行为是:所有未手动关联其他路由表的子网,都会自动使用这个路由表的规则。
- Terraform属性对应:你代码里的
aws_vpc.vpc.main_route_table_id和aws_vpc.vpc.default_route_table_id,输出的其实是同一个ID——你可以在Terraform里加个output验证:
执行output "main_route_table_id" { value = aws_vpc.vpc.main_route_table_id } output "default_route_table_id" { value = aws_vpc.vpc.default_route_table_id }terraform apply后会发现两个值完全一致。
关于你代码里的两个资源
aws_route_table_association:用来手动将子网关联到指定路由表。但其实如果你的子网没有关联其他自定义路由表,默认就会绑定到这个主/默认路由表,所以这部分代码其实可以省略(当然手动明确绑定也没问题)。aws_default_route_table:这是Terraform专门提供的、用来管理VPC默认路由表的资源,用来修改它的路由规则(比如你这里加的0.0.0.0/0指向IGW)。不建议用普通的aws_route_table资源去修改默认路由表,因为可能会和AWS自动管理的状态冲突,aws_default_route_table是更安全的方式。
额外建议
虽然修改默认路由表来实现公有子网是可行的,但更推荐的做法是:创建一个自定义的公有路由表,添加指向IGW的默认路由,然后将需要的子网关联到这个自定义路由表。这样默认路由表可以保持私有(无0.0.0.0/0路由),后续新创建的子网默认会用私有规则,避免意外暴露资源。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

