簡體   English   中英

如何使用 AWS Step Functions 將失敗任務的輸入和錯誤傳遞給回退任務?

[英]How can I pass the input and error of my failing task to a fallback task using AWS Step Functions?

我正在嘗試向我的步驟函數狀態機添加一些錯誤處理,並且我在特定場景中遇到了問題,例如,如果我在某個步驟上失敗了,我可以將其發送到另一個函數,但是在該功能我需要使用最后一步輸入數據(失敗的那個)來執行邏輯,但是,我只是收到一個錯誤,有沒有辦法傳遞帶有錯誤的輸入數據?

Send Notification:
        Type: Task
        Resource: !GetAtt CommunicationSendCertifiedEmail.Arn
        Retry:
          - ErrorEquals:
            - TierOneError
            IntervalSeconds: 2
            MaxAttempts: 9
            BackoffRate: 1.5
          - ErrorEquals:
            - TierTwoError
            IntervalSeconds: 4
            MaxAttempts: 6
            BackoffRate: 1.5
          - ErrorEquals:
            - TierThreeError
            IntervalSeconds: 4
            MaxAttempts: 3
            BackoffRate: 2
          - ErrorEquals:
            - States.Timeout
            - States.Runtime
            - States.TaskFailed
            - Lambda.ServiceException
            IntervalSeconds: 4
            MaxAttempts: 3
            BackoffRate: 2
        Catch:
          - ErrorEquals:
            - States.ALL
            Next: Send Email Notification

在“發送電子郵件通知”上是我在執行失敗之前需要輸入的地方,但正如我之前所說,我只是得到這樣的東西:

{
  "Error": "Error",
  "Cause": "{\"errorType\":\"Error\",\"errorMessage\":...
}

我想得到這樣的東西:

{
  "data": "{...}",
  "Error": "Error",
  "Cause": "{\"errorType\":\"Error\",\"errorMessage\":...
}

有任何想法嗎? 甚至有可能嗎?

Catch使用ResultPath將錯誤包含在原始輸入中,而不是替換它。

結果路徑(可選)

確定將哪些輸入發送到 Next 字段中指定的狀態的路徑。


如果未指定ResultPath字段,則默認為$

這將選擇並覆蓋整個輸入以將其替換為狀態輸出(在這種情況下是錯誤的),這就是為什么您沒有獲得任何輸入數據的原因。

這是一個示例 -這不是您想要的,而是當前正在發生的事情

在此處輸入圖片說明


為錯誤輸出應該去的位置指定一個ResultPath

這樣一來,它會采取的狀態輸出(這是一個錯誤在這種情況下),並包括它與輸入。

這不會覆蓋所有狀態輸入,這允許您保留輸入。

這是一個例子 -這就是你想要的

在此處輸入圖片說明


嘗試:

Catch:
  - ErrorEquals:
    - States.ALL
    Next: Send Email Notification
    ResultPath: $.error

如果前面的Catch聲明捕獲了一個錯誤,它會包括一個錯誤輸出error狀態下輸入節點(節點被稱為error ,因為我們指定的路徑是$.error )。

這就像上面的第二個圖。


例如,如果發送通知的狀態輸入是:

{
    "foo": "bar"
}

當捕獲錯誤時,發送到Send Email Notification的狀態輸出將如下所示。

{
  "foo": "bar",
  "error": {
    "Error": "Error here"
  }
}

它也可能是下面的,因為對象通常還包含Cause字段(就像你的情況一樣)。 該字段的值是人類可讀的錯誤描述。

{
  "foo": "bar",
  "error": {
    "Error": "Error here",
    "Cause": "{\"errorType\":\"Error\",\"errorMessage\"
  }
}

重要的提示:

根據您的輸入數據為error節點選擇一個唯一的名稱,因為我剛剛將error用於演示目的。

如果指定的節點已經存在,例如您已經有一個名稱為error的字段,則ResultPath將使用您不想要的錯誤輸出更新並覆蓋該節點。

一張圖片值一千字,所以這是使用ResultPath可能的第三條路徑(同樣,這不是你想要的):

在此處輸入圖片說明


如果您好奇,最后一條可能的路徑(與問題無關但很高興知道)是丟棄狀態結果(您需要它,因此它不相關)並保留原始輸入。

設置ResultPathnull實現這一點,因為概述這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM