实现即将终止的EC2 Spot Instance自动替换为新实例
自动替换EC2 Spot实例的可行方案
以下是几种成熟的自动替换Spot实例的方案,均为AWS原生或可自定义实现的实用方案:
1. EC2 Auto Scaling组(推荐原生方案)
- 创建Auto Scaling组时启用混合实例策略,配置Spot实例的占比,同时关联预先定义的Launch Template/Launch Configuration
- Auto Scaling组会自动监听Spot实例的终止通知,一旦检测到实例即将被回收,会立即启动新的Spot实例补充容量
- 可配置终止钩子,让旧实例在被终止前完成优雅关闭(比如停止服务、处理完当前请求)
- 配合负载均衡器使用时,Auto Scaling会自动将新实例注册到LB,待旧实例注销完成后再终止,保证服务不中断
2. Spot Fleet
- Spot Fleet是专门管理Spot实例的服务,可设定目标实例数量、可选实例类型和可用区范围
- 当某个Spot实例收到终止通知时,Fleet会自动启动新的实例维持目标容量,无需手动配置监听逻辑
- 支持多实例类型和多可用区配置,能提高Spot实例的获取成功率,降低因单一实例类型售罄导致的服务中断风险
3. 自定义Lambda+EventBridge方案(适合个性化需求)
- 通过EventBridge捕获EC2发送的
EC2 Spot Instance Termination Notice事件 - 编写Lambda函数实现以下核心逻辑:
- 验证事件中的实例确实是因Spot回收即将终止
- 调用EC2 API启动新的Spot实例(使用预先定义的Launch Template)
- 将新实例注册到负载均衡器,等待健康检查通过
- 触发旧实例的优雅关闭脚本,完成后注销旧实例
- 需为Lambda配置对应的IAM权限(EC2实例操作、负载均衡器操作等)
关键注意事项
- 确保应用是无状态的,或状态存储在共享服务(如S3、RDS、ElastiCache)中,避免实例替换时数据丢失
- 在实例上部署监听脚本,通过元数据服务
http://169.254.169.254/latest/meta-data/spot/termination-time检测终止通知,提前执行优雅关闭 - 定期测试终止场景,验证自动替换流程是否正常,比如通过AWS CLI手动模拟终止通知
内容的提问来源于stack exchange,提问作者Pavan Bhat
相关产品推荐
相关产品推荐

