本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Step Functions 中設定工作流程輸入和輸出
在上一個主題中執行工作流程 ,您學會了如何執行工作流程。在本主題中,您將學習如何在資料在狀態之間傳遞時選取、篩選和操作資料。
Step Functions 執行會接收JSON文字做為輸入,並將該輸入傳遞至工作流程中的第一個狀態。工作流程中的個別狀態會接收JSON資料做為輸入,通常會將JSON資料作為輸出傳遞至下一個狀態。根據預設,除非您已設定輸入和/或輸出,否則資料會從工作流程中的一個狀態傳遞到下一個狀態。瞭解資訊如何從狀態流向另一個狀態,以及學習如何篩選和操作這些資料,是在 Step Functions 中有效設計和實作工作流程的關鍵。
Step Functions 提供了以下過濾器來控制狀態之間的輸入和輸出數據流:
注意
根據您的使用案例,您可能不需要在工作流程中套用所有這些篩選器。
InputPath
-
選取整個輸入有效負載的一WHAT部分,以用作工作的輸入。如果您指定此欄位,「Step Functions」會先套用此欄位。
參數
-
指定輸HOW入應該看起來像調用任務之前。使用該
Parameters
字段,您可以創建鍵-值對的集合,這些鍵值對被作為輸入傳遞給 AWS 服務 整合,例如 AWS Lambda 功能。這些值可以是靜態的,也可以是從狀態輸入或工作流程前後關聯物件動態選取的。 ResultSelector
-
決WHAT定從工作的輸出中進行選擇。使用該
ResultSelector
字段,您可以創建鍵值對的集合,以替換狀態的結果並將ResultPath
該集合傳遞給。 使用 ResultPath 「Step Functions」工作流程中指定狀態
-
決定WHERE要放置工作的輸出。使用
ResultPath
來判斷狀態的輸出是其輸入的副本、產生的結果,還是兩者的組合。 OutputPath 在 Step Functions 工作流程中篩選狀態輸出
-
決定WHAT要傳送至下一個狀態。使用
OutputPath
,您可以過濾掉不需要的信息,並僅傳遞您關心的JSON數據部分。
提示
Parameters
和ResultSelector
篩選器的運作方式是建構JSON,而InputPath
和篩選OutputPath
器則是透過篩選JSON資料物件內的特定節點來運作,而ResultPath
篩選器的運作方式是建立可在其下新增輸出的欄位。
若要取得有關在工作流程中配置輸入和輸出的更多資訊,請參閱在 Step Functions 中處理輸入和輸出。
篩選和操作輸入和結果
使用 InputPath 濾鏡選擇原始輸入的特定部分
使用InputPath
篩選器選取輸入有效負載的特定部分。
如果未指定InputPath
,則其值預設為$
,這會導致狀態的工作參照整個原始輸入,而不是特定部分。
若要瞭解如何使用InputPath篩選器,請執行下列步驟:
步驟 1:建立狀態機
重要
確保您的狀態機處於相同狀態 AWS 帳戶和區域做為您先前建立的 Lambda 函數。
-
使用您在教學課程 4 中學到的
Parallel
狀態範例來建立新的狀態機。請確定您的工作流程原型看起來與下列原型相似。 -
設定
check-identity
和check-address
Lambda 函數的整合。如需建立 Lambda 函數並在狀態機器中使用它們的相關資訊,請參閱步驟 1:建立 Lambda 函數以執行所需的檢查和步驟 2:更新工作流程 — 新增要執行的 parallel 工作。 -
對於裝載,請確定您保留 [使用狀態輸入作為裝載] 的預設選取項目。
-
選擇 [下一步],然後執行教學課程 5 中步驟 1:保存狀態機的步驟 1 到 3,以建立新的狀態機器。在本教學課程中,請為您的狀態機命名
WorkflowInputOutput
。
步驟 2:運行狀態機
-
在WorkflowInputOutput頁面上,選擇 [開始執行]。
-
(選擇性) 輸入自訂執行名稱,以覆寫產生的預設值。
非ASCII名稱和記錄
Step Functions 接受包含非ASCII字元的狀態機器、執行項目、活動和標籤的名稱。由於此類字元不適用於 Amazon CloudWatch,因此我們建議您僅使用ASCII字元,以便在中追蹤指標 CloudWatch。
-
在「輸入」區域中,新增下列JSON資料做為執行輸入。
{ "data": { "firstname": "Jane", "lastname": "Doe", "identity": { "email": "jdoe@example.com", "ssn": "123-45-6789" }, "address": { "street": "123 Main St", "city": "Columbus", "state": "OH", "zip": "43219" } } }
-
選擇 Start execution (開始執行)。
-
狀態機器執行會導致錯誤,因為您尚未指定
check-identity
和check-address
Lambda 函數必須使用哪些執行輸入部分來執行所需的身分識別和地址驗證。 -
請繼續執行本自學課程的步驟 3 以修正錯誤。
步驟 3:使用InputPath
篩選器選取執行輸入的特定部分
-
在 [執行詳細資訊] 頁面上,選擇編輯狀態機器。
-
若要驗證申請人在中提供的執行輸入中所述的身份步驟 2:運行狀態機,請編輯「驗證身份」任務定義,如下所示:
... { "StartAt": "Verify identity", "States": { "Verify identity": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "InputPath": "$.data.identity", "Parameters": { "Payload.$": "$", "FunctionName": "arn:aws:lambda:us-east-2:123456789012:function:check-identity:$LATEST" }, "End": true } } } ...
因此,下列JSON資料會變成可用作
check-identity
函數的輸入。{ "email": "jdoe@example.com", "ssn": "123-45-6789" }
-
若要驗證執行輸入中所述的應徵者地址,請依照下列方式編輯
Verify address
作業定義:... { "StartAt": "Verify address", "States": { "Verify address": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "InputPath": "$.data.address", "Parameters": { "Payload.$": "$", "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:check-address:$LATEST" }, "End": true } } } ...
因此,下列JSON資料會變成可用作
check-address
函數的輸入。{ "street": "123 Main St", "city": "Columbus", "state": "OH", "zip": "43219" }
-
選擇 Start execution (開始執行)。狀態機執行現在已成功完成。
使用「參數」篩選器操作選取的輸入
雖然InputPath
篩選器可協助您限制您提供的原始JSON輸入,但使用Parameters
篩選器,您可以傳遞一組索引鍵值組作為輸入。這些鍵值配對可以是您在狀態機定義中定義的靜態值,也可以是使用InputPath
從原始輸入中選取的值。
在您的工作流程中,Parameters
會在之後套用InputPath
。 Parameters
協助您指定基礎工作如何接受其輸入裝載。例如,如果 check-address
Lambda 函數接受字串參數做為輸入而非JSON資料,您可以使用Parameters
篩選器來轉換輸入。
在下列範例中,Parameters
篩選器會接收您使用 InputPath
in 選取的輸入,步驟 3:使用InputPath篩選器選取執行輸入的特定部分並在輸入項目States.Format
上套用內建函數,以建立名為的字串。addressString
內建函式可協助您在指定輸入上執行基本的資料處理作業。如需詳細資訊,請參閱適用於步驟函數工作流程的 Amazon 州語言中的內建函數。
"Parameters": { "addressString.$": "States.Format('{}. {}, {} - {}', $.street, $.city, $.state, $.zip)" }
因此,會建立下列字串,並提供給 check-address
Lambda 函數做為輸入。
{ "addressString": "123 Main St. Columbus, OH - 43219" }
使用 ResultSelector、 ResultPath和 OutputPath 篩選器設定輸出
在WorkflowInputOutput狀態機器中叫用 check-address
Lambda 函數時,函數會在執行位址驗證後傳回輸出裝載。在 [執行詳細資料] 頁面上,選擇 [驗證位址] 步驟,並在步驟詳情窗格的 [工作結果] 內檢視輸出承載。
{ "ExecutedVersion": "$LATEST", "Payload": { "statusCode": 200, "body": "{\"approved\":true,\"message\":\"identity validation passed\"}" }, "SdkHttpMetadata": { "AllHttpHeaders": { "X-Amz-Executed-Version": [ "$LATEST" ], ... ... "StatusCode": 200 }
使用 ResultSelector
如果您需要將身分識別和位址驗證檢查的結果提供給工作流程中的下列狀態,您可以選取輸出中的 payload.Body 節點,JSON並使用ResultSelector
篩選器中的StringToJson
內建函數,視需要將資料格式化。
ResultSelector
從工作輸出中選取需要的項目。在下面的例子中,ResultSelector
採用 $.payload.body 的字符串,並應用States.StringToJson
內部函數將字符串轉換為JSON並將生成的標識節點內。JSON
"ResultSelector": { "identity.$": "States.StringToJson($.Payload.body)" }
因此,會建立下列JSON資料。
{ "identity": { "approved": true, "message": "Identity validation passed" } }
當您使用這些輸入和輸出篩選器時,您可能會看到來自無效運JSONpath算式的執行階段錯誤。
使用 ResultPath
您可以在初始輸入有效負載中指定位置,以使用ResultPath
欄位儲存狀態的任務處理結果。如果未指定ResultPath
,則其值預設為$
,這會使初始輸入有效負載取代為原始工作結果。如果指定ResultPath
為null
,則會捨棄原始結果,且初始輸入有效負載會成為有效輸出。
如果您在使用ResultPath
欄位建立的JSON資料上套用ResultSelector
欄位,則任務結果會新增至輸入裝載的結果節點內,如下列範例所示:
{
"data": {
"firstname": "Jane",
"lastname": "Doe",
"identity": {
"email": "jdoe@example.com",
"ssn": "123-45-6789"
},
"address": {
"street": "123 Main St",
"city": "Columbus",
"state": "OH",
"zip": "43219"
},
"results": {
"identity": {
"approved": true
}
}
}
使用 OutputPath
您可以在應用程式之後選取狀態輸出的一部分,以傳遞ResultPath
至下一個狀態。使用這種方法,您可以過濾掉不需要的信息,並僅傳遞所需JSON的部分。
在下列範例中,OutputPath
欄位會將狀態輸出儲存在結果節點內:"OutputPath": "$.results"
。因此,狀態的最終輸出,您可以傳遞到下一個狀態如下:
{
"addressResult": {
"approved": true,
"message": "address validation passed"
},
"identityResult": {
"approved": true,
"message": "identity validation passed"
}
}
使用控制台功能可視化輸入和輸出數據流
您可以使用 Step Functions 主控台的資料流程模擬器或 [執行詳細資訊] 頁面中的 [進階檢視] 選項,以視覺化方式呈現工作流程中各狀態之間的輸入和輸出資
使用「參數」欄位操作選取的輸入
雖然InputPath
欄位可協助您限制您提供的原始JSON輸入,但使用Parameters
欄位,您可以傳遞一組索引鍵值組作為輸入。這些鍵值配對可以是您在狀態機定義中定義的靜態值,也可以是使用InputPath
從原始輸入中選取的值。
在您的工作流程中,Parameters
會在之後套用InputPath
。 Parameters
協助您指定基礎工作如何接受其輸入裝載。例如,假設如果 check-address
Lambda 函數接受字串參數做為輸入而非JSON資料,您可以使用Parameters
欄位來轉換輸入。
在下列範例中,Parameters
欄位會接收您在使用 InputPath 濾鏡選擇原始輸入的特定部分區段InputPath
中使用所選取的輸入,並將內建函States.Format
式套用至輸入項目,以建立名為的字串。addressString
內建函式可協助您在指定輸入上執行基本的資料處理作業。如需詳細資訊,請參閱內建函式。
"Parameters": { "addressString.$": "States.Format('{}. {}, {} - {}', $.street, $.city, $.state, $.zip)" }
因此,會建立下列字串,並提供給檢查位址 Lambda 函數做為輸入。
注意
如果您使用此範例更新輸入並執行狀態機器,則會傳回錯誤,因為 Lambda 函數不接受更新格式的輸入。
{ "addressString.$": "123 Main St. Columbus, OH - 43219" }
後續步驟
在最後一個主題中偵錯錯誤,您將學習如何在 Step Functions 工作流程中偵錯錯誤。