AWS Step Functions超时后Fargate任务未自动终止问题求助
解决Step Functions超时后Fargate容器未自动终止的问题
你遇到的问题核心在于arn:aws:states:::ecs:runTask.waitForTaskToken的设计逻辑:它仅负责启动Fargate任务并等待任务主动返回令牌,当Step Functions触发超时后,只会跳转至错误处理流程,不会自动关联终止对应的ECS任务。以下是几种可行的解决方案:
方案一:在错误流程中添加终止任务的步骤
直接修改状态机配置,在进入CatchAllFallback之前新增一个调用ECS终止任务API的Task状态,利用启动任务时返回的ARN定位并停止容器。
修改后的状态机YAML示例:
StartAt: FargateWorker States: FargateWorker: Type: Task Resource: arn:aws:states:::ecs:runTask.waitForTaskToken InputPath: $ ResultPath: $.workerResult OutputPath: $ TimeoutSeconds: 3 Parameters: Cluster: "#{EcsCluster}" TaskDefinition: "#{EcsTaskDefinition}" LaunchType: FARGATE EnableExecuteCommand: true NetworkConfiguration: AwsvpcConfiguration: Subnets: - xxx - yyy - zzz AssignPublicIp: DISABLED Overrides: ContainerOverrides: - Name: container-${env:STACK_NAME} Environment: - Name: TASK_TOKEN "Value.$": "$$.Task.Token" Catch: - ErrorEquals: ["States.ALL"] Next: StopFargateTask Next: Done StopFargateTask: Type: Task Resource: arn:aws:states:::ecs:stopTask Parameters: Cluster: "#{EcsCluster}" TaskArn.$: "$.workerResult.tasks[0].taskArn" Reason: "Step Functions任务超时或失败,自动终止Fargate容器" Next: CatchAllFallback CatchAllFallback: Type: Pass End: true Done: Type: Pass End: true
关键说明:
runTask.waitForTaskToken的返回结果会存在$.workerResult中,其中包含启动的Fargate任务ARN:tasks[0].taskArnStopFargateTask状态调用ECS的stopTask接口,通过TaskArn.$引用之前保存的任务ARN,实现精准终止- 需要确保Step Functions的执行角色拥有
ecs:StopTask权限
方案二:配合ECS任务定义的停止超时配置
在ECS任务定义的容器配置中添加stopTimeout参数(单位秒),当容器收到终止信号后,超过该时间会被强制终止。注意这是辅助手段,必须配合方案一使用——因为Step Functions超时本身不会主动给容器发终止信号,只有调用stopTask才会触发这个流程。
容器定义示例片段:
"containerDefinitions": [ { "name": "container-${env:STACK_NAME}", "image": "your-image", "stopTimeout": 30, // 其他配置... } ]
方案三:用CloudWatch事件+Lambda实现自动终止
如果不想修改状态机流程,可以通过CloudWatch事件监听Step Functions的超时失败事件,触发Lambda函数终止对应的Fargate任务:
- 创建CloudWatch事件规则:
- 事件源选择
Step Functions,事件类型为State Machine Execution Status Change - 过滤条件设置为执行状态
FAILED,且错误类型包含States.Timeout
- 事件源选择
- 创建Lambda函数:
- 从CloudWatch事件的payload中提取Step Functions执行的输入/输出数据,找到对应的ECS任务ARN
- 调用ECS的
stopTaskAPI终止任务
- 给Lambda角色配置
ecs:StopTask和states:GetExecutionHistory权限(用于获取执行详情中的任务ARN)
内容的提问来源于stack exchange,提问作者revy
相关产品推荐
相关产品推荐

