我们如何使用 Amazon ECS Fargate 每月损失 800 美元但首先,介绍一下背景...这就是我们被收取如此多费用的原因...我们如何发现...小小的实验故事的寓意...

2025-06-07

我们如何使用 Amazon ECS Fargate 每月损失 800 美元

但首先,先介绍一下背景……

这就是我们被收取如此多费用的地方……

我们是如何发现的...

一点小实验

故事的寓意是……

众所周知,容器化应用程序有助于降低服务器成本。但如果设计不当,可能会增加其他成本,例如带宽成本。在本文中,我将讲述我们首次使用 ECS-Fargate 时如何产生 800 美元的带宽费用。

但首先,先介绍一下背景……

首次部署 ECS 服务时,ECS 代理会从 Dockerhub 或 ECR 等镜像仓库获取您的 Docker 镜像。使用下载的镜像,代理将通过命令 生成一个 Docker 容器docker run your-docker-image。然后,ECS 会运行健康检查,以查看您的应用程序是否正在运行。如果通过健康检查,负载均衡器会将流量重定向到该容器。如果多次健康检查均未通过,则容器将被终止。之后,Docker 代理会尝试从同一镜像启动另一个容器。

ECS 有两种类型的服务,它们处理重启尝试的方式有所不同。

(1)ECS-EC2

在 ECS-EC2 中,您可以管理运行容器的 EC2 实例队列。您可以运行的容器数量受队列的 CPU 和内存容量限制。如果某个实例没有镜像,它会下载一次并将其存储在本地。因此,首次下载后,镜像就已经存在于实例中。当您的 Docker 代理下载镜像时docker run,它会在本地获取镜像。

(2)ECS-Fargate

容器运行的底层 EC2 实例已从您抽象出来。您无法访问运行容器的 EC2 实例。AWS 会为您管理这些实例;因此,该服务已实现无服务器化。只需支付少量费用,您便可摆脱管理 EC2 实例集群的运维负担。

您的容器第一次运行的 EC2 实例很可能与第二次运行的 EC2 实例不同。因此,每次 ECS 尝试生成另一个容器时,代理都必须从 ECR 获取您的镜像。

这就是我们被收取如此多费用的地方……

我正在将我们的服务从 ECS-EC2 迁移到 ECS-Fargate。然而,我未能正确设置一项服务。我让该服务处于配置错误的状态。由于该服务创建的容器配置错误,它从未在其中运行应用程序。因此,它一直无法通过健康检查。几次失败后,该容器会被销毁,然后该服务会尝试创建另一个容器。由于 ECS-Fargate 容器下的实例不断变化,它每次重启都需要下载我的 500MB docker 镜像。想象一下,每 2-3 分钟下载 500MB 镜像,一个月内就轻松积累到 16TB。

我们是如何发现的...

我过去工作时经常会查看我们的 AWS 账单。我原本以为会节省不少钱,因为我们从 10 个 m5.large EC2 实例迁移到 1 个 m5.large 实例和几个 ECS-Fargate 容器。但实际节省的金额还不到我预期的一半。于是,我深入研究了一下,发现我们的 NAT 网关费用增加了 6 倍。我们的带宽消耗从每月 38GB 增加到了每月 16TB!

NAT 网关是私有子网中的资源访问互联网的一个实体。每 GB 流量收费 0.045 美元。

一点小实验

由于成本上涨与 ECS Fargate 升级同时发生,我决定关闭所有容器几分钟。带宽消耗突然下降了:

为了缩小特定服务的范围,我决定启用除配置错误的那项服务之外的所有服务。结果成本突然又上涨了!就在那时,我发现,在 ECS Fargate 中保留配置错误的服务会增加成本。

故事的寓意是……

切勿让您的 ECS 服务处于配置错误的状态。如果您无法完成设置,至少应将容器数量设置为零,以免其不断生成容器。

另外,将你的 AWS 账单用作反馈机制。账单中某个部分突然出现意外费用可能意味着出现了问题。

特别感谢我的编辑 Allen,他帮助我使这篇文章更加连贯。

我很高兴收到您对这篇文章的评论/反馈。请在下方评论或给我留言!

文章来源:https://dev.to/raphael_jambalos/secret-costs-of-ecs-fargate-4j3b
PREV
结合使用 Python 和 C 我们需要的代码
NEXT
使用 API 优先设计创建可靠且易于使用的 API 文章摘要 API 优先设计流程 下一步是什么?特别致谢