AWS CloudFormation模板之VPC

模板链接: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,方便内部服务发现

⚠️ 六、注意事项与改进建议

  1. NACL 过于宽松

    • 当前公有子网 NACL 允许所有流量,生产环境应限制端口(如只开 80/443/22)。
  2. 缺少自定义安全组

    • 模板依赖 VPC 默认安全组(允许所有出站,拒绝所有入站)。
    • 建议显式创建安全组并关联到后续资源。
  3. 未启用 VPC 流日志(Flow Logs)

    • 生产环境建议开启,用于审计和排错。
  4. CIDR 硬编码

    • 虽然用了 Mappings,但若需灵活 CIDR,可改为 Parameters。
  5. 成本优化

    • 如果不需要跨 AZ 高可用,可只创建一个 NAT Gateway(节省 50% 成本)。

✅ 七、典型使用场景

  • 标准 Web 应用架构
    • 公有子网:ALB + 跳板机
    • 私有子网:应用服务器(Auto Scaling) + RDS 数据库
  • 微服务后端:所有服务部署在私有子网,通过 NAT 访问外部 API 或 S3。
  • 合规要求:数据库等敏感资源必须位于无公网访问的私有网络。

🧩 总结

这是一个 符合 AWS 最佳实践的、高可用、安全的 VPC 基础架构模板 ,适用于绝大多数生产环境。它通过 公有/私有子网分离 + 托管 NAT Gateway + 跨 AZ 设计,在安全性、可用性和易用性之间取得良好平衡。

如果你计划在此 VPC 上部署应用,下一步通常是:

  1. 创建安全组(允许 ALB → 应用服务器 80/443)
  2. 部署 ALB 到公有子网
  3. 部署 EC2/ECS 到私有子网
  4. (可选)部署 RDS 到私有子网
相关推荐
Johny_Zhao2 天前
OpenClaw安装部署教程
linux·人工智能·ai·云计算·系统运维·openclaw
NineData2 天前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
SaaS_Product7 天前
从实用性与体验角度出发,OneDrive有什么替代品
云计算·saas·onedrive
小扎仙森7 天前
关于阿里云实时语音翻译-Gummy推送WebSocket
websocket·阿里云·云计算
Elastic 中国社区官方博客7 天前
Elastic 公共 roadmap 在此
大数据·elasticsearch·ai·云原生·serverless·全文检索·aws
Shacoray7 天前
OpenClaw 接入阿里云百炼 Coding Plan 指南
阿里云·ai·云计算·qwen3·openclaw·coding plan
TG_yunshuguoji7 天前
阿里云代理商:2026 年阿里云国际站上云接入指南
服务器·阿里云·云计算
阿里云云原生7 天前
阿里云可观测 2026 年 1 月产品动态
阿里云·云计算
TG_yunshuguoji8 天前
亚马逊云代理商:AWS 国际站缺卡新用户创建邮箱怎么选择?
安全·云计算·aws
峰顶听歌的鲸鱼8 天前
Zabbix监控系统
linux·运维·笔记·安全·云计算·zabbix·学习方法