模板链接:https://github.com/aws-cloudformation/aws-cloudformation-templates
该AWS CloudFormation YAML 脚本用于创建一个高可用、安全的 VPC(Virtual Private Cloud)架构 ,包含 公有子网(Public Subnets) 和 私有子网(Private Subnets) ,并通过 托管 NAT 网关(Managed NAT Gateway) 为私有子网中的资源提供出向互联网访问能力。这是 AWS 推荐的标准生产级网络架构。
下面我将从 整体架构 → 参数/映射 → 核心资源 → 输出 四个层面详细解析。
🏗 一、整体架构概览
该模板创建以下核心组件:
Region
└── VPC (10.0.0.0/16)
├── 公有子网 0 (10.0.0.0/24) → AZ0
├── 公有子网 1 (10.0.1.0/24) → AZ1
├── 私有子网 0 (10.0.2.0/24) → AZ0
├── 私有子网 1 (10.0.3.0/24) → AZ1
├── Internet Gateway (IGW)
├── 公共路由表(关联两个公有子网,指向 IGW)
├── 两个 NAT Gateway(分别部署在两个公有子网中)
├── 两个私有路由表(分别关联私有子网,指向对应 NAT Gateway)
└── 网络 ACL(宽松策略,允许所有流量进出公有子网)
✅ 高可用设计:跨两个可用区(AZ),避免单点故障。
📥 二、参数(Parameters)与映射(Mappings)
1. Parameters
VPCName:
Description: The name of the VPC being created.
Type: String
Default: VPC Public and Private with NAT
- 用户可自定义 VPC 的名称标签(如
Prod-VPC),默认值为"VPC Public and Private with NAT"。
2. Mappings
Mappings:
SubnetConfig:
VPC: { CIDR: 10.0.0.0/16 }
Public0: { CIDR: 10.0.0.0/24 }
Public1: { CIDR: 10.0.1.0/24 }
Private0: { CIDR: 10.0.2.0/24 }
Private1: { CIDR: 10.0.3.0/24 }
- 使用
Mappings预定义 CIDR 块,便于维护和避免冲突。 - VPC 总网段:
10.0.0.0/16(65,536 个 IP) - 每个子网:
/24(256 个 IP,实际可用约 251 个)
💡 优点:修改 CIDR 只需改一处,不影响逻辑。
🧱 三、核心资源详解
1. VPC 本身
VPC:
Type: AWS::EC2::VPC
Properties:
EnableDnsSupport: "true" # 支持 DNS 解析
EnableDnsHostnames: "true" # 实例可获得 DNS 主机名(如 ip-10-0-0-10.ec2.internal)
CidrBlock: !FindInMap [SubnetConfig, VPC, CIDR]
Tags: ...
2. 子网(Subnets)
- 公有子网(PublicSubnet0/1) :
MapPublicIpOnLaunch: "true":在此子网启动的 EC2 实例自动分配公网 IP。- 用于部署 面向互联网的资源(如 ALB、跳板机、NAT Gateway)。
- 私有子网(PrivateSubnet0/1) :
- 无公网 IP,无法直接从互联网访问。
- 用于部署 数据库、应用服务器等敏感资源。
🌐 AZ 分布 :使用
!GetAZs自动选择当前 Region 的前两个可用区(如 us-east-1a, us-east-1b)。
3. Internet Gateway(IGW)
InternetGateway: AWS::EC2::InternetGateway
GatewayToInternet: AWS::EC2::VPCGatewayAttachment # 将 IGW 附加到 VPC
- IGW 是 VPC 与互联网之间的入口/出口。
- 公有子网通过 IGW 直接访问互联网。
4. 路由(Routing)
公共路由表
PublicRouteTable → Route: 0.0.0.0/0 → InternetGateway
- 所有公有子网流量 → 通过 IGW 出访互联网。
私有路由表(高可用 NAT)
PrivateRouteTable0 → 0.0.0.0/0 → NATGateway0 (在 PublicSubnet0)
PrivateRouteTable1 → 0.0.0.0/0 → NATGateway1 (在 PublicSubnet1)
- 私有子网流量 → 通过 同 AZ 的 NAT Gateway 出访互联网。
- 为什么两个 NAT?
- 如果 AZ0 故障,PrivateSubnet1 仍可通过 NATGateway1 访问互联网 → 跨 AZ 容灾。
⚠️ 注意:NAT Gateway 只支持出向流量,不能用于入向(如 SSH 到私有实例需通过跳板机)。
5. NAT Gateway + EIP
ElasticIP0/ElasticIP1: AWS::EC2::EIP
NATGateway0/NATGateway1: AWS::EC2::NatGateway
- 每个 NAT Gateway 需要一个 弹性公网 IP(EIP) 作为出向地址。
- AWS 托管 NAT Gateway(比自建 NAT 实例更可靠、免运维)。
💰 费用提示:每个 NAT Gateway $0.045/小时 + 数据处理费。
6. 网络安全:Network ACL(NACL)
PublicNetworkAcl:
Inbound: 允许 0.0.0.0/0 所有端口(协议 -1 = all)
Outbound: 允许 0.0.0.0/0 所有端口
- 注意 :这是一个非常宽松的 NACL(仅用于公有子网)。
- 实际生产中建议收紧(如只开 80/443)。
- NACL 是无状态的(需同时配置入站+出站规则)。
🔒 安全最佳实践:
- NACL 作为第一道粗粒度防线(如防 DDoS)
- 安全组(Security Group) 作为细粒度、有状态的防火墙(推荐主要用安全组)
7. 资源关联
SubnetRouteTableAssociation:将子网绑定到对应路由表。SubnetNetworkAclAssociation:将子网绑定到 NACL。
📤 四、输出(Outputs)与跨栈引用
Outputs:
VPCId: ... Export: Name: ${AWS::Region}-${AWS::StackName}-VPC
PublicSubnet0: ... Export: Name: ...-PublicSubnet0
...
- 所有关键资源(VPC ID、子网 ID 等)都通过
Export导出。 - 其他 CloudFormation 堆栈可通过
Fn::ImportValue引用这些值,实现模块化部署。
✅ 示例:另一个模板可这样引用私有子网:
SubnetId: !ImportValue us-east-1-my-vpc-stack-PrivateSubnet0
🔐 五、安全与高可用总结
| 特性 | 实现方式 |
|---|---|
| 网络隔离 | 公有/私有子网分离,私有子网无公网 IP |
| 出向互联网 | 通过高可用 NAT Gateway(跨 AZ) |
| 入向安全 | 公有子网由安全组控制(模板未显式创建,但会使用 VPC 默认安全组) |
| 高可用 | 跨两个 AZ 部署子网 + NAT Gateway |
| DNS 支持 | 启用 EnableDnsHostnames,方便内部服务发现 |
⚠️ 六、注意事项与改进建议
-
NACL 过于宽松
- 当前公有子网 NACL 允许所有流量,生产环境应限制端口(如只开 80/443/22)。
-
缺少自定义安全组
- 模板依赖 VPC 默认安全组(允许所有出站,拒绝所有入站)。
- 建议显式创建安全组并关联到后续资源。
-
未启用 VPC 流日志(Flow Logs)
- 生产环境建议开启,用于审计和排错。
-
CIDR 硬编码
- 虽然用了 Mappings,但若需灵活 CIDR,可改为 Parameters。
-
成本优化
- 如果不需要跨 AZ 高可用,可只创建一个 NAT Gateway(节省 50% 成本)。
✅ 七、典型使用场景
- 标准 Web 应用架构 :
- 公有子网:ALB + 跳板机
- 私有子网:应用服务器(Auto Scaling) + RDS 数据库
- 微服务后端:所有服务部署在私有子网,通过 NAT 访问外部 API 或 S3。
- 合规要求:数据库等敏感资源必须位于无公网访问的私有网络。
🧩 总结
这是一个 符合 AWS 最佳实践的、高可用、安全的 VPC 基础架构模板 ,适用于绝大多数生产环境。它通过 公有/私有子网分离 + 托管 NAT Gateway + 跨 AZ 设计,在安全性、可用性和易用性之间取得良好平衡。
如果你计划在此 VPC 上部署应用,下一步通常是:
- 创建安全组(允许 ALB → 应用服务器 80/443)
- 部署 ALB 到公有子网
- 部署 EC2/ECS 到私有子网
- (可选)部署 RDS 到私有子网