第 2 章

EC2 实战指南

⏱️ 45 分钟
📝 20 题练习
备考助手

📌 核心知识点

实例类型选择Spot 实例策略预留实例规划常见陷阱

EC2 实战指南

📖 EC2 基础知识

Amazon EC2 (Elastic Compute Cloud) 是 AWS 最核心的计算服务,提供可扩展的虚拟服务器。

📒 官方文档用户指南FAQ定价

EC2 是什么?

EC2 是一个巨大的、基本上无限的服务器农场,您可以按需付费使用。它是 AWS 最老的服务之一(2006 年推出),也是迄今为止 AWS 最重要的服务。几乎所有使用 AWS 的公司都使用 EC2。

EC2 提供以下核心功能:

EC2 核心组件
├── 实例 (Instance) - 虚拟服务器
├── AMI - 机器镜像,包含操作系统和软件
├── 实例类型 - CPU、内存、存储配置
├── 密钥对 - SSH 访问凭证
├── 安全组 - 虚拟防火墙
├── EBS - 持久性块存储
├── Elastic IP - 静态公网 IP
└── 置放组 - 实例放置策略

EC2 实例类型总览(AWS 官方)

看图重点:先按工作负载选系列(c/m/r/g/p/inf),再按代际和尺寸选性价比。

EC2 实例生命周期(AWS 官方)

看图重点:启动、停止、终止是三种不同状态转换,排查“实例不可连接”时要先看生命周期状态。

实例类型详解

EC2 提供多种实例类型,每种优化不同的使用场景。参考 ec2instances.info 获取完整规格对比。

类型前缀优化方向典型用例
t3/t4g通用突发Web 服务器、开发环境
m5/m6i/m7i通用均衡应用服务器、后端服务
c5/c6i/c7i计算优化批处理、游戏服务器、科学建模
r5/r6i/r7i内存优化数据库、内存缓存
i3/i4i存储优化数据仓库、分布式文件系统
p4/p5GPU 加速机器学习训练
g5图形优化视频渲染、机器学习推理
inf1/inf2推理优化机器学习推理

💡 实例类型命名规则:

m5.xlarge
│ │  └── 大小: nano < micro < small < medium < large < xlarge < 2xlarge...
│ └── 代数: 数字越大越新,性价比越高
└── 系列: m=通用, c=计算, r=内存, t=突发

Graviton 处理器

AWS Graviton 是 AWS 基于 ARM 架构自研的处理器,提供更好的性价比:

  • Graviton2 (m6g, c6g, r6g): 比 x86 便宜约 20%,性能更好
  • Graviton3 (m7g, c7g, r7g): 比 Graviton2 快 25%
  • Graviton4 (r8g): 最新一代,大规模工作负载
# 性价比对比示例
m5.large  → $0.096/小时 (x86)
m6g.large → $0.077/小时 (Graviton2) - 节省 20%
m7g.large → $0.082/小时 (Graviton3) - 性能更高

EC2 Security Group 基础示意(AWS 官方)

看图重点:Security Group 是实例级有状态防火墙,入站和出站规则都要结合业务流量看。

定价策略深度解析

1. 按需实例 (On-Demand)

最简单的计费方式,按秒计费,没有长期承诺。

  • 优点: 完全灵活,随时启动/停止
  • 缺点: 最贵的选项
  • 适用: 短期、不可预测或刚开始的工作负载

EC2 Reserved Instance 基础模型(AWS 官方)

看图重点:长期稳定负载可通过承诺模型换折扣,和按需实例形成成本对冲。

2. Spot 实例

可节省高达 90% 的成本,但实例可能被中断。Spot 实例使用 AWS 的闲置容量,价格根据供需波动。

# Spot 实例最佳实践
1. 使用 Spot Fleet 跨多个实例类型和可用区
2. 选择中断频率低的实例类型
3. 设置合理的最高价格(设高一点,实际只付市场价)
4. 应用必须能处理中断(使用 2 分钟警告)
5. 不同可用区的同类实例价格可能差异巨大

