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

如何获取Step Machine ID并在Lambda中访问传递错误栈引用

问题描述

需求为当Step Functions执行失败时,需完成三项操作:

  • 捕获错误
  • 发送通知,通知需包含故障的精确引用标识
  • 执行错误处理(流程回滚)

当前异常发生时,回溯信息中仅可获取request-id,可用信息十分有限,相关规则可参考Lambda Python上下文官方说明。

已尝试过以下方案均未解决问题:

  • 读取context变量
  • 排查boto3相关接口寻找临时变通方案
  • 查询Step function ResultSet数据(该数据不提供错误ID)

咨询目标:如何获取精确的栈引用信息,将其传递给Lambda或在Lambda内部直接访问?


可行解决方案

1. 利用Step Functions内置Catch规则透传完整错误上下文

这是零额外调用成本的最优方案,不需要额外对接其他接口:
在状态机的全局错误捕获块、或每个可能出错的节点上配置Catch规则,通过ResultPath将完整错误信息存入指定字段,避免错误抛出时覆盖原始执行上下文。配置示例如下:

"Catch": [
  {
    "ErrorEquals": ["States.ALL"],
    "Next": "ErrorProcessingLambda",
    "ResultPath": "$.captured_error"
  }
]

配置完成后,错误处理Lambda接收到的输入中,$.captured_error会自动携带核心故障信息,足够作为精确引用使用:

  • 全局唯一的执行ARN(可直接作为故障ID)
  • 出错节点的具体状态名
  • 错误类型、原始错误信息
  • 若为Lambda调用类错误,会附带对应Lambda的请求ID、原始错误栈

之前仅能拿到request-id,核心原因是未配置ResultPath时,错误触发后会直接覆盖原始输入,仅透传最外层的少量错误元数据。

2. 通过状态机Context对象主动注入引用标识

如果需要明确指定传递给Lambda的字段,可以直接在调用Lambda的节点配置中,通过Parameters字段引用Step Functions内置的Context对象,将需要的标识主动注入Lambda入参,不需要依赖错误透传:

"Parameters": {
  "execution_arn.$": "$$.Execution.Id",
  "failed_state.$": "$$.State.Name",
  "retry_count.$": "$$.State.RetryCount",
  "error_payload.$": "$.captured_error",
  "original_input.$": "$"
},
"Resource": "arn:aws:lambda:<region>:<account-id>:function:<error-handler-function-name>"

其中$$.Execution.Id是整个Step Functions执行的全局唯一标识,全链路通用,完全满足故障精确引用的要求。

注意:Lambda的context变量仅存储当前Lambda调用本身的元数据,本身不感知上层Step Functions的执行信息,直接读取context拿不到对应栈引用是正常表现。

3. Lambda运行时动态拉取完整执行历史

如果需要在Lambda内部自主获取完整栈信息,不要查询ResultSet(ResultSet仅存储执行最终输出,不保留中间节点事件),直接调用boto3的get_execution_history接口,调用时传入当前执行ARN,将includeExecutionData参数设为True,即可拉取整个执行过程的全量事件流,包括每个节点的入参、出参、错误详情、时间戳,信息完整度高于控制台展示的执行详情。
调用示例:

import boto3
sf_client = boto3.client("stepfunctions")

def lambda_handler(event, context):
    # execution_arn从之前注入的入参中获取
    execution_arn = event["execution_arn"]
    resp = sf_client.get_execution_history(
        executionArn=execution_arn,
        includeExecutionData=True,
        reverseOrder=True # 倒序拉取优先拿到错误事件
    )
    # 遍历resp["events"]即可拿到完整错误栈信息

4. 开启X-Ray全链路追踪

给Step Functions状态机、关联的Lambda都开启X-Ray追踪后,全链路会生成唯一的Trace ID,该ID会自动注入Lambda运行时的_X_AMZN_TRACE_ID环境变量中,通知中携带该ID即可直接在X-Ray控制台拉取跨服务的完整调用栈、关联日志,定位效率远高于单一request-id,也可作为故障的精确引用标识。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:31:11