ECS Fargate Spot故障后任务切换验证及事件获取求助
问题解答
1. Fargate Spot故障时是否自动切换至Fargate?
根据你设置的容量提供商参数(Fargate Base=0、Weight=1;Fargate Spot Base=1、Weight=2),当Fargate Spot任务因故障(如Spot容量回收、节点异常)被终止时,ECS服务会自动尝试用Fargate调度新任务,但需要满足几个条件:
- ECS服务已配置多容量提供商策略,且Fargate的Weight值大于0(你的配置已满足);
- AWS Fargate当前有可用容量;
- 服务的
minimum healthy percent和maximum percent配置允许ECS启动新任务(默认配置通常符合要求)。
补充说明:ECS会优先按Weight比例分配任务(Fargate:Spot=1:2),但当Spot容量不可用时,会自动 fallback到Fargate,无需手动触发切换。
2. Fargate Spot故障事件的位置与标识
Fargate Spot的中断/故障事件不会显示在ECS任务的本地事件列表中,而是发送到Amazon EventBridge(原CloudWatch Events),识别该事件的关键信息如下:
- 事件源:
aws.ecs - 事件类型(detail-type):
ECS Task State Change - 核心识别字段:事件
detail部分的stoppedReason会包含Spot中断相关描述,例如:Your Spot Task was interrupted.Fargate Spot task was terminated due to Spot capacity availability.
用Lambda触发任务切换的实现步骤
- 在EventBridge控制台创建规则:
- 选择事件源为
ECS,事件类型为ECS Task State Change; - 添加过滤条件:匹配
detail.lastStatus = STOPPED且detail.stoppedReason包含Spot关键词;
- 选择事件源为
- 将你的Lambda函数设置为该规则的触发目标;
- Lambda函数核心逻辑示例(Python):
import boto3 ecs_client = boto3.client('ecs') def lambda_handler(event, context): # 从事件中提取集群和服务信息 cluster_arn = event['detail']['clusterArn'] service_name = event['detail']['group'].split(':')[1] # 更新服务容量提供商策略,临时优先使用Fargate ecs_client.update_service( cluster=cluster_arn, service=service_name, capacityProviderStrategy=[ { 'capacityProvider': 'FARGATE', 'base': 1, 'weight': 10 }, { 'capacityProvider': 'FARGATE_SPOT', 'base': 0, 'weight': 0 } ] ) return {"status": "success"}
- 提示:你也可以根据业务需求,选择仅触发单次Fargate任务调度,而非修改长期的容量提供商策略。
内容的提问来源于stack exchange,提问作者Tahir Rasheed
相关产品推荐
相关产品推荐

