
Amazon ECS(Elastic Container Service)是 AWS 提供的全托管容器编排服务,负责决定容器在哪里运行、如何扩缩容、出现故障时如何恢复。一个普遍的误解是把 ECS 和 Fargate 当作竞争关系来比较——实际上两者不是同一层面的东西。ECS 是编排平台,Fargate 是其中一种计算引擎。你选择的是”在 ECS 上用 Fargate 运行”还是”在 ECS 上用 EC2 运行”,而不是”用 ECS 还是用 Fargate”。
ECS 控制平面完全免费,这是它和 EKS 最直接的区别。EKS 每个集群每小时收取 $0.10 的控制平面费,折算为每月约 $73,运行三个集群(开发、测试、生产)每月单控制平面费就是 $219。ECS 没有这项费用,容器运行成本只来自底层的计算资源。
ECS 的核心概念
理解 ECS 的四个核心组件是后续配置的基础。
**集群(Cluster)**是 ECS 的资源逻辑分组,所有任务和服务在集群内运行。一个集群可以混合使用 Fargate 和 EC2 两种启动类型,不需要为每种启动类型单独建集群。AWS 账号下有一个默认集群(default),生产环境建议创建独立命名的集群,方便成本追踪和权限隔离。
**任务定义(Task Definition)**是容器的运行蓝图,以 JSON 格式定义一组容器的配置:使用哪个镜像、分配多少 CPU 和内存、暴露哪些端口、设置哪些环境变量、挂载哪些存储卷、使用哪个 IAM 角色。任务定义是版本化的,每次修改会创建新版本,旧版本可以继续运行,方便版本回滚。
**任务(Task)**是任务定义的一次运行实例,包含任务定义中定义的所有容器。任务可以是一次性运行(批处理作业完成后退出)或持续运行(Web 服务)。每个 Fargate 任务有独立的内核、CPU、内存和弹性网络接口,任务之间完全隔离。
**服务(Service)**负责维持指定数量的任务持续运行。某个任务因健康检查失败而终止后,服务自动创建新任务替补,保证始终有指定数量的任务处于运行状态。服务支持与 ALB 负载均衡器集成,新任务就绪后自动注册到 ALB 目标组,缩容时先从目标组移出再终止任务。
两种启动类型:Fargate vs EC2
Fargate 启动类型
Fargate 让 AWS 负责所有底层基础设施:不需要创建或管理 EC2 实例,不需要处理操作系统补丁,不需要规划集群容量。只需在任务定义中指定 CPU 和内存需求,Fargate 自动分配隔离的计算资源运行任务,按任务实际运行时间的资源消耗计费。
Fargate 的计费单位是 vCPU-小时和 GB-小时,2026 年 us-east-1 的价格:
- x86 架构:$0.04048/vCPU-小时,$0.004445/GB-小时
- ARM(Graviton):$0.03239/vCPU-小时,$0.003556/GB-小时
Graviton 比 x86 便宜约 20%,对于没有特殊 x86 依赖的应用,切换到 ARM 镜像是最直接的 Fargate 降本手段。
以一个持续运行的 Web 服务为例:分配 1 vCPU + 2GB 内存,全月运行约 $35.74(x86)或 $28.60(Graviton)。分配 0.5 vCPU + 1GB 内存,全月约 $17.87(x86),这是中小型 Web API 的常见配置。
Fargate Spot 提供最高 70% 的折扣,AWS 在需要回收资源时发出 30 秒预警后终止任务,适合可以容忍中断的批处理任务和非关键工作负载,不适合正式对外服务的 Web 服务。
Fargate 单个任务的最大规格是 16 vCPU + 120GB 内存,超出这个上限的单体应用需要切换到 EC2 启动类型。
EC2 启动类型
EC2 启动类型在用户管理的 EC2 实例集群上运行容器,多个任务共享同一台 EC2 实例,节点利用率可以通过合理的任务密度优化,整体计算成本比 Fargate 低 40–60%。
EC2 启动类型支持 Spot 实例(最高 60–90% 折扣)和 Reserved Instances / Savings Plans,大规模稳定工作负载下,EC2 启动类型配合预留实例是所有 ECS 配置中成本最低的选项。代价是需要维护 EC2 节点:定期更新 AMI、处理 ECS Agent 版本升级、管理集群容量(确保有足够实例运行所有任务)。经验数据显示,一个管理良好的 50 台 EC2 节点的 ECS 集群,每月需要约 8–12 小时的专项运维时间。
选型建议: 流量不稳定、团队规模小、对 DevOps 能力要求低,选 Fargate;规模大、工作负载稳定、有专职运维工程师、对成本敏感,选 EC2 启动类型。很多团队实际上两种都用——开发和测试环境用 Fargate(按需付费,没有空闲 EC2 实例的持续成本),生产环境用 EC2 启动类型(节约成本)。
创建 ECS 集群
用 AWS CLI 创建一个同时启用 Fargate 和 Fargate Spot 容量提供程序的集群:
aws ecs create-cluster \
–cluster-name production-cluster \
–capacity-providers FARGATE FARGATE_SPOT \
–default-capacity-provider-strategy \
capacityProvider=FARGATE,weight=1,base=1 \
capacityProvider=FARGATE_SPOT,weight=3 \
–region ap-east-1
上面的容量提供程序策略意味着:始终保证至少 1 个任务运行在标准 Fargate 上(base=1),其余扩容的任务有 75% 的比例使用 Fargate Spot(weight=3 vs weight=1),在不损失最低可用性的情况下最大化节省。
创建任务定义
任务定义以 JSON 格式提交,下面是一个 Node.js Web 服务的 Fargate 任务定义示例:
{
“family”: “web-api”,
“networkMode”: “awsvpc”,
“requiresCompatibilities”: [“FARGATE”],
“cpu”: “512”,
“memory”: “1024”,
“executionRoleArn”: “arn:aws:iam::123456789012:role/ecsTaskExecutionRole”,
“taskRoleArn”: “arn:aws:iam::123456789012:role/webApiTaskRole”,
“containerDefinitions”: [
{
“name”: “web-api”,
“image”: “123456789012.dkr.ecr.ap-east-1.amazonaws.com/web-api:v1.2.0”,
“portMappings”: [
{
“containerPort”: 3000,
“protocol”: “tcp”
}
],
“environment”: [
{“name”: “NODE_ENV”, “value”: “production”},
{“name”: “PORT”, “value”: “3000”}
],
“secrets”: [
{
“name”: “DB_PASSWORD”,
“valueFrom”: “arn:aws:secretsmanager:ap-east-1:123456789012:secret:db-password”
}
],
“logConfiguration”: {
“logDriver”: “awslogs”,
“options”: {
“awslogs-group”: “/ecs/web-api”,
“awslogs-region”: “ap-east-1”,
“awslogs-stream-prefix”: “ecs”
}
},
“healthCheck”: {
“command”: [“CMD-SHELL”, “curl -f http://localhost:3000/health || exit 1”],
“interval”: 30,
“timeout”: 5,
“retries”: 3
}
}
]
}
几个配置项值得单独说明:
executionRoleArn 是 ECS 代理使用的角色,负责从 ECR 拉取镜像、向 CloudWatch Logs 写入日志。这是 Fargate 任务的必须配置,和 taskRoleArn 是两个不同的角色,用途不同不能混淆。
taskRoleArn 是容器内应用运行时使用的角色,用于访问 AWS 服务(S3、DynamoDB、SQS 等)。应为每个服务创建专用的任务角色,只授予该服务实际需要的最小权限,不要复用同一个宽泛角色。关于 IAM 角色和策略的详细配置,可以参考 AWS IAM 权限管理教程。
secrets 字段引用 Secrets Manager 或 Parameter Store 中的敏感信息,ECS 在启动容器时自动注入为环境变量,不需要在代码或环境变量文件中硬编码密码。
创建 ECS 服务与 ALB 集成
服务将任务定义部署为持续运行的实例,并通过 ALB 接收外部流量:
aws ecs create-service \
–cluster production-cluster \
–service-name web-api-service \
–task-definition web-api:3 \
–desired-count 3 \
–launch-type FARGATE \
–network-configuration “awsvpcConfiguration={
subnets=[subnet-xxx,subnet-yyy],
securityGroups=[sg-zzz],
assignPublicIp=DISABLED
}” \
–load-balancers “targetGroupArn=arn:aws:elasticloadbalancing:…,
containerName=web-api,containerPort=3000″ \
–health-check-grace-period-seconds 60
desired-count=3 表示始终维持 3 个任务运行,其中一个任务失败后,ECS 自动创建新任务补充,新任务通过健康检查后注册到 ALB,整个替换过程对用户无感知。
assignPublicIp=DISABLED 将任务放入私有子网,不分配公网 IP。任务访问公网(拉取外部资源、调用第三方 API)需要经过 NAT Gateway,NAT Gateway 按流量计费($0.045/GB)。如果任务频繁拉取 ECR 镜像或调用其他 AWS API,应配置 VPC Endpoint,让这些流量走 AWS 内部网络,绕过 NAT Gateway,避免产生不必要的数据处理费用。
服务的自动扩缩容配置:
# 注册可伸缩目标
aws application-autoscaling register-scalable-target \
–service-namespace ecs \
–resource-id service/production-cluster/web-api-service \
–scalable-dimension ecs:service:DesiredCount \
–min-capacity 2 \
–max-capacity 20
# 配置基于 CPU 使用率的目标追踪策略(维持在 60%)
aws application-autoscaling put-scaling-policy \
–service-namespace ecs \
–resource-id service/production-cluster/web-api-service \
–scalable-dimension ecs:service:DesiredCount \
–policy-name cpu-tracking \
–policy-type TargetTrackingScaling \
–target-tracking-scaling-policy-configuration ‘{
“TargetValue”: 60.0,
“PredefinedMetricSpecification”: {
“PredefinedMetricType”: “ECSServiceAverageCPUUtilization”
},
“ScaleInCooldown”: 300,
“ScaleOutCooldown”: 60
}’
ScaleOutCooldown(扩容冷却时间)设为 60 秒,让系统在流量突增时能够快速响应;ScaleInCooldown(缩容冷却时间)设为 300 秒,避免缩容过于激进在短暂流量下降后立刻释放实例。
ECS vs EKS:如何选择
这是部署容器时最常遇到的选型问题。两者不是功能孰优孰劣,而是复杂度和生态之间的权衡。
ECS 的优势是简单:控制平面免费,不需要了解 Kubernetes 的任何概念,两条命令可以完成部署,一个小型 Web 服务每月成本最低约 $14–18。对于没有 Kubernetes 使用经验、或者不需要 Kubernetes 生态工具的团队,ECS 的上手成本远低于 EKS。
EKS 的每月 $73 控制平面费在早期团队规模下是显著的固定成本,但它提供了完整的 Kubernetes 生态:Helm、ArgoCD、Istio、Prometheus、Karpenter 等工具链,以及在多云或混合云场景下容器配置的可移植性。当团队已经投入了 Kubernetes 知识积累,或者明确需要 Kubernetes 特有工具时,EKS 的生态价值才能覆盖这个成本差距。关于 EKS 的完整配置和 Karpenter 自动扩缩容,可以参考 AWS EKS 教程与说明。
计费方式与成本控制
ECS 本身不收取任何费用,账单来自以下资源:
Fargate 计算费用按任务实际运行时长的 vCPU 和内存消耗计算,精确到秒。从任务启动到任务终止,中间的秒数乘以 vCPU 和内存单价即为费用。任务的 CPU 和内存配置决定了费用上限,不管任务实际用了多少 CPU,都按配置值计费——过度配置是 Fargate 最常见的浪费来源。
常见的额外费用:
NAT Gateway 数据处理费($0.045/GB)是私有子网 Fargate 任务最容易被忽视的成本。任务拉取 ECR 镜像、写入 CloudWatch 日志、调用 AWS API,所有流量都经过 NAT Gateway 计费。配置 ECR、CloudWatch、S3 等服务的 VPC Endpoint 后,这部分流量走 AWS 内网,NAT Gateway 费用可以大幅降低。
ALB 负载均衡器按小时和 LCU 计费,每个 ALB 约 $16–18/月起。
ECR 容器镜像存储按数据量计费,同一 AWS 账号和同一区域内 ECR 到 ECS/Fargate 的流量免费。
降低 Fargate 成本的直接方式:
Compute Savings Plans 可以对 Fargate 的 vCPU 和内存费用提供折扣,1 年期约 20% off,3 年期约 35% off,适合稳定运行的长期工作负载。Fargate Spot 用于可容忍中断的批处理和非关键任务,最高 70% 折扣。切换到 Graviton(ARM)任务,在镜像支持多架构的情况下节省约 20%。
关于 AWS 计费的完整构成说明,可以参考 亚马逊云服务器价格 怎么算的详细分析;关于 AWS 账号注册和服务开通的完整流程,可以参考 亚马逊云服务器购买 全流程指南。
账号开通与代理充值
使用 AWS ECS 需要有效的 AWS 账号,ECS 和 Fargate 本身没有配额申请门槛,创建集群和任务定义可以立即进行。对于正式生产部署,建议通过 AWS 代理商 渠道开户,获取高权重高配额账号,充值享代理专属折扣(低至 7 折),付款支持 USDT 和对公转账,免实名免绑卡,1 分钟极速开通。


