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 到私有子网
相关推荐
fangcaojushi4 小时前
cos文件存储
云计算·腾讯云
鱼是一只鱼啊4 小时前
ASP.NET Core 集成腾讯云 COS 实现文件上传下载完整指南
云计算·asp.net·腾讯云·文件上传·cos
testpassportcn5 小时前
AWS DVA-C02 考試完整介紹 |AWS Certified Developer Associate 最新考試內容
云计算·aws
sun03225 小时前
【AWS】【secret】Java从AWS Secrets Manager获取指定secret中特定key的值
云计算·aws
予枫的编程笔记5 小时前
【Docker基础篇】从0到1写Dockerfile:FROM/COPY/CMD/ENTRYPOINT指令详解+Hello World实战
人工智能·docker·云计算·dockerfile·容器技术·docker入门·docker实战
henry1010106 小时前
Debian/Ubuntu EC2实例上一键部署WireGuard
ubuntu·云计算·debian·aws
人间打气筒(Ada)6 小时前
k8s:认证、授权、准入控制
云原生·容器·kubernetes·云计算·k8s认证·k8s授权·k8s准入控制
主机哥哥15 小时前
还不会部署OpenClaw?阿里云推出五种OpenClaw快速部署方案
阿里云·云计算
Re.不晚18 小时前
可视化大数据——淘宝母婴购物数据【含详细代码】
大数据·阿里云·云计算