利用 AWS Spot 实例与 ECS 自动扩展,将生产环境服务器成本降低三分之二

作者:API传播员 · 2025-09-29 · 阅读时间:5分钟

我们的后端系统建立在 AWS(亚马逊云平台)之上。本文将详细介绍我们如何通过在生产环境中使用 Spot 实例,将服务器成本降低至原来的三分之一。此外,还将指导您如何配置自动扩展功能。文章分为两个部分:首先是工作原理的概述,其次是具体的操作步骤。


什么是 AWS Spot 实例?

AWS Spot 实例是一种可以显著降低计算成本的云服务实例类型。由于其价格波动较大,长期以来我们主要在开发(DEV)环境中使用它,或者用于将中间结果保存到 S3 或数据库的计算任务,而非生产(PROD)环境。虽然市场上有第三方解决方案可以在生产环境中使用 Spot 实例,但由于我们业务场景的特殊性,存在诸多限制,因此未采用这些方案。

本文介绍的方法完全基于 AWS 的标准功能,无需额外的脚本或定时任务。以下是一些 Spot 实例的定价历史截图,展示了其成本节省的潜力。

m5.large实例(爱尔兰区域,eu-west-1)
价格在三个月内基本稳定,节省成本约为 2.9 倍

m5.large实例(美国东部区域,us-east-1)
价格波动较大,节省成本在 2.3 倍至 2.8 倍之间,具体取决于可用区。

t3.small实例(美国东部区域,us-east-1)
价格稳定,节省成本约为 3.4 倍


服务架构

以下是本文讨论的服务架构示意图:

应用程序负载均衡器(ALB)→ EC2 目标组(TG)→ 弹性容器服务(ECS)

  • 应用程序负载均衡器(ALB):作为流量分发器,将请求发送到 EC2 目标组。
  • EC2 目标组(TG):负责在 ALB 实例上打开端口,并将其连接到 ECS 容器端口。
  • 弹性容器服务(ECS):AWS 提供的容器编排服务,类似于 Kubernetes,用于管理 Docker 容器。

在 ECS 中,一个实例可以运行多个功能容器,这些容器可能使用相同的端口。因此,ECS 会动态分配端口,并通过 TG 监控健康状况。如果发现问题,TG 会停止将请求发送到有故障的实例。

EC2 自动扩展组(ASG)+ ECS 容量提供商(CP)

ASG 负责根据负载自动调整 EC2 实例的数量。然而,直到最近,AWS 并未提供内置功能来管理 ECS 所需的实例数量。ECS 容量提供商(CP)的引入解决了这一问题:

  • ECS 服务可以与 ASG 关联。
  • 当任务需要更多实例时,ASG 会启动新实例。
  • 当实例处于空闲状态时,ASG 会关闭多余的实例。
  • ECS CP 允许设置目标容量百分比,以确保始终有一定数量的实例可供快速扩展使用。

EC2 启动模板

EC2 启动模板简化了实例的创建过程,避免了重复配置。以下是关键配置参数:

  • ECS_ENABLE_SPOT_INSTANCE_DRAINING=true:当 Spot 实例即将被回收时,ECS 会将其任务切换到“排空”状态,不再分配新任务。
  • ECS_CONTAINER_STOP_TIMEOUT:设置任务停止的超时时间,默认 30 秒,可根据需求调整。
  • ECS_CLUSTER:指定实例所属的 ECS 集群。

创建服务

以下是创建服务的具体步骤:

1. 创建 EC2 启动模板

  • 亚马逊机器映像(AMI):推荐使用 ECS 优化的 AMI。
  • 实例类型:根据任务需求选择合适的实例类型。
  • 网络设置:配置虚拟私有云(VPC)和安全组。
  • 用户数据:配置 ECS 代理参数,例如 ECS_ENABLE_SPOT_INSTANCE_DRAINING

2. 配置 EC2 自动扩展组(ASG)

  • 启动模板:选择之前创建的模板。
  • 购买选项:设置按需实例与 Spot 实例的比例,例如 20% 按需,80% Spot。
  • 组大小:定义实例的最小和最大数量。
  • 扩展策略:基于 ECS 任务数量自动扩展实例。

3. 配置应用程序负载均衡器(ALB)和目标组(TG)

  • 侦听器:配置 HTTP(80)和 HTTPS(443)端口。
  • 目标组:设置健康检查参数,确保实例的可用性。

4. 创建 ECS 任务定义

  • 容器定义:配置内存限制、端口映射、环境变量等。
  • 日志记录:将日志输出到 AWS CloudWatch。

5. 创建 ECS 集群和容量提供商

  • 集群:创建空集群,并与启动模板中的 ECS_CLUSTER 名称保持一致。
  • 容量提供商:关联 ASG,并设置目标容量百分比。

6. 配置 ECS 服务

  • 任务定义:选择之前创建的任务定义。
  • 扩展配置:设置任务的最小健康百分比和最大百分比,确保部署过程中服务的可用性。

总结

通过本文的方法,您可以利用 AWS Spot 实例显著降低服务器成本,同时通过自动扩展功能确保服务的高可用性。无论是配置 EC2 启动模板、自动扩展组,还是设置 ECS 服务和容量提供商,所有步骤均基于 AWS 的标准功能,无需额外工具支持。希望本文能为您的系统优化提供实用参考。

原文链接: https://adapty.io/blog/designing-scalable-api-on-aws-spot-instance/