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

如何在AWS Step Functions捕获块中获取MapRunArn和ResultWriterDetails

问题:AWS Step Functions分布式Map捕获错误时丢失MapRunArn等关键信息

我基于AWS CDK开发涉及Step Functions的项目,当前正在实现全局错误处理机制。方案采用分布式Map,用ResultsWriter将结果写入S3,同时通过Catch块捕获ItemProcessor中的错误。

但遇到一个问题:Catch块捕获错误时,会丢失MapRunArn这类关键信息,而该信息是识别S3中对应ResultsWriter结果的核心依据。

简化的Step Functions定义(非CDK)

{
  "Comment": "A description of my state machine",
  "StartAt": "TestDistributedMap",
  "States": {
    "TestDistributedMap": {
      "Type": "Map",
      "ItemProcessor": {
        "ProcessorConfig": {
          "Mode": "DISTRIBUTED",
          "ExecutionType": "STANDARD"
        },
        "StartAt": "Fail",
        "States": {
          "Fail": {
            "Type": "Fail"
          }
        }
      },
      "Label": "TestDistributedMap",
      "MaxConcurrency": 1000,
      "ResultWriter": {
        "Resource": "arn:aws:states:::s3:putObject",
        "Parameters": {
          "Bucket": "<some-bucket>",
          "Prefix": "testDistributedMap"
        }
      },
      "Next": "Pass (1)",
      "Catch": [
        {
          "ErrorEquals": ["States.ALL"],
          "Next": "Pass (1)",
          "ResultPath": "$"
        }
      ]
    },
    "Pass (1)": {
      "Type": "Pass",
      "End": true
    }
  }
}

实际运行现象

  • 失败场景:Pass (1)收到的输入仅包含错误信息,丢失了MapRunArn等数据:
{
  "Error": "States.ExceedToleratedFailureThreshold",
  "Cause": "The specified tolerated failure threshold was exceeded"
}
  • 成功场景:Pass (1)能正常收到完整的Map运行信息:
{
  "MapRunArn": "<maprun-arn>",
  "ResultWriterDetails": {
    "Bucket": "someBucket",
    "Key": "testDistributedMap/<distributed-maprun-id>/manifest.json"
  }
}

我需要在错误处理场景中也能获取MapRunArn和ResultWriterDetails进行后续处理,请问该如何解决?


解决方案

问题根源

当前配置中,Catch块的ResultPath设为"$",这会用错误信息完全覆盖Map状态原本的输出(包括MapRunArn和ResultWriterDetails)。这是Step Functions的默认行为:当Catch块触发时,若ResultPath配置为根路径,错误信息会替换掉原有的状态输出。

解决步骤

调整ResultPath的配置,将错误信息合并到原有输出中,而非覆盖,具体有两种方式:

1. 将错误信息写入指定字段(推荐)

修改Catch块的ResultPath为类似"$.errorDetails",这样错误信息会被添加到原有输出的errorDetails字段中,同时保留MapRunArn和ResultWriterDetails:

"Catch": [
  {
    "ErrorEquals": ["States.ALL"],
    "Next": "Pass (1)",
    "ResultPath": "$.errorDetails"
  }
]

此时错误场景下Pass (1)的输入会变成:

{
  "MapRunArn": "<maprun-arn>",
  "ResultWriterDetails": {
    "Bucket": "someBucket",
    "Key": "testDistributedMap/<distributed-maprun-id>/manifest.json"
  },
  "errorDetails": {
    "Error": "States.ExceedToleratedFailureThreshold",
    "Cause": "The specified tolerated failure threshold was exceeded"
  }
}

2. 保留原始输入+错误信息(可选)

如果需要同时保留Map状态的输入和错误信息,可以结合InputPath和ResultPath实现更复杂的结构,但第一种方式已经能满足核心需求。

CDK中的实现调整

在AWS CDK中,通过MapOptions的catch属性配置:

import * as sfn from 'aws-cdk-lib/aws-stepfunctions';

// 定义Map状态
const testDistributedMap = new sfn.Map(this, 'TestDistributedMap', {
  label: 'TestDistributedMap',
  maxConcurrency: 1000,
  resultWriter: sfn.ResultWriter.s3PutObject('<some-bucket>', {
    prefix: 'testDistributedMap',
  }),
  itemProcessor: sfn.Processor.fromStateMachine(
    new sfn.StateMachine(this, 'ItemProcessor', {
      definition: new sfn.Fail(this, 'Fail'),
    }),
    {
      mode: sfn.ProcessorMode.DISTRIBUTED,
      executionType: sfn.ExecutionType.STANDARD,
    }
  ),
  next: passState,
});

// 配置Catch块,设置ResultPath
testDistributedMap.addCatch(passState, {
  errors: [sfn.Errors.ALL],
  resultPath: '$.errorDetails', // 关键配置:将错误写入指定字段
});

调整后,错误场景下就能同时获取到MapRunArn、ResultWriterDetails和错误信息,满足后续处理需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:43:22