如何根据活动情况以编程方式启停AWS EC2实例并在有访问请求时自动恢复?
自动恢复闲置EC2实例的实现方案
核心逻辑是在用户请求和后端EC2之间增加一层常驻的轻量流量入口,检测到请求时触发启动逻辑,实例就绪后再转发流量,整套方案和你现有闲置暂停的Lambda逻辑可以完全适配。
具体实现步骤
- 部署前置流量入口
优先选择*Application Load Balancer(ALB)*作为常驻入口,单ALB每月成本很低,远低于你节省的闲置EC2费用。配置规则:将所有流量转发到后端EC2所在的目标组,当目标组健康检查全部失败(即EC2处于停止状态)时,触发后续的启动逻辑,同时给用户返回「服务正在启动,请1~2分钟后刷新」的友好提示。
如果你不想用ALB,也可以用1台t2.nano规格的EC2部署Nginx作为反向代理,成本和ALB接近。 - 配置请求触发的EC2启动Lambda
编写Lambda函数实现EC2启动逻辑,需要给Lambda配置最小启动权限,示例如下:
触发方式:ALB侧配置监听器规则,当目标组健康检查状态为异常时,将请求转发给该Lambda函数,Lambda执行启动操作后直接返回等待提示页面即可。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:StartInstances", "Resource": [ "arn:aws:ec2:<区域ID>:<账号ID>:instance/<普通Web实例ID>", "arn:aws:ec2:<区域ID>:<账号ID>:instance/<CKAN实例ID>", "arn:aws:ec2:<区域ID>:<账号ID>:instance/<DocumentDB关联实例ID>" ] } ] } - 适配现有业务场景做优化
结合你的实例配置调整逻辑:- 普通t2.small Web实例:启动耗时通常在30~60秒,等待页面设置60秒自动刷新即可,实例启动后ALB健康检查会自动识别状态,后续请求直接转发到实例
- CKAN t2.xlarge实例:启动耗时稍长,可将等待页面的自动刷新时间调整为120秒,避免用户频繁手动刷新
- DocumentDB关联实例:Lambda启动该实例前可增加判断逻辑,先确认DocumentDB集群处于可用状态,再启动EC2,避免应用启动后数据库连接失败
- 调整原有闲置暂停逻辑
你之前的闲置暂停Lambda无需大改,只要把触发暂停的条件从「CPU/内存闲置」调整为「ALB连续15~30分钟无访问流量」即可,避免刚启动的实例被误暂停。
注意事项
所有静态资源建议提前存放到S3,等待提示页面的资源全部从S3加载,不需要依赖后端EC2,避免出现等待页面也无法打开的问题
可以根据业务的访问规律调整暂停的等待时长,比如工作时间延长到30分钟无访问再暂停,非工作时间缩短到15分钟,平衡成本和用户体验
t2实例启动速度快,大部分场景下用户感知的等待时间不会超过2分钟,对普通Web业务的体验影响极小
内容的提问来源于stack exchange,提问作者Reichy
相关产品推荐
相关产品推荐

