在 CPU 低时自动停止 EC2,然后在 HTTPS 请求时自动启动——实例关闭时如何保留“前门”?
发布: (2025年12月13日 GMT+8 14:28)
3 min read
原文: Dev.to
Source: Dev.to
我想实现的目标
- 当 EC2 实例空闲时(例如 CPU 利用率 < 5%),自动停止实例。
- 当有 HTTPS 请求到达我的 API 时:
- 如果实例已停止,则自动启动 EC2 实例。
- 最终由该 EC2 实例上运行的应用来处理请求。
我已经完成的工作
- 使用 CloudWatch 警报触发
StopInstances,实现自动停止 EC2 实例。 - 创建了一个拥有启动 EC2 实例所需 IAM 权限的 Lambda 函数。
- 通过 API Gateway 将该 Lambda 暴露出来(
HTTP API → Lambda → Start EC2);调用该 API 即可启动实例。
问题所在
- API Gateway 的端点 不是 EC2 的端点。当实例已停止时:
- HTTPS 请求会触发 Lambda 并启动 EC2 实例。
- 实例启动完成后,原始请求并未被转发到应用。
- 因此,请求者的请求会丢失,因为请求到达时 EC2 实例处于关闭状态。
我的疑问
是否有实用的方式可以在 EC2 实例前保留一个“前门”(如代理、ALB、API Gateway 等),使得:
- 当实例停止时,传入的 HTTPS 请求会触发实例启动;并且
- 请求要么
- 在实例准备好后转发给应用,或者
- 返回友好的提示信息,例如 “服务正在启动,请在 X 秒后重试”。
已考虑的选项
- 应用负载均衡器(ALB)
- API Gateway + Lambda
- 反向代理方案
我不确定哪种模式最佳,或者在延迟、复杂度和用户体验方面的权衡如何。
我想要的答案
- 推荐的架构或已有的 AWS 模式。
- 实现技巧。
- 关于冷启动延迟和用户体验的讨论。
谢谢!