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

如何将Lambda和Step Function Context直接添加到AWS Catch语句结果中?

在AWS Step Functions Catch语句中获取出错状态的上下文信息

背景

我在Node.js环境中使用AWS Lambda,已明确以下要点:

  • Lambda Context会作为第二个参数传入handler;
  • Step Function Context可通过Parameters步骤添加到Lambda输入;
  • ResultSelector可给结果附加数据,但在Catch语句中无效;
  • 可通过Pass状态在节点间传递附加数据;
  • Catch语句中可用ResultPath将错误附加到输入。

需求目标

除错误信息外,需将以下内容加入Catch的最终输出,传递给后续步骤:

  • 出错Lambda的Lambda Context
  • 出错Step State对应的Step Function Context(仅需State键,其余Execution、StateMachine等全局字段无需重复)

现有挑战

  • 若通过Parameters将Step Function Context传入Lambda,修改后的输入无法通过ResultPath访问(ResultPath仅引用原始输入);
  • Catch与后续步骤间的Pass状态无法获取出错前的State Context;
  • 当前代码可轻松获取Lambda Context,但修改所有Lambda输入以传入Step Function Context成本过高。

问题

是否存在无需大量修改代码的方法,能在Catch结果中直接附加出错状态的Step Function Context,同时保留ResultPath原本的输入和错误信息?


解决方案

方法1:直接在Catch块中引用Step Functions内置上下文变量

Step Functions允许在Catch块的Parameters中直接使用$$开头的内置上下文变量,无需提前传入Lambda。你可以通过这种方式注入出错状态的信息,结合ResultPath保留原始数据。

示例Step Functions状态配置:

{
  "States": {
    "MyFaultyLambda": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:MyLambda",
      "Catch": [
        {
          "ErrorEquals": ["States.ALL"],
          "ResultPath": "$.errorMetadata",
          "Parameters": {
            "originalInput.$": "$",
            "errorDetails.$": "$$.States.Error",
            "failedStateName.$": "$$.State.Name",
            "lambdaRequestId.$": "$$.States.Error.Cause.awsRequestId"
          },
          "Next": "ProcessError"
        }
      ],
      "Next": "Proceed"
    }
  }
}
  • $$.State.Name直接获取出错状态的名称(即你需要的State键值);
  • $$.States.Error.Cause中包含Lambda抛出的错误详情,其中默认会带有awsRequestId等Lambda Context相关字段;
  • ResultPath: "$.errorMetadata"将合并后的错误及上下文数据附加到原始输入中,不覆盖原有内容。

方法2:Lambda中主动附加必要上下文(少量代码修改)

如果你需要更完整的Lambda Context,可以在Lambda中捕获错误时,将Lambda Context的关键字段附加到错误对象中抛出,后续在Catch块中直接读取:

exports.handler = async (event, context) => {
  try {
    // 业务逻辑代码
    throw new Error("业务处理失败");
  } catch (err) {
    // 附加Lambda Context关键信息
    err.lambdaContext = {
      functionName: context.functionName,
      awsRequestId: context.awsRequestId,
      functionVersion: context.functionVersion
    };
    // 重新抛出错误,Step Functions会序列化该对象到Error.Cause中
    throw err;
  }
};

之后在Catch块的Parameters中,就可以通过$$.States.Error.Cause.lambdaContext获取完整的自定义Lambda Context,结合$$.State.Name得到出错状态信息,再通过ResultPath合并到输出中。

关键提示

  • 无需通过Parameters将Step Function Context传入Lambda,Catch块中直接访问$$.State等内置变量即可获取状态信息;
  • ResultSelector在Catch中确实无效,但Parameters支持在Catch块中使用上下文变量,这是实现需求的核心;
  • 两种方法都避免了大规模修改现有Lambda输入结构,仅需调整Step Functions配置或少量Lambda错误处理代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:27:46