AWS Step Function Lambda 错误捕获子句带有新字段的自定义错误

maf*_*ehx 10 amazon-web-services aws-lambda aws-step-functions

该设置是一个带有 Lambda 的 AWS Step Function,它会在 catch 子句中抛出错误,并应将它们添加到链末尾的错误处理程序 Lambda 的事件负载中。这是通过添加结果路径来完成的,例如

"Catch": [ {
  "ErrorEquals": [ "States.ALL" ],
  "ResultPath": "$.error-info",
  "Next": "Error Handler"
}]
Run Code Online (Sandbox Code Playgroud)

如文档中所述: https: //docs.aws.amazon.com/step-functions/latest/dg/concepts-error-handling.html

我现在需要创建包含新字段的自定义错误,比如说一个名为“lambdaName”的新字段。

为此,我将自定义一个错误类,如下所示:

class SFLambdaError extends Error {
    constructor(message,lambdaName){
        super(message)
        this.lambdaName = lambdaName
    }
}

Run Code Online (Sandbox Code Playgroud)

直接测试 Lambda,这会输出所需的新字段并且看起来不错:

Invoke Error    {"errorType":"SFLambdaError","errorMessage":"someNumber.replace is not a function","lambdaName":"testLambdaName","stack": (...)}
Run Code Online (Sandbox Code Playgroud)

但是,当在 Step Function 的流程中实现并输出到事件的“错误信息”中时,新字段会被删除,如下所示:

"error-info": {
    "Error": "SFLambdaError",
    "Cause": "{\"errorType\":\"SFLambdaError\",\"errorMessage\":\"someNumber.replace is not a function\",\"trace\":[\"SFLambdaError: someNumber.replace is not a function\",\"    at Runtime.exports.handler (/var/task/index.js:27:23)\",\"    at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)\"]}"
Run Code Online (Sandbox Code Playgroud)

因此,SF 错误结果路径似乎只允许给出标准错误类字段。

我测试的解决方法是通过错误处理程序另一端的字符串化和解析来传递 errorMessage 中的所有所需字段。但我希望一定有更好的方法。

所以我的问题是:我在文档中监督过什么事情或者更干净的解决方法吗?

谢谢你的帮助!

Che*_*Liu 3

不幸的是没有方便的方法来处理这种情况。解决方法是使用具有内置内部函数的额外状态States.StringToJson


"Catch": [ {
  "ErrorEquals": [ "States.ALL" ],
  "ResultPath": "$.error-info",
  "Next": "Error Handler Preprocessing"
}]

...

"Error Handler Preprocessing": {
  "Type": "Pass",
  "Parameters": {
    "Error.$": "$.error-info.Error",
    "Cause.$": "States.StringToJson($.error-info.Cause)"
  },
  "ResultPath": "$.error-info",
  "Next": "Error Handler"
},

"Error Handler": {
  "Type": "Task",
  ...
}
Run Code Online (Sandbox Code Playgroud)

参考

  • 最初的问题不是要将“lambdaName”发送到错误处理程序吗?这不会那样做。 (2认同)