为什么 AWS 状态机不将执行显示为"timed out",而是显示为"failed"?



我们创建了具有单个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"one_answers"错误"是" states.timeout"。到目前为止,一切都很好。

但是:

  1. 当您查看状态计算机的执行列表时,该执行的状态"失败"。(预期:"超时"。)

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

我猜想以某种方式无法正确地"映射"执行结果,但找不到原因。或者,这只是基于lambda的状态机步骤中的错误?!

与状态计算机执行相关的五个状态。

  • 运行
  • 成功
  • 失败
  • 中止
  • 超时

执行可以运行长达1年。如果状态机器中执行中的一个州之一,则执行失败,不会超时。但是,如果执行运行超过1年,则会看到状态"定时出局"。

请参阅步骤函数限制。

如果执行的运行超过1年限制,则会失败 actest.timeout错误并发出executionStimeDout CloudWatch 公制。

步骤函数中的时间输出状态仅用于步骤函数的执行时间(直到1年),lambda函数的超时状态是状态的失败事件。请记住,您可以在步骤计算机中创建状态"类型":"等待",这样可以节省运行可计费的时间。

最新更新