📌 核心知识点
EC2 实战指南
📖 EC2 基础知识
Amazon EC2 (Elastic Compute Cloud) 是 AWS 最核心的计算服务,提供可扩展的虚拟服务器。
EC2 是什么?
EC2 是一个巨大的、基本上无限的服务器农场,您可以按需付费使用。它是 AWS 最老的服务之一(2006 年推出),也是迄今为止 AWS 最重要的服务。几乎所有使用 AWS 的公司都使用 EC2。
EC2 提供以下核心功能:
EC2 核心组件
├── 实例 (Instance) - 虚拟服务器
├── AMI - 机器镜像,包含操作系统和软件
├── 实例类型 - CPU、内存、存储配置
├── 密钥对 - SSH 访问凭证
├── 安全组 - 虚拟防火墙
├── EBS - 持久性块存储
├── Elastic IP - 静态公网 IP
└── 置放组 - 实例放置策略

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

看图重点:启动、停止、终止是三种不同状态转换,排查“实例不可连接”时要先看生命周期状态。
实例类型详解
EC2 提供多种实例类型,每种优化不同的使用场景。参考 ec2instances.info 获取完整规格对比。
| 类型前缀 | 优化方向 | 典型用例 |
|---|---|---|
| t3/t4g | 通用突发 | Web 服务器、开发环境 |
| m5/m6i/m7i | 通用均衡 | 应用服务器、后端服务 |
| c5/c6i/c7i | 计算优化 | 批处理、游戏服务器、科学建模 |
| r5/r6i/r7i | 内存优化 | 数据库、内存缓存 |
| i3/i4i | 存储优化 | 数据仓库、分布式文件系统 |
| p4/p5 | GPU 加速 | 机器学习训练 |
| 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) - 性能更高

看图重点:Security Group 是实例级有状态防火墙,入站和出站规则都要结合业务流量看。
定价策略深度解析
1. 按需实例 (On-Demand)
最简单的计费方式,按秒计费,没有长期承诺。
- 优点: 完全灵活,随时启动/停止
- 缺点: 最贵的选项
- 适用: 短期、不可预测或刚开始的工作负载

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

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

看图重点:私网 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 | 限定实例系列和区域 | 最高 |

看图重点:容量保留思路在 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')

看图重点:给 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

看图重点: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、区域价格差异、限制配额