2. AWS核心网络与计算基础

要在一台EC2上跑起高可用Web业务,先得把“网络地基”和“计算单元”这两件事同时想清楚。AWS把网络抽象成VPC,把计算抽象成EC2,而连接两者的关键,是子网、路由表、安全组和AMI。本节按“先划网络、再放实例、最后放行流量”的顺序,把这条链路讲透。

VPC:先定地址空间,再谈可用区

VPC(Virtual Private Cloud)是你在AWS里的私有网络,核心参数是CIDR网段。示例中我们选 10.0.0.0/16,它提供 65536 个地址,足够划分多个子网。VPC本身是区域级资源,但子网是可用区级资源——这意味着高可用必须把子网分散到至少两个可用区(AZ)。

规划时建议按“每AZ一组、公私分离”来切分。例如:

  • 公有子网 A:10.0.1.0/24(AZ-a),承载ALB和NAT网关
  • 公有子网 B:10.0.2.0/24(AZ-b),承载ALB和NAT网关
  • 私有子网 A:10.0.11.0/24(AZ-a),承载Web/应用EC2
  • 私有子网 B:10.0.12.0/24(AZ-b),承载Web/应用EC2

每个子网预留5个地址给AWS内部使用(网络地址、VPC路由器、DNS、保留、广播),所以 /24 实际可用251个。私有子网里的EC2默认没有公网IP,出网必须依赖NAT网关,这是安全基线。

路由表:决定“包往哪走”

路由表是子网的“导航仪”。每个子网必须关联一张路由表,路由表里每条路由由“目标网段 + 下一跳”组成。公有子网的路由表要有一条 0.0.0.0/0 → Internet Gateway,私有子网则要有一条 0.0.0.0/0 → NAT Gateway。

这里有个常见误区:NAT网关必须放在公有子网,并绑定弹性IP,私有子网才能通过它访问外网。如果私有子网路由表指向的是另一个私有子网里的NAT,流量出不去。判断方法很简单:在私有子网EC2上执行 curl -I https://aws.amazon.com,若超时,先查路由表下一跳是否指向公有子网中的NAT网关。

安全组:有状态的虚拟防火墙

安全组作用于实例的弹性网卡(ENI),是有状态的:你放行入站80端口,出站响应会自动放行,不需要再写一条出站规则。安全组只支持允许规则,不支持拒绝,所以“默认拒绝、按需放行”是它的工作方式。

一个典型的三层放行策略如下:

层级安全组入站规则来源
ALBsg-alb80, 4430.0.0.0/0
Web EC2sg-web80sg-alb
SSH 管理sg-web22公司出口IP/32

注意第二行:来源写的是安全组ID而不是CIDR,这叫“安全组引用”。它比写IP段更安全,因为只有挂载了sg-alb的实例才能访问Web EC2的80端口。SSH来源务必写具体IP,不要用 0.0.0.0/0。

EC2实例类型:按负载选族

实例类型命名如 m5.large,由“族+代次+规格”组成。Web业务常用三类:

  • 通用型(M/T):CPU与内存均衡,适合Web前端、应用服务器。示例选 t3.medium(2 vCPU、4 GiB),突发性能实例,适合流量波动场景。
  • 计算优化型(C):如 c5.large,适合高并发请求处理、视频转码。
  • 内存优化型(R):如 r5.large,适合缓存、数据库类负载。

选择时先看CPU积分模式:t3 默认是“无限模式”,积分耗尽后仍可超用但会产生额外费用;若业务持续高负载,应直接选 m5 或 c5,避免积分耗尽导致性能骤降。示例中Web层用 t3.medium 起步,压测后若CPU持续高于60%,再升到 m5.large。

AMI选择:决定“开机时是什么系统”

AMI(Amazon Machine Image)是实例的模板,包含操作系统、预装软件和根卷快照。选择AMI时关注三点:

  1. 来源:优先用AWS官方Amazon Linux 2023或Ubuntu LTS,安全更新及时;自定义AMI要定期重建。
  2. 架构:x86_64 兼容性最好;arm64(Graviton)性价比高,但需确认应用支持。
  3. 根卷类型:gp3 是默认推荐,示例给Web层配 30 GiB gp3,IOPS 3000,吞吐 125 MiB/s,足够中小型Web使用。

启动实例时,AMI决定初始状态,用户数据(User Data)决定开机后自动执行什么。示例中在User Data里写入安装Nginx并启动的命令,实例首次启动后即可提供HTTP服务,无需手动登录。

VPC 10.0.0.0/16 — 双可用区高可用网络拓扑 VPC 可用区 A (AZ-a) 公有子网 10.0.1.0/24 Internet Gateway 0.0.0.0/0 出口 NAT Gateway 弹性IP绑定 私有子网 10.0.11.0/24 EC2 Web 实例 t3.medium · Amazon Linux 2023 · gp3 30GiB 安全组 sg-web 入站 80 ← sg-alb · 22 ← 管理IP/32 路由表 rtb-private-a 0.0.0.0/0 → NAT Gateway 可用区 B (AZ-b) 公有子网 10.0.2.0/24 Internet Gateway 0.0.0.0/0 出口 NAT Gateway 弹性IP绑定 私有子网 10.0.12.0/24 EC2 Web 实例 t3.medium · Amazon Linux 2023 · gp3 30GiB 安全组 sg-web 入站 80 ← sg-alb · 22 ← 管理IP/32 路由表 rtb-private-b 0.0.0.0/0 → NAT Gateway Application Load Balancer (sg-alb) 跨 AZ 分发 · 入站 80/443 ← 0.0.0.0/0 公有子网 私有子网 ALB → Web Web → NAT 出网

把参数串起来:一次可复现的启动检查

假设你已按上述规划建好VPC和子网,接下来用以下顺序验证:

# 1. 确认私有子网路由表指向NAT
aws ec2 describe-route-tables --filters "Name=association.subnet-id,Values=subnet-0a1b2c3d" \
  --query "RouteTables[].Routes[?DestinationCidrBlock=='0.0.0.0/0'].GatewayId"

# 2. 确认安全组入站规则
aws ec2 describe-security-groups --group-ids sg-0web123 \
  --query "SecurityGroups[].IpPermissions[].{Port:FromPort,Source:UserIdGroupPairs[].GroupId}"

# 3. 在私有子网EC2上验证出网
curl -s -o /dev/null -w "%{http_code}" https://aws.amazon.com
# 期望返回 200;若超时,检查NAT网关状态与路由表

判断标准:路由表查询应返回 nat-xxxxxxxx;安全组80端口来源应为 sg-alb 的ID;curl返回200说明NAT链路通。三项都通过,说明网络层已具备承载高可用Web业务的基础条件。此时再考虑多实例、多AZ的ALB后端组,才是安全的扩展路径。

AMI与实例类型不是一次选定的:先用官方AMI + t3.medium快速验证,压测后再根据CPU、内存、网络指标调整实例族,并用自定义AMI固化已调优的环境,避免每次启动都重复配置。