Spot 中断处理:

当 Spot 实例即将被终止时,您会收到 2 分钟的提前通知。您可以通过以下方式检测:

# 轮询实例元数据检查 Spot 中断通知
import requests

def check_spot_interruption():
    try:
        response = requests.get(
            'http://169.254.169.254/latest/meta-data/spot/instance-action',
            timeout=2
        )
        if response.status_code == 200:
            # 实例将在 2 分钟内被终止
            # 执行优雅关闭逻辑
            handle_graceful_shutdown()
    except:
        pass  # 没有中断通知

您也可以通过 CloudWatch Events 接收终止通知。

Spot Fleet 策略:

Spot Fleet 可以跨多个实例类型、可用区甚至区域竞标,实现更大的成本节省和更高的可用性:

# 混合 Spot Fleet 配置示例
SpotFleetRequestConfig:
  TargetCapacity: 10
  AllocationStrategy: capacity-optimized
  LaunchSpecifications:
    - InstanceType: m5.large
      WeightedCapacity: 1
    - InstanceType: m5a.large
      WeightedCapacity: 1
    - InstanceType: m5n.large
      WeightedCapacity: 1

VPC 基础网络架构(AWS 官方)

看图重点:EC2 成本和稳定性会被网络拓扑放大,先规划子网分层再扩实例数量。

Public NAT Gateway 流量路径(AWS 官方)

看图重点:私网 EC2 对外更新依赖 NAT 路径,吞吐与费用要一起评估。

3. 预留实例 (Reserved Instances)

适合可预测的长期工作负载,提供显著折扣。

付款方式1年折扣3年折扣
全额预付 (All Upfront)~40%~60%
部分预付 (Partial Upfront)~35%~55%
无预付 (No Upfront)~30%~45%

预留实例类型:

  • Standard RI: 折扣最高,但灵活性最低。可在 RI Marketplace 转售。
  • Convertible RI: 可以更换实例类型,但折扣较低。

💡 重要提示: 预留实例不绑定到特定的 EC2 实例,而是在账单级别应用到符合条件的计算小时。

4. Savings Plans

比预留实例更灵活,承诺每小时的消费金额(如 $10/小时),而非特定实例类型。

类型灵活性折扣幅度
Compute Savings Plans最高:适用于 EC2、Fargate、Lambda较高
EC2 Instance Savings Plans限定实例系列和区域最高

Lambda Reserved Concurrency 行为(AWS 官方)

看图重点:容量保留思路在 EC2 与 Lambda 都成立,本质是给关键负载预留资源。

💡 EC2 最佳实践

1. 使用最新代实例

新代实例通常在相同或更低价格下提供更好的性能:

# 实例代际升级
m5.large → m6i.large  # 性价比提升 ~15%
c5.xlarge → c6i.xlarge # 性价比提升 ~15%

2. 为 EC2 使用 IAM 角色

不要在 EC2 实例上存储 AWS 凭证。使用 IAM 角色,让应用程序从实例元数据获取临时凭证:

import boto3
# boto3 会自动从实例元数据获取凭证
s3 = boto3.client('s3')

IAM Permission Boundary 作用范围(AWS 官方)

看图重点:给 EC2 角色授权建议配合权限边界,防止策略膨胀到超出预期。

3. 实例元数据服务

# 获取实例信息 (IMDSv1)
curl http://169.254.169.254/latest/meta-data/

# 常用元数据
curl http://169.254.169.254/latest/meta-data/instance-id
curl http://169.254.169.254/latest/meta-data/instance-type
curl http://169.254.169.254/latest/meta-data/local-ipv4
curl http://169.254.169.254/latest/meta-data/public-ipv4
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/

# ⚠️ 安全最佳实践:使用 IMDSv2
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" \
  -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
