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

如何将子Step Functions工作流的错误传递至父工作流并获取Lambda自定义错误码

我来帮你搞定这个问题!要让父工作流拿到子流Lambda抛出的RANDOM_ERROR自定义错误码,核心是在子状态机里主动处理Lambda的错误,把自定义错误信息明确传递给父流,而不是让默认的失败逻辑把细节藏起来。下面是具体的实现步骤:

1. 修改子状态机:捕获Lambda错误并显式返回自定义错误

原来的子流在Lambda抛出错误后,会默认以TaskFailed状态结束,父流只能拿到States.TaskFailed的通用错误。我们需要给Lambda任务添加Catch块,捕获Lambda的错误,然后用Fail状态把自定义错误码和信息明确输出。

修改后的子状态机定义:

{ 
  "Comment": "Child state machine with explicit error handling", 
  "StartAt": "DoSomethingAndReturn", 
  "States": { 
    "DoSomethingAndReturn": { 
      "Type": "Task", 
      "Resource": "arn:aws:states:::lambda:invoke", 
      "Parameters":{ 
        "FunctionName":"MyFunction" 
      }, 
      "Catch": [
        {
          "ErrorEquals": ["LambdaFunctionError"], // 捕获Lambda抛出的所有错误
          "Next": "HandleLambdaFailure"
        }
      ],
      "End": true 
    },
    "HandleLambdaFailure": {
      "Type": "Fail",
      // 解析Lambda返回的错误字符串,提取自定义错误码
      "Error.$": "States.StringToJson($.Cause).errorType",
      // 提取错误消息
      "Cause.$": "States.StringToJson($.Cause).errorMessage"
    }
  } 
}

关键细节说明:

  • LambdaFunctionError是Step Functions对Lambda抛出错误的统一标识,不管是自定义错误还是内置错误都会触发这个Catch规则。
  • States.StringToJson($.Cause):Lambda抛出的错误会被序列化为JSON字符串存放在$.Cause里,用这个函数把它转成JSON对象,才能提取到你定义的errorType(也就是RANDOM_ERROR)和errorMessage。
  • Fail状态会让子流以明确的错误状态结束,错误码和消息会被直接传递给父流的同步调用结果。

2. 在父状态机中捕获并提取子流的自定义错误

现在子流失败时会返回明确的RANDOM_ERROR错误码,父流可以在Catch块中直接提取这个信息。修改父状态机,添加错误处理逻辑:

{ 
  "Comment": "Parent state machine with child error handling", 
  "StartAt": "CallChildAndWait", 
  "States": { 
    "CallChildAndWait": { 
      "Type": "Task", 
      "Resource": "arn:aws:states:::states:startExecution.sync:2", 
      "Parameters": { 
        "Input":{ 
          "Comment": "Pretent that my input goes here", 
          "AWS_STEP_FUNCTIONS_STARTED_BY_EXECUTION_ID.$": "$$.Execution.Id" 
        }, 
        "StateMachineArn.$": "arn:child-state-machine-step-fn" 
      },
      "Catch": [
        {
          "ErrorEquals": ["States.TaskFailed"], // 捕获子流执行失败的通用错误
          "Next": "ExtractChildError"
        }
      ],
      "End": true 
    },
    "ExtractChildError": {
      "Type": "Pass",
      "Parameters": {
        // 从父流错误的Cause中提取子流的自定义错误码
        "CustomError.$": "$.Cause.ExecutionFailedEventDetails.Error",
        "CustomCause.$": "$.Cause.ExecutionFailedEventDetails.Cause"
      },
      "End": true
    }
  } 
}

关键细节说明:

  • 父流的States.TaskFailed错误的Cause字段包含子流的执行失败详情,其中ExecutionFailedEventDetails里的Error就是子流Fail状态设置的RANDOM_ERROR,Cause是对应的错误消息。
  • 你可以根据需求把ExtractChildError改成Fail状态,或者用这些错误信息做后续处理(比如重试、发送告警等)。

为什么原来的方式拿不到自定义错误?

原来的子流在Lambda抛出错误后,会默认以TaskFailed状态结束,父流收到的是Step Functions封装的States.TaskFailed通用错误,子流内部的Lambda错误细节被嵌套在庞大的Cause字符串中,没有被明确暴露。通过在子流中显式处理错误并返回Fail状态,我们把自定义错误码提升到了父流可以直接获取的层级。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:17:44