首页 > 解决方案 > 为什么 AWS 状态机不会将执行显示为“超时”,而是显示为“失败”?

问题描述

我们使用单个 AWS Lambda 步骤创建了一个最小状态机。然后将状态机描述符中步骤的超时时间设置为低值。

它随着超时正确终止,但结果是“失败”而不是“超时”。我想知道为什么?

重现步骤

  1. 创建一个简单的 Lambda 函数,这将是一个长时间运行的过程。为了简单起见,创建一个 Python 脚本并让函数休眠几秒钟:

    import time
    
    def lambda_handler(event, context):
        time.sleep(10)   # Delays for 10 seconds.
        return event 
    
  2. 将 Lambda 函数的超时设置为 30 秒。(它实际上永远不会超时。)

  3. 创建一个简单的状态机,它将以 5 秒的超时时间调用此 Lambda:

    {
        "StartAt": "Execute Lambda",
        "States" : {
           "Execute Lambda" : {
               "Type" : "Task", 
               "Resource": "arn:aws:lambda:eu-west-1:**********:function:helloWorld",
               "TimeoutSeconds" : 5, 
               "Retry": [
                   {
                        "ErrorEquals": ["States.ALL"],
                        "MaxAttempts": 0
                   }
                ],
                "End" : true
            }
        }
    }
    
  4. 开始执行。

结果

根据“执行事件历史”,最后一个事件是“ExecutionFailed”,“错误”是“States.Timeout”。到目前为止,一切都很好。

但:

  1. 当您查看状态机的执行列表时,此执行的状态为“失败”。(预期:“超时”。)

  2. 当您查看状态机列表时,此执行会增加“失败”列中的计数器。(预期:增加“超时”列中的计数器。)

我猜想不知何故,执行结果没有正确“映射”,但找不到原因。或者,这只是基于 Lambda 的状态机步骤中的一个错误?!

标签: amazon-web-servicesaws-lambdaaws-step-functions

解决方案


Step Function 中的 Timed Out 状态仅针对 Step Function 的执行时间(直到 1 年),您的 lambda 函数的超时状态是 State 的 Failed 事件。请记住,您可以在您的步进机器中创建一个状态“类型”:“等待”,这样您就可以节省运行可计费的 lambda 的时间。


推荐阅读