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

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].taskArn
  • StopFargateTask状态调用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任务:

  1. 创建CloudWatch事件规则:
    • 事件源选择Step Functions,事件类型为State Machine Execution Status Change
    • 过滤条件设置为执行状态FAILED,且错误类型包含States.Timeout
  2. 创建Lambda函数:
    • 从CloudWatch事件的payload中提取Step Functions执行的输入/输出数据,找到对应的ECS任务ARN
    • 调用ECS的stopTask API终止任务
  3. 给Lambda角色配置ecs:StopTask和states:GetExecutionHistory权限(用于获取执行详情中的任务ARN)

内容的提问来源于stack exchange,提问作者revy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 09:45:36