Step Function超时未终止运行中Fargate任务问题咨询
你当前使用arn:aws:states:::ecs:runTask.waitForTaskToken集成模式时,Step Function仅会等待外部回传任务令牌的成功/失败信号,状态机自身触发超时后不会主动关联终止已经启动的Fargate任务,这是该集成模式的默认行为。
可根据你的业务需求选择以下两种方案解决:
方案1:无需保留自定义任务令牌回传逻辑,直接换同步集成模式
如果不需要在容器内自定义回传逻辑,可以直接将Fargate任务的Resource替换为arn:aws:states:::ecs:runTask.sync,该模式下Step Function会自动绑定Fargate任务生命周期,状态机超时、失败时会自动终止对应的Fargate任务,无需额外开发。
方案2:需要保留现有任务令牌回传逻辑,新增超时兜底分支
如果需要保留当前容器内主动回传结果的逻辑,可以通过Parallel状态嵌套双分支实现超时自动清理:
- 分支1:保留现有Fargate任务的正常执行逻辑
- 分支2:设置与Fargate任务超时时间一致的Wait状态,超时后触发Lambda终止对应的Fargate任务,再抛出超时错误
第一步:修改Step Function配置
{ "StartAt": "FargateTaskWithTimeout", "States": { "FargateTaskWithTimeout": { "Type": "Parallel", "Next": "pass-state", "Catch": [ { "ErrorEquals": [ "States.ALL" ], "Next": "fail-state" } ], "ResultSelector": { "extractor_output.$": "$[0].extractor_output" }, "Branches": [ { "StartAt": "Fargate-task", "States": { "Fargate-task": { "End": true, "Type": "Task", "TimeoutSeconds": 60, "ResultPath": "$.extractor_output", "Resource": "arn:aws:states:::ecs:runTask.waitForTaskToken", "Parameters": { "Cluster": "<你的ECS集群ARN>", "TaskDefinition": "<你的任务定义ARN>", "LaunchType": "FARGATE", "NetworkConfiguration": { // 替换为你的原有网络配置 }, "Overrides": { "ContainerOverrides": [ { "Name": "<你的容器名>", "Environment": [ { "Name": "TASK_TOKEN", "Value.$": "$$.Task.Token" } ] } ] } } } } }, { "StartAt": "WaitForFargateTimeout", "States": { "WaitForFargateTimeout": { "Type": "Wait", "Seconds": 60, "Next": "StopRunningFargateTask" }, "StopRunningFargateTask": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "FunctionName": "<清理Fargate任务的Lambda ARN>", "Payload": { "task_arn.$": "$[0].tasks[0].taskArn", "cluster_arn": "<你的ECS集群ARN>" } }, "Next": "ThrowTimeoutError" }, "ThrowTimeoutError": { "Type": "Fail", "Error": "FargateTaskTimeout", "Cause": "Fargate任务执行超时已被自动终止" } } } ] }, "pass-state": { "Type": "Pass", "Next": "Lambda Worker" }, "Lambda Worker": { "Type": "Map", "End": true, "Iterator": { "StartAt": "LambdaWorker", "States": { "LambdaWorker": { "End": true, "Retry": [ { "ErrorEquals": [ "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException" ], "IntervalSeconds": 2, "MaxAttempts": 6, "BackoffRate": 2 } ], "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "FunctionName": "<LAMBDA>", "Payload.$": "$" } } } }, "ItemsPath": "$.extractor_output", "MaxConcurrency": 10 }, "fail-state": { "Type": "Fail" } } }
第二步:编写清理Fargate任务的Lambda代码(Python示例)
import boto3 ecs_client = boto3.client('ecs') def lambda_handler(event, context): ecs_client.stop_task( cluster=event['cluster_arn'], task=event['task_arn'], reason='Step Function 执行超时,自动终止Fargate任务' ) return {"status": "stopped"}
权限配置注意
需要给Step Function的执行角色添加调用清理Lambda的权限,同时给清理Lambda的执行角色添加ecs:StopTask权限。
内容的提问来源于stack exchange,提问作者Frankster
相关产品推荐
相关产品推荐

