AWS VPC 架构图:正确画出子网、路由表和 NAT

VPC 架构图应说明互联网能访问什么、私有资源如何出网:一个包含子网、路由表、NAT 网关和端点的双可用区示例。

2026/10/22

AWS VPC 架构图:正确画出子网、路由表和 NAT

大多数 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 的数据处理费用。

图如下:

AWS VPC 架构图,10.0.0.0/16 跨两个可用区:用户通过互联网网关访问 ALB;私有子网中的应用服务器使用各可用区的 NAT 网关和一个 S3 端点;数据库运行在数据子网中。

19 个组件 · 10 个连接

在 Archboard 中打开
图表内容
  • 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:ALB 位于公有子网,应用服务器和数据库位于私有子网,每个可用区一个 NAT 网关,另有一个用于 S3 的网关端点。

保持可读性的布局规则

可用区按列,层按行

把可用区并排放置,各层从上到下排列:公有层在最上面,然后是应用层,最后是数据层。这样,可达性可以从上往下读,某一列缺少的资源也能一眼看出来。

把互联网网关放在边界上

互联网网关附加到整个 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 中绘制

  1. 使用 Google 或 GitHub 登录,并新建一张图。
  2. 从网络节点包中添加一个 VPC 框,并把它的 CIDR 设为 10.0.0.0/16。
  3. 在 VPC 内为两个可用区各添加一个基础节点包中的 框架,并在每个可用区内添加网络节点包中的 子网 框,写上各自的 CIDR。
  4. 在 VPC 外添加一个网络节点包中的 互联网 节点,并在 VPC 边界上添加一个 路由器 作为互联网网关。
  5. 从云节点包中为 ALB 添加一个 云负载均衡器,为应用服务器添加 计算实例 节点,为 RDS 主实例和备用实例添加 托管数据库 节点。NAT 网关使用网络节点包中的 路由器 节点。
  6. 连接端口,并在连线上标注端口和来源安全组。
  7. 添加一个基础节点包中的 表格 来列出路由表,再添加一个 便签 记录“每个可用区一个 NAT”之类的决策。

完整示例超出了 Free 套餐的 15 个图表节点,所以这么详细的 VPC 架构图更适合 Pro。多区域设计请参阅 AWS 多区域架构图,更多网络模式请查看 网络用例页面。

常见问题

每个子网都要画在图上吗? 在 VPC 设计图上,要画,因为可达性取决于子网和路由表。在应用架构图上,通常每层一个框就够了。

每个可用区都需要一个 NAT 网关吗? 使用可用区 NAT 网关时需要,这样各可用区才能彼此独立。只用一个可用区 NAT 网关可以省钱,但会让所有可用区的出站流量都依赖同一个可用区,还会产生跨可用区数据传输费用。区域 NAT 网关是单个网关,会扩展到每个有工作负载的可用区。无论选哪种,都要写在图上。

VPC 端点应该画在哪里? 网关端点(S3 和 DynamoDB)是路由表中的目标,所以把它们画在 VPC 边界上,并在路由表中注明。接口端点是子网中的网络接口,所以把它们画在承载它们的子网内。

图上画安全组还是网络 ACL? 安全组一律写成连线标签。网络 ACL 只作为子网上的注释,而且只在你改过默认设置时才写。

能从我的 AWS 账户生成这张图吗? Archboard 不会读取你的 AWS 账户。画出你想要的设计,然后在评审时与控制台的资源地图对照。

免费开始 — 1 个席位,无需信用卡。

相关文章

← 返回博客

一分钟打开画布

使用 Google 或 GitHub 登录。单席位免费,团队加入后再升级。