curl -H "X-aws-ec2-metadata-token: $TOKEN" \
  http://169.254.169.254/latest/meta-data/

4. Auto Scaling 配置

使用混合实例策略优化成本和可用性:

MixedInstancesPolicy:
  InstancesDistribution:
    OnDemandBaseCapacity: 2           # 基础按需实例数
    OnDemandPercentageAboveBaseCapacity: 25  # 25% 使用按需实例
    SpotAllocationStrategy: capacity-optimized
  LaunchTemplate:
    Overrides:
      - InstanceType: m5.large
      - InstanceType: m5a.large       # AMD 版本,更便宜
      - InstanceType: m6i.large
      - InstanceType: m5n.large

ALB 组件架构(AWS 官方)

看图重点:Auto Scaling + ALB 是 EC2 高可用默认组合,扩缩容必须和目标组健康检查联动。

5. 使用置放组

# 集群置放组 - 低延迟(同一机架)
aws ec2 create-placement-group --group-name my-cluster \
  --strategy cluster

# 分布置放组 - 高可用(不同机架)
aws ec2 create-placement-group --group-name my-spread \
  --strategy spread

# 分区置放组 - 大规模分布式系统
aws ec2 create-placement-group --group-name my-partition \
  --strategy partition --partition-count 7

⚠️ EC2 常见陷阱

1. 选错实例类型

# ❌ 错误:开发环境用大实例
生产环境: m5.2xlarge
开发环境: m5.2xlarge  # 浪费!

# ✅ 正确:根据环境选择
生产环境: m5.2xlarge
开发环境: t3.medium   # 节省 80%+

2. 忘记停止/终止实例

# 设置自动停止脚本
aws ec2 stop-instances --instance-ids i-1234567890abcdef0

# 使用 Instance Scheduler 解决方案进行自动化
# 或使用标签 + Lambda 实现自动关机

3. EBS 卷未删除

当终止 EC2 实例时,如果没有勾选 "Delete on Termination",EBS 卷会保留并继续收费!

# 检查孤立的 EBS 卷
aws ec2 describe-volumes \
  --filters Name=status,Values=available \
  --query 'Volumes[*].{ID:VolumeId,Size:Size,Created:CreateTime}'

4. 忽略区域价格差异

同一实例类型,不同区域价格差异可达 20%+

典型价格排序(从低到高):
1. us-east-1 (N. Virginia) - 通常最便宜
2. us-west-2 (Oregon)
3. eu-west-1 (Ireland)
4. ap-southeast-2 (Sydney) - 比美国贵约 15-20%

5. 达到实例限制

每个账户每个区域都有实例数量限制。如果您需要扩展,要提前请求提高限制:

# 检查当前限制
aws service-quotas get-service-quota \
  --service-code ec2 \
  --quota-code L-1216C47A

6. 网络带宽限制

较小的实例类型网络带宽有限。在选择实例时,要考虑网络需求:

# 实例网络性能
t3.micro     → 低到中等
m5.large     → 最高 10 Gbps
m5.16xlarge  → 20 Gbps
m5n.24xlarge → 100 Gbps

7. 忘记终止临时资源

试验、测试或临时创建的资源容易被遗忘。使用标签和自动清理策略:

# 创建时添加过期标签
aws ec2 create-tags --resources i-xxx \
  --tags Key=TTL,Value=2024-01-15

# 使用 Lambda 定期清理过期资源

📚 本章小结

  • 根据工作负载选择合适的实例类型,优先考虑最新代实例
  • 使用 Graviton 处理器可获得更好的性价比
  • Spot 实例可节省高达 90% 成本,但需要处理中断
  • 长期稳定负载考虑预留实例或 Savings Plans
  • 为 EC2 使用 IAM 角色,不要存储静态凭证
  • 使用 IMDSv2 增强安全性
  • 注意常见陷阱:停止实例、删除 EBS、区域价格差异、限制配额
📝 章节练习 (20 题)
开始练习