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 到私有子网
相关推荐
李子琪。3 小时前
云计算虚拟化技术全解析:从理论到实践
linux·centos·云计算
AOwhisky3 小时前
Kubernetes(K8s)学习笔记(第十四期):集群存储与有状态应用(下篇):StatefulSet 有状态应用管理
redis·笔记·mysql·云原生·kubernetes·云计算·k8s
AOwhisky4 小时前
kubernetes(K8s)学习笔记:第八期与第九期核心知识点自测与详解
笔记·云原生·kubernetes·云计算·k8s·集群·网络策略
威联通网络存储19 小时前
基于TS-h3087XU-RP的大型成套空分设备DCS历史趋势数据治理
aws
spider_xcxc1 天前
MySQL备份实战:从小白到熟练使用Percona XtraBackup
mysql·云计算·运维开发·dba
主机哥哥2 天前
2026年腾讯云秒杀活动抢购攻略
云计算·腾讯云
花千烬2 天前
crictl info 连不上 containerd 怎么办?endpoint、socket 与权限一次查清
云计算
AKAMAI5 天前
每百万 Token 成本砍六成,出海 AI 团队开始重算推理这笔账
人工智能·云计算
A小辣椒16 天前
AWS Clould Support Engineer就职面试题
aws
tiancaijiben18 天前
阿里云Kubernetes集群托管完全指南:从创建到生产级运维
云计算