大多数 VPC 架构图只在项目开始时画一次,而且是照着控制台的资源地图抄下来的。图上有每一个资源,却回答不了大家真正关心的任何问题:互联网能访问这个数据库吗?为什么应用能下载软件包,却接收不了连接?一个可用区宕机时,什么会出问题?
本文介绍如何画出能回答这些问题的 AWS VPC 架构图。我们以一种常见布局为例——一个跨两个可用区、包含公有子网、私有子网和数据子网的 VPC——逐一讲解决定可达性的几个部分:子网、路由表、网关、端点和安全组。
VPC 架构图必须回答的问题
- 互联网能访问什么? 只有公有子网中、具有通往互联网网关路由的资源,而且前提是它们的安全组允许。
- 私有资源如何访问外部? 通常通过 NAT 网关,有时通过 VPC 端点,有时根本不出网。
- 流量如何在各层之间流动? 从负载均衡器到应用,从应用到数据库,以及走哪些端口。
- 一个可用区故障时会怎样? 每个可用区中有哪些资源,哪些是共享的。
如果图让其中任何一个问题难以回答,它就需要更少的资源、更多的结构。
基本组成部分
| 组成部分 | 是什么 | 怎么画 |
|---|---|---|
| VPC | 你的私有网络,带有一个 CIDR 块,例如 10.0.0.0/16 |
最外层的框,标签中写 CIDR |
| 可用区 | 区域内一个相互隔离的位置 | VPC 内的一列或一个框 |
| 子网 | VPC CIDR 中的一段地址范围,只属于一个可用区 | 所在可用区内的一个框,标签中写 CIDR |
| 路由表 | 把子网流量发往目标的规则 | 每个子网层一张小表格 |
| 互联网网关 | VPC 通往互联网的大门 | 画在 VPC 边界上,朝向互联网一侧 |
| NAT 网关 | 让私有子网能够发起出站连接 | 可用区 NAT 网关:位于公有子网内,每个可用区一个。区域 NAT 网关:所有可用区共用一个网关,不需要子网 |
| VPC 端点 | 通往 AWS 服务的私有路径 | S3 和 DynamoDB 使用网关端点;接口端点位于子网内 |
| 安全组 | 作用于每个网络接口的有状态防火墙 | 端口规则写成连线标签,而不是画成方框 |
| 网络 ACL | 作用于子网的无状态过滤器 | 仅在使用自定义规则时,在子网上加一条注释 |
有两个事实决定了整个布局。子网只属于一个可用区,所以在图上,子网永远不能横跨多个可用区列。标准(可用区)NAT 网关也只位于一个可用区:如果唯一的 NAT 网关在 AZ a,那么 AZ a 故障时,AZ b 的私有子网就会失去出站访问能力。自 2025 年 11 月起,AWS 还提供区域 NAT 网关,它会自动跨可用区扩展,也不需要公有子网;本例使用的是可用区 NAT 网关。
示例:两个可用区,三个层
VPC 使用 10.0.0.0/16,分布在两个可用区,每个可用区三个子网:
| 层 | AZ a | AZ b | 0.0.0.0/0 的路由 |
|---|---|---|---|
| 公有 | 10.0.0.0/24 |
10.0.1.0/24 |
互联网网关 |
| 应用(私有) | 10.0.10.0/24 |
10.0.11.0/24 |
同一可用区的 NAT 网关 |
| 数据(私有) | 10.0.20.0/24 |
10.0.21.0/24 |
无 |
每个路由表中还有一条针对 10.0.0.0/16 的 local 路由,让 VPC 内的子网可以互相访问;至于实际允许什么,则由安全组决定。AWS 会在每个子网中保留五个地址,所以一个 /24 可用的地址是 251 个。
各部分的部署位置:
- Application Load Balancer 在两个公有子网中都有节点,接受来自互联网的 HTTPS。
- 应用服务器(EC2 实例或 ECS 任务)运行在两个应用子网中,只接受来自 ALB 安全组的流量。
- RDS PostgreSQL 主实例运行在一个数据子网中,备用实例运行在另一个数据子网中。RDS 要求数据库子网组至少包含两个可用区的子网。
- 每个公有子网中的 NAT 网关 为应用服务器提供出站访问,用于获取更新和调用第三方 API。
- S3 网关端点 让应用服务器无需经过 NAT 网关即可访问 S3,同时还能省下 NAT 的数据处理费用。
图如下:
图表内容
- Users (internet)
- VPC
- Internet gateway
- ALB (nodes in both public subnets)
- AZ a
- AZ b
- public-a
- app-a (private)
- data-a (private)
- public-b
- app-b (private)
- data-b (private)
- NAT gateway a
- NAT gateway b
- App servers a
- App servers b
- RDS PostgreSQL primary
- RDS standby
- Amazon S3
- HTTPS 443
- 8080 from ALB SG
- 0.0.0.0/0
- 5432 from app SG
- 5432
- sync replication (Multi-AZ)
- via S3 gateway endpoint
保持可读性的布局规则
可用区按列,层按行
把可用区并排放置,各层从上到下排列:公有层在最上面,然后是应用层,最后是数据层。这样,可达性可以从上往下读,某一列缺少的资源也能一眼看出来。
把互联网网关放在边界上
互联网网关附加到整个 VPC,而不是某个子网。把它画在 VPC 的框上,位于互联网和公有子网之间。
用表格表示路由,而不是到处画箭头
从每个子网到每个网关都画一条箭头,图就会变成一张蜘蛛网。像上面那样每层一张小路由表,能把同样的信息表达得更准确。只为主要流量路径画箭头。
把安全组规则写在连线上
安全组属于网络接口,而不属于子网,所以不适合用框来表示。改为给连线加标签:HTTPS 443 from internet、8080 from ALB SG、5432 from app SG。这正是大家要找的信息。
把对等连接和 VPN 放在边界上
中转网关、对等连接和 Site-to-Site VPN 把 VPC 连接到其他网络。把它们画在 VPC 边界上,标签中写上远端 CIDR,远端那一侧则放到它自己的图里。
常见错误
- 跨两个可用区的子网。 这种子网不可能存在。每个可用区画一个子网,即使它们一模一样。
- 两个可用区共用一个可用区 NAT 网关,却没有注明。这可能是有意的成本决策;把它写在图上,免得有人以为各可用区彼此独立。
- 把安全组画成嵌套的方框。 安全组可以任意重叠,并且按网络接口生效;嵌套会暗示根本不存在的规则。
- 照搬控制台的资源地图,连每个网络接口和每个路由表关联都画上。这样的图适合审计,用于设计却根本没法读。
- 没有 CIDR。 地址范围重叠正是日后阻碍对等连接的原因。在每个 VPC 和子网框上都写上 CIDR。
在 Archboard 中绘制
- 使用 Google 或 GitHub 登录,并新建一张图。
- 从网络节点包中添加一个 VPC 框,并把它的 CIDR 设为
10.0.0.0/16。 - 在 VPC 内为两个可用区各添加一个基础节点包中的 框架,并在每个可用区内添加网络节点包中的 子网 框,写上各自的 CIDR。
- 在 VPC 外添加一个网络节点包中的 互联网 节点,并在 VPC 边界上添加一个 路由器 作为互联网网关。
- 从云节点包中为 ALB 添加一个 云负载均衡器,为应用服务器添加 计算实例 节点,为 RDS 主实例和备用实例添加 托管数据库 节点。NAT 网关使用网络节点包中的 路由器 节点。
- 连接端口,并在连线上标注端口和来源安全组。
- 添加一个基础节点包中的 表格 来列出路由表,再添加一个 便签 记录“每个可用区一个 NAT”之类的决策。
完整示例超出了 Free 套餐的 15 个图表节点,所以这么详细的 VPC 架构图更适合 Pro。多区域设计请参阅 AWS 多区域架构图,更多网络模式请查看 网络用例页面。
常见问题
每个子网都要画在图上吗? 在 VPC 设计图上,要画,因为可达性取决于子网和路由表。在应用架构图上,通常每层一个框就够了。
每个可用区都需要一个 NAT 网关吗? 使用可用区 NAT 网关时需要,这样各可用区才能彼此独立。只用一个可用区 NAT 网关可以省钱,但会让所有可用区的出站流量都依赖同一个可用区,还会产生跨可用区数据传输费用。区域 NAT 网关是单个网关,会扩展到每个有工作负载的可用区。无论选哪种,都要写在图上。
VPC 端点应该画在哪里? 网关端点(S3 和 DynamoDB)是路由表中的目标,所以把它们画在 VPC 边界上,并在路由表中注明。接口端点是子网中的网络接口,所以把它们画在承载它们的子网内。
图上画安全组还是网络 ACL? 安全组一律写成连线标签。网络 ACL 只作为子网上的注释,而且只在你改过默认设置时才写。
能从我的 AWS 账户生成这张图吗? Archboard 不会读取你的 AWS 账户。画出你想要的设计,然后在评审时与控制台的资源地图对照。