【问题标题】:AWS Step Function Handle Lambda.UnknownAWS Step 函数句柄 Lambda.Unknown
【发布时间】:2018-09-19 13:28:49
【问题描述】:

我有一个简单的 AWS 状态机,其中包含两个执行 C# lambda 函数的任务状态,以及一个用于处理“States.ALL”的传递状态错误处理程序:

{
  "Comment": "StateMachine1",
  "StartAt": "step1",
  "States": {
    "step1": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:us-east-2:0000:function:step1",
      "Catch": [ {
            "ErrorEquals": ["States.ALL"],
            "Next": "CatchAllFallback"
         } ],
      "Next": "step2"
    },
      "step2": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:us-east-2:0000:function:step2",
        "Catch": [ {
            "ErrorEquals": ["States.ALL"],
            "Next": "CatchAllFallback"
         } ],
      "End": true
    },
     "CatchAllFallback": {
         "Type": "Pass",
         "Result": "This is a fallback from any error code",
         "End": true
      }
  }
}

当其中一个步骤失败时,我将以下内容作为“CatchAllFallback”的输入:

"Error": "Lambda.Unknown",
"Cause": "The cause could not be determined because Lambda did not return an error type."

当我查看 Cloudwatch 日志时,我发现该步骤已超时。我的问题是:如何在我的错误处理程序中获取该信息,而不仅仅是“Lambda.Unknown”?我知道这一定是可能的,但是在花了几个小时搜索网络之后,我不知道该怎么做。任何建议将不胜感激。

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-step-functions


    【解决方案1】:

    我不认为这是默认支持的(但也许有人可以证明我错了?)。这是因为问题的根源。 AWS Step Functions 期望有效的错误类型将此传递到下一个状态,但您的 Lambda 超时,因此无法传递有效的错误类型。

    但是!您可以在 Lambda 中构建解决方法。

    只需检查Context Object 中的RemainingTime,一旦接近超时,您就会抛出异常,然后可以将其映射到有效的错误类型。

    可以使用函数执行剩余时间的信息 在接近超时时指定函数行为

    【讨论】:

    • 我希望我能证明你错了,但我还不能!我仍然没有找到在 Lambda 代码中捕获这些 AWS 异常的方法。但是,感谢有关上下文对象的提示。
    • 我也遇到了同样的问题,也是由于 Lambda 超时
    • @gvasquez 你用上面提到的竞争条件方法解决了吗?
    • @MaiKaYI 不得不调整我的 Lambda 配置,因为它的超时时间太短,无法完成实际操作
    【解决方案2】:

    您的 lambda 需要抛出相关错误,以便 step 函数提供更好的输出,documentation 使用 c# 对此场景进行了解释

    示例

    namespace Example {            
       public class AccountAlreadyExistsException : Exception {
          public AccountAlreadyExistsException(String message) :
             base(message) {
          }
       }
    } 
    
    namespace Example {
       public class Handler {
         public static void CreateAccount() {
           throw new AccountAlreadyExistsException("Account is in use!");
         }
       }
    }
    

    【讨论】:

    • 对于发生在 Lambda 内的C# 代码中的异常,情况确实如此。我说的是 AWS 级别的基础设施异常,例如 lambda 超时。您概述的内容不会捕获或处理这些异常。
    猜你喜欢
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 2018-10-30
    • 2019-03-14
    • 1970-01-01
    相关资源
    最近更新 更多