如何将错误从 child 工作流程填充到 parent 工作流程?

How to populate error from child workflow to parent workflow?

我得到了两个步进函数。 Parent 步进函数调用Child 步进函数并等待结果。它在快乐的场景中按预期工作。但是当 Child 步函数的 lambda 抛出错误并失败时。 Parent step 函数仅接收 States.TaskFailed 来自 lambda 的详细错误代码被省略。有没有办法解决这个错误?

这是我的示例函数:

{
    "Comment": "Parent state machine",
    "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"
            },
            "End": true
        }
    }
}

{
    "Comment": "Child state machine",
    "StartAt": "DoSomethingAndReturn",
    "States": {
        "DoSomethingAndReturn": {
            "Type": "Task",
            "Resource": "arn:aws:states:::lambda:invoke",
            "Parameters":{  
                "FunctionName":"MyFunction"
            },
            "End": true
        }
    }
}

lambda 函数有 50% 的几率抛出错误

class RandomError extends Error {
  name = 'RANDOM_ERROR'
  message = 'Just failed randomly'
}

export const handler = async (event) => {
  const dice = Math.round(Math.random() * 10);
  
  if (dice >= 5) {
    throw new RandomError('Crashed');
  }
  
  return {success: true}
}

如何从 parent 步骤函数 Catch 处理程序中获取 RANDOM_ERROR 错误代码? 这是我从 parent

那里得到的全部信息
{
  "Error": "States.TaskFailed",
  "Cause": "A very big json string and RANDOM_ERROR no where to be found"
}

我也可以 waitForTaskToken 并直接从 lambda 报告成功失败,但我试图避免这种情况(因为必须捆绑 aws-sdk)

一个解决方案是在 Child 状态机中捕获 Lambda 错误并构建一个包含所有必要信息的 object。

例如 Child 可以是:

{
  "Comment": "Child state machine",
  "StartAt": "DoSomethingAndReturn",
  "States": {
    "DoSomethingAndReturn": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "MyFunction"
      },
      "End": true,
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "Next": "Pass",
          "ResultPath": "$.errorDetails"
        }
      ]
    },
    "Pass": {
      "Type": "Pass",
      "End": true,
      "Parameters": {
        "IsSuccessful": false,
        "Details.$": "$.errorDetails"
      }
    }
  }
}

您发现错误,使用 Catch 中的“ResultPath”将所有错误详细信息添加到输入 object。然后使用 Pass 构建最终输出 object.

在 Parent 然后你可以检查 IsSuccessful 并根据它做出决定。