You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 22:36:03