资讯动态

基于 terraform-provider-aws 的多区域 VPC 网络搭建示例:模块化复用的完整实战

发布时间:2026/9/17 6:51:52 来源:尧图企业网站定制
基于 terraform-provider-aws 的多区域 VPC 网络搭建示例模块化复用的完整实战【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws导读本文围绕 terraform-provider-aws 仓库自带的 examples/networking 示例展开讲解如何用 Terraform 与 AWS Provider 在两个 AWS 区域各创建一个 VPC并在每个 VPC 内基于两个不同可用区分别创建子网、路由表与安全组的完整流程。通过阅读本文你将掌握该示例的目录结构、模块分层、CIDR 自动划分逻辑以及具体的执行步骤并理解如何通过 Terraform 模块机制用不同参数复用同一套网络资源定义为多区域、多可用区的生产网络规划提供可直接借鉴的模板。示例目标与整体架构按照 examples/networking/README.md 的说明该示例的用途非常聚焦创建 AWS VPC 资源在两个区域各创建一个 VPC并在每个 VPC 中、两个不同的可用区各创建两个子网。同时它也是一份模块复用的演示通过子模块用不同的参数多次实例化同一套资源定义。整个网络拓扑可以概括为区域层us-east-1、us-west-2两个区域各部署一套 VPC可用区层每个区域内的 VPC 下选择当前 AWS 账户支持的前两个可用区names[0]、names[1]各创建一个子网关联资源每个子网配有独立路由表与路由表关联每个 VPC 配有互联网网关区域级还创建了两个安全组分别放开区域内互通与整个内网互通。这种顶层模块编排 区域容器模块 子网原子模块的三层结构正是大规模 Terraform 网络基建中常见的组织方式。目录结构与模块划分示例位于仓库的 examples/networking 目录其结构如下examples/networking/ ├── regions.tf # 顶层实例化两个 region 模块 ├── variables.tf # 顶层base_cidr_block 变量 ├── versions.tf # 顶层Terraform 版本约束 ├── region/ # 区域容器模块每个区域实例化一次 │ ├── vpc.tf # VPC 互联网网关 │ ├── subnets.tf # 通过数据源取可用区实例化两个 subnet 模块 │ ├── security_group.tf # 区域级安全组 │ ├── outputs.tf # vpc_id / 子网 ID 输出 │ ├── variables.tf # region、base_cidr_block、region_numbers │ ├── versions.tf │ └── terraform.template.tfvars └── subnet/ # 子网原子模块每区域实例化两次 ├── subnet.tf # 子网 路由表 路由表关联 ├── outputs.tf ├── variables.tf # vpc_id、availability_zone、az_numbers ├── versions.tf └── terraform.template.tfvarsregion模块一个区域内全部网络资源的容器顶层对每个目标区域实例化一次subnet模块代表某个可用区内的一个子网region 模块内对前两个可用区各实例化一次。顶层编排一次声明、两区域复用顶层文件 regions.tf 是最直观的模块复用示范——同一套region模块被实例化两次仅传入不同的region值module us-east-1 { source ./region region us-east-1 base_cidr_block var.base_cidr_block } module us-west-2 { source ./region region us-west-2 base_cidr_block var.base_cidr_block }顶层的 variables.tf 只声明了一个变量作为整个网络的 CIDR 规划起点variable base_cidr_block { default 10.0.0.0/22 }而 versions.tf 声明了 Terraform 版本约束 0.12——这意味着该示例依赖 Terraform 0.12 及以上版本提供的cidrsubnet、模块命名与数据源引用语法。从 AWS Provider 的角度看module内虽然定义了provider aws见下文 region 模块但区域切换完全由模块参数驱动这正是多区域部署的标准做法同一份代码不同 region 入参产出多套隔离的网络栈。region 模块区域级网络资源容器变量与 Provider 配置region/variables.tf 中除传入的region与base_cidr_block外还内置了一个region_numbers映射用于把区域名映射为 CIDR 划分的序号variable region { description The name of the AWS region to set up a network within } variable base_cidr_block {} provider aws { region var.region } variable region_numbers { default { us-east-1 0 us-west-1 1 us-west-2 2 eu-west-1 3 } }注意provider aws直接写在模块内部并通过var.region指定区域。这意味着每个 region 模块实例都绑定自己的 AWS 区域顶层无需重复配置 provider。若需要不同区域使用不同凭证或自定义端点可参考仓库 internal/conns/config.go 中对 AWS 客户端配置的集中管理思路。VPC 与互联网网关region/vpc.tf 创建了 VPC 和互联网网关并使用cidrsubnet函数按区域序号切分 CIDRresource aws_vpc main { cidr_block cidrsubnet(var.base_cidr_block, 4, var.region_numbers[var.region]) } resource aws_internet_gateway main { vpc_id aws_vpc.main.id }以base_cidr_block 10.0.0.0/22为例cidrsubnet(10.0.0.0/22, 4, 0)会为us-east-1切出10.0.0.0/26为us-west-2序号 2切出10.0.2.0/26。这样两个区域的 VPC CIDR 天然互不重叠为后续区域间互通如 VPC Peering、Transit Gateway预留了清晰的地基。可用区发现与子网编排region/subnets.tf 是数据源 模块复用的典型组合data aws_availability_zones all {} module primary_subnet { source ../subnet vpc_id aws_vpc.main.id availability_zone data.aws_availability_zones.all.names[0] } module secondary_subnet { source ../subnet vpc_id aws_vpc.main.id availability_zone data.aws_availability_zones.all.names[1] }关键点通过aws_availability_zones数据源对应aws_availability_zones数据源动态获取当前账户在该区域实际支持的可用区列表而不是硬编码可用区名称取names[0]与names[1]前两个可用区作为主、次子网的可用区同一个subnet模块被实例化两次仅传入不同的availability_zone再次体现一套定义、多参数复用。区域级安全组region/security_group.tf 定义了两种安全组resource aws_security_group region { name region description Open access within this region vpc_id aws_vpc.main.id ingress { from_port 0 to_port 0 protocol -1 cidr_blocks [aws_vpc.main.cidr_block] } } resource aws_security_group internal-all { name internal-all description Open access within the full internal network vpc_id aws_vpc.main.id ingress { from_port 0 to_port 0 protocol -1 cidr_blocks [var.base_cidr_block] } }二者的差异值得注意region安全组cidr_blocks取当前 VPC 的cidr_block即只允许本区域内的流量进入internal-all安全组cidr_blocks取base_cidr_block整个基础网段即允许全部区域含未来新增区域内网流量进入。两者都以protocol -1所有协议、端口范围0-0全部端口开放入站因此仅适合作为演示/内部环境的宽松网络策略生产环境应收紧为按服务端口放行。仓库 docs/resource-tagging.md 与 docs/resource-filtering.md 还提示了在生产中为资源添加标签并基于标签过滤管理的实践。模块输出region/outputs.tf 向上层暴露了三个关键标识output vpc_id { value aws_vpc.main.id } output primary_subnet_id { value module.primary_subnet.subnet_id } output secondary_subnet_id { value module.secondary_subnet.subnet_id }它同时演示了输出透传primary_subnet_id直接引用子模块module.primary_subnet.subnet_id的输出。顶层在terraform apply后即可通过module.us-east-1.vpc_id、module.us-west-2.primary_subnet_id等表达式拿到全部资源标识。subnet 模块可用区内的原子资源单元子网、路由表与关联subnet/subnet.tf 定义了三个相互关联的资源resource aws_subnet main { cidr_block cidrsubnet(data.aws_vpc.target.cidr_block, 2, var.az_numbers[data.aws_availability_zone.target.name_suffix]) vpc_id var.vpc_id availability_zone var.availability_zone } resource aws_route_table main { vpc_id var.vpc_id } resource aws_route_table_association main { subnet_id aws_subnet.main.id route_table_id aws_route_table.main.id }子网 CIDR 的计算逻辑是示例中最精巧的部分在当前 VPC 的 CIDR 基础上再切分两级newbits 2并按可用区字母后缀映射的序号取块。沿用上例若 VPC 是10.0.0.0/26则子网被切为10.0.0.0/28可用区 a与10.0.0.16/28可用区 b互不重叠且总量可控。数据源与可用区序号映射subnet/variables.tf 通过两个数据源实现自描述式的子网划分variable vpc_id { } variable availability_zone { } data aws_availability_zone target { name var.availability_zone } data aws_vpc target { id var.vpc_id } variable az_numbers { default { a 0 b 1 c 2 d 3 e 4 f 5 g 6 h 7 i 8 j 9 k 10 l 11 m 12 n 13 } }其工作流程为传入vpc_id后通过aws_vpc数据源subnet/variables.tf 内data aws_vpc target取到该 VPC 的cidr_block作为子网切分的上级网段传入availability_zone后通过aws_availability_zone数据源取到name_suffix如us-east-1a的a用az_numbers映射把字母后缀转为数字序号作为cidrsubnet的第三个参数。由于 AWS 可用区后缀在账户间存在差异同一区域不同账户的可用区字母可能不同基于数据源动态推导而不是硬编码数字序号是该示例保证可移植性的核心设计。输出subnet/outputs.tf 只有一个输出供 region 模块透传output subnet_id { value aws_subnet.main.id }本地变量文件与运行方式示例提供了 region/terraform.template.tfvars 与 subnet/terraform.template.tfvars 两个模板变量文件以terraform.template.tfvars命名意在提示使用者复制后按需修改。其中 region 模块的模板内容为base_cidr_block 10.0.0.0/16 region us-west-2注意这里把base_cidr_block放大为10.0.0.0/16——更大的地址空间意味着更多可用的子网数量/16切 4 位得到20个/20区域块每个/20再切 2 位得到 4 个/22子网块适合按多区域 × 多可用区 × 预留容量的思路规划。示例中还给出了region_numbers的完整取值us-east-1、us-west-1、us-west-2、eu-west-1如需扩展到其他区域应同步补充该映射。执行步骤在确认已配置 AWS 凭证环境变量或~/.aws/credentials的前提下按以下步骤运行# 1. 进入示例目录 cd examples/networking # 2. 初始化下载 AWS Provider 插件 terraform init # 3. 查看将要创建的资源清单 terraform plan # 4. 应用变更创建两套区域网络 terraform apply # 5. 查看两套 VPC 与子网 ID terraform output由于示例对 AWS Provider 的引用遵循仓库根目录 versions.tf 中声明的 provider 依赖约束terraform init会依据 lock 文件解析并锁定可用的 AWS Provider 版本。执行terraform plan时应能看到两套aws_vpc、两套aws_internet_gateway、四套aws_subnet及对应路由表、安全组等资源。若需要清理测试环境直接执行terraform destroy即可按依赖顺序回收全部资源。设计要点小结综合整个示例可以提炼出以下可直接复用的设计模式设计点实现位置说明多区域复用regions.tf同一 region 模块按区域名实例化多次模块分层region / subnet 两级目录区域级容器 可用区级原子单元区域 CIDR 自动划分region/vpc.tfcidrsubnetregion_numbers映射子网 CIDR 自动划分subnet/subnet.tf在 VPC CIDR 内再切分按可用区字母序号取块可用区动态发现region/subnets.tfaws_availability_zones数据源取前两个可用区可用区后缀解析subnet/variables.tfaws_availability_zone数据源的name_suffix输出透传region → subnet 输出链顶层通过module.name.output获取资源 ID这套结构体现了 terraform-provider-aws 生态中网络编排的常见最佳实践用数据源消除硬编码、用函数消除手工算 CIDR、用模块消除重复代码。开发者可以此为基础加入aws_subnet的标签管理、VPC 流日志、NAT 网关、VPC Peering 等能力快速扩展为一套面向多区域生产的网络基座。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价