在 CPU 低时自动停止 EC2,然后在 HTTPS 请求时自动启动——实例关闭时如何保留“前门”?

发布: (2025年12月13日 GMT+8 14:28)
3 min read
原文: Dev.to

Source: Dev.to

我想实现的目标

  • 当 EC2 实例空闲时(例如 CPU 利用率 < 5%),自动停止实例。
  • 当有 HTTPS 请求到达我的 API 时:
    1. 如果实例已停止,则自动启动 EC2 实例。
    2. 最终由该 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 等),使得:

  1. 当实例停止时,传入的 HTTPS 请求会触发实例启动;并且
  2. 请求要么
    • 在实例准备好后转发给应用,或者
    • 返回友好的提示信息,例如 “服务正在启动,请在 X 秒后重试”。

已考虑的选项

  • 应用负载均衡器(ALB)
  • API Gateway + Lambda
  • 反向代理方案

我不确定哪种模式最佳,或者在延迟、复杂度和用户体验方面的权衡如何。

我想要的答案

  • 推荐的架构或已有的 AWS 模式。
  • 实现技巧。
  • 关于冷启动延迟和用户体验的讨论。

谢谢!

Back to Blog

相关文章

阅读更多 »

AWS 第3模块:Lambda 与 Go

在不离开我的 Mac 的情况下为 Linux 编译,花费 $0.06 系列:AWS Zero to Architect - 第 3 章节 阅读时间:20 分钟 实施时间:120 分钟