使用 ResultPath 「Step Functions」工作流程中指定狀態 - AWS Step Functions

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 ResultPath 「Step Functions」工作流程中指定狀態

狀態的輸出可以是其輸入的複本、所產生的結果 (例如,從 Task 狀態之 Lambda 函數的輸出),或輸入和結果的結合。使用 ResultPath 以控制哪些組合會傳遞至狀態輸出。

以下狀態類型可以產生結果,並可包含 ResultPath:

使用 ResultPath 合併任務結果與任務輸入,或選取其中一個。您提供給 ResultPath 的路徑會控制哪些資訊會傳遞到輸出。

注意

ResultPath僅限於使用參考路徑,這會限制範圍,以便它只能識別中的單個節點JSON。請參考路徑參閱 Amazon 各州語言

這些範例是以建立使用 Lambda 的 Step Functions 狀態機教學課程中描述的狀態機器和 Lambda 函數為基礎。完成該教學,並透過在 ResultPath 欄位中嘗試不同路徑來測試不同輸出。

用 ResultPath 於將輸入取代為結果

如果您不指定 ResultPath,預設行為會視為您已指定 "ResultPath": "$"。由於這會告訴狀態以結果取代整個輸入,所以會以來自任務結果的結果完全取代狀態輸入。

下圖顯示 ResultPath 如何以任務結果完全取代輸入。

將輸入取代為 ResultPath。

使用中所述的狀態機和 Lambda 函數建立使用 Lambda 的 Step Functions 狀態機,並將服務整合類型變更為 AWS SDKLambda 函數的整合。若要這樣做,請在Task狀態Resource欄位中指定 Lambda 函數 Amazon 資源名稱 (ARN),如下列範例所示。使用 AWS SDK整合可確保Task狀態結果僅包含不含任何中繼資料的 Lambda 函數輸出。

{ "StartAt":"CallFunction", "States":{ "CallFunction": { "Type":"Task", "Resource":"arn:aws:lambda:us-east-2:123456789012:function:HelloFunction", "End": true } } }

然後,傳遞以下輸入:

{ "comment": "This is a test of the input and output of a Task state.", "details": "Default example", "who": "AWS Step Functions" }

Lambda 函數會提供下列結果。

"Hello, AWS Step Functions!"
提示

您可以在 Step Functions 控制台。若要這麼做,請在主控台的 [執行詳細資訊] 頁面上,選擇 Lambda 「圖表」檢視中的函數。然後,選擇產量步驟詳情窗格中的選項卡以查看此結果。

如果ResultPath未在狀態中指定,或者如果"ResultPath": "$"已設定,則狀態的輸入會由 Lambda 函數的結果取代,且狀態的輸出如下所示。

"Hello, AWS Step Functions!"
注意

ResultPath 是在傳遞至輸出之前,用於在輸入中包含來自結果的內容。但是,如果未指定 ResultPath,預設會是取代整個輸入。

捨棄結果並保留原始輸入

如果您將 ResultPath 設定為 null,其會將原始輸入傳遞給輸出。使用 "ResultPath": null 時,狀態的輸入承載會直接複製到輸出,而不考慮結果。

下圖顯示 Null ResultPath 會如何將輸入直接複製到輸出。

使用將輸入複製到輸出 ResultPath。

用 ResultPath 於將結果包含在輸入中

下圖顯示 ResultPath 如何在輸入中包含結果。

包含輸入 ResultPath

使用建立使用 Lambda 的 Step Functions 狀態機教程中描述的狀態機和 Lambda 函數,我們可以傳遞以下輸入。

{ "comment": "This is a test of the input and output of a Task state.", "details": "Default example", "who": "AWS Step Functions" }

Lambda 函數的結果如下。

"Hello, AWS Step Functions!"

為了保留輸入,插入 Lambda 函數的結果,然後將組合傳遞JSON到下一個狀態,我們可以設置ResultPath為以下內容。

"ResultPath": "$.taskresult"

這包括 Lambda 函數與原始輸入的結果。

{ "comment": "This is a test of input and output of a Task state.", "details": "Default behavior example", "who": "AWS Step Functions", "taskresult": "Hello, AWS Step Functions!" }

Lambda 函數的輸出會附加至原始輸入,做為的值taskresult。輸入 (包括新插入值) 會傳遞到下一個狀態。

您也可以在子節點的輸入中插入結果。將 ResultPath 設定為下列。

"ResultPath": "$.strings.lambdaresult"

使用以下輸入開始執行。

{ "comment": "An input comment.", "strings": { "string1": "foo", "string2": "bar", "string3": "baz" }, "who": "AWS Step Functions" }

Lambda 函數的結果會插入為輸入中strings節點的子系。

{ "comment": "An input comment.", "strings": { "string1": "foo", "string2": "bar", "string3": "baz", "lambdaresult": "Hello, AWS Step Functions!" }, "who": "AWS Step Functions" }

state 輸出現在包括原JSON始輸入,其結果為子節點。

用 ResultPath 於使用結果更新輸入中的節點

下圖顯示了如ResultPath何使用任務結果中的值更新輸入中現有JSON節點的值。

將輸入取代為 ResultPath

使用建立使用 Lambda 的 Step Functions 狀態機教程中描述的狀態機和 Lambda 函數的示例,我們可以傳遞以下輸入。

{ "comment": "This is a test of the input and output of a Task state.", "details": "Default example", "who": "AWS Step Functions" }

Lambda 函數的結果如下。

Hello, AWS Step Functions!

我們可以覆寫現有節點JSON,而不是保留輸入並將結果作為新節點插入。

例如,就像省略或設定 "ResultPath": "$" 會覆寫整個節點一樣,您可以指定要使用結果覆寫的個別節點。

"ResultPath": "$.comment"

由於comment節點已存在於狀態輸入中,因此設ResultPath"$.comment"會以 Lambda 函數的結果取代輸入中的該節點。如果沒有使用 OutputPath 進一步篩選,則將以下會傳遞至輸出。

{ "comment": "Hello, AWS Step Functions!", "details": "Default behavior example", "who": "AWS Step Functions", }

"Hello, AWS Step Functions!"在狀態輸出中"This is a test of the input and output of a Task state."comment節點的值會由 Lambda 函數的結果取代。

用於 ResultPath 將錯誤和輸入都包含在 Catch

使用 Step Functions 狀態機處理錯誤條件 教學示範如何使用狀態機器截獲錯誤。在某些情況下,您可能想要保留原始輸入的錯誤。在 Catch 中使用 ResultPath 以包含錯誤與原始輸入,而不是將其取代。

"Catch": [{ "ErrorEquals": ["States.ALL"], "Next": "NextTask", "ResultPath": "$.error" }]

如果之前的 Catch 陳述式截獲錯誤,它會在狀態輸入內的 error 節點包含結果。例如,透過以下輸入:

{"foo": "bar"}

在截獲錯誤時的狀態輸出如下。

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

如需錯誤處理的詳細資訊,請參閱以下內容: