本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
管理狀態和轉換資料
Step Functions 最近新增了變數,並JSONata管理狀態和轉換資料。
了解如何使用變數傳遞資料,以及使用 轉換資料JSONata。
根據預設, Map
狀態會以內嵌模式執行。在內嵌模式中,映射狀態僅接受JSON陣列做為輸入。它會從工作流程中的上一個步驟接收此陣列。在此模式中,狀態的每個反覆運算都會在包含 Map
狀態的工作流程內容中Map
執行。Step Functions 會將這些反覆運算的執行歷史記錄新增至父工作流程的執行歷史記錄。
在此模式中, Map
狀態最多支援 40 個並行反覆運算。
設定為內嵌Map
的狀態稱為內嵌映射狀態。如果工作流程的執行歷史記錄不超過 25,000 個項目,或者如果您不需要超過 40 個並行反覆運算,請在內嵌模式中使用 Map
狀態。
如需使用內嵌映射狀態的簡介,請參閱教學課程 使用內嵌映射重複動作。
本主題中的關鍵概念
- 內嵌模式
-
狀態的有限並行模式
Map
。在此模式中,狀態的每個反覆運算都會在包含Map
狀態的工作流程內容中Map
執行。Step Functions 會將這些反覆運算的執行歷史記錄新增至父工作流程的執行歷史記錄。Map
狀態預設會在內嵌模式中執行。此模式僅接受JSON陣列做為輸入,並支援最多 40 個並行反覆運算。
- 內嵌映射狀態
-
Map
狀態設定為內嵌模式。 - 地圖工作流程
狀態針對每次反覆
Map
執行的一組步驟。- 映射狀態反覆運算
-
在
Map
狀態內定義的工作流程重複。
內嵌映射狀態欄位
若要在工作流程中使用內嵌映射狀態,請指定一個或多個這些欄位。除了常見狀態欄位之外,您還可以指定這些欄位。
Type
(必要)-
設定狀態類型,例如
Map
。 ItemProcessor
(必要)-
包含下列指定
Map
狀態處理模式和定義的JSON物件。定義包含一組步驟,可重複處理每個陣列項目。
-
ProcessorConfig
– 選擇性JSON物件,指定Map
狀態的處理模式。此物件包含Mode
子欄位。此欄位預設為INLINE
,這會在內嵌模式中使用Map
狀態。在此模式中,任何反覆運算的失敗都會導致
Map
狀態失敗。當Map
狀態失敗時,所有反覆運算都會停止。
StartAt
– 指定字串,指出工作流程中的第一個狀態。此字串區分大小寫,且必須符合其中一個狀態物件的名稱。此狀態會先針對資料集中的每個項目執行。您提供給Map
狀態的任何執行輸入會先傳遞至StartAt
狀態。-
States
– 包含逗號分隔之一組狀態的JSON物件。在此物件中,您可以定義 Map workflow。注意
-
ItemProcessor
欄位內的狀態只能互相轉換。ItemProcessor
欄位外的任何狀態都無法轉換為其中的狀態。 -
ItemProcessor
欄位會取代現在已棄用Iterator
的欄位。雖然您可以繼續包含使用Iterator
欄位Map
的狀態,但強烈建議您使用 取代此欄位ItemProcessor
。Step Functions Local 目前不支援
ItemProcessor
欄位。建議您將Iterator
欄位與 Step Functions Local 搭配使用。
-
-
Items
(選用,JSONata僅限 )-
必須評估為JSON陣列的陣列或JSONata表達式。
ItemsPath
(選用,JSONPath僅限 )-
使用 JsonPath
語法指定參考路徑。此路徑會選取節點JSON,其中包含狀態輸入內的項目陣列。如需詳細資訊,請參閱ItemsPath (JSONPath僅限地圖)。 ItemSelector
(選用)-
覆寫輸入陣列項目的值,然後再傳遞至每個
Map
狀態反覆運算。在此欄位中,您可以指定有效的 JSON ,其中包含一組鍵/值對。這些配對可以包含下列任何項目:
如需詳細資訊,請參閱ItemSelector (地圖)。
ItemSelector
欄位會取代現在已棄用Parameters
的欄位。雖然您可以繼續包含使用Parameters
欄位Map
的狀態,但強烈建議您使用 取代此欄位ItemSelector
。 MaxConcurrency
(選用)-
指定整數值,提供可平行執行之
Map
狀態反覆運算的上限。例如,MaxConcurrency
值 10 會將Map
狀態限制為一次執行 10 個並行反覆運算。在 JSONata 狀態中,您可以指定評估為整數的JSONata表達式。
注意
並行反覆運算可能會受到限制。發生這種情況時,某些反覆運算會在先前的反覆運算完成之前開始。當您的輸入陣列有超過 40 個項目時,發生這種情況的可能性會增加。
若要實現更高的並行,請考慮 分散式模式。
預設值為
0
,不限制並行。Step Functions 會盡可能同時叫用反覆運算。MaxConcurrency
的值會為每個陣列元素1
叫用ItemProcessor
一次 。陣列中的項目會依其在輸入中的顯示順序進行處理。Step Functions 在完成先前的反覆運算之前,不會啟動新的反覆運算。 MaxConcurrencyPath
(選用,JSONPath僅限 )-
如果您想要使用參考路徑從狀態輸入動態提供最大並行值,請使用
MaxConcurrencyPath
。解析後,參考路徑必須選取值為非負整數的欄位。注意
Map
狀態不能同時包含MaxConcurrency
和MaxConcurrencyPath
。 ResultPath
(選用,JSONPath僅限 )-
指定在輸入中存放
Map
狀態反覆運算輸出的位置。然後,映射狀態會篩選OutputPath欄位指定的輸入,如果指定的話。然後,它會使用篩選的輸入做為狀態的輸出。如需詳細資訊,請參閱輸入和輸出處理。 ResultSelector
(選用,JSONPath僅限 )-
傳遞金鑰值對的集合,其中值為靜態值或從結果中選取。如需詳細資訊,請參閱ResultSelector。
提示
如果您在狀態機器中使用的平行或映射狀態傳回陣列,您可以使用 ResultSelector 欄位將其轉換為平面陣列。如需詳細資訊,請參閱平面化陣列陣列。
Retry
(選用)-
稱為 Retriers 的物件陣列,可定義重試政策。狀態會在遇到執行時間錯誤時使用重試政策。如需詳細資訊,請參閱使用重試和 Catch 的狀態機器範例。
注意
如果您為內嵌映射狀態定義重試器,則重試政策會套用至所有
Map
狀態反覆運算,而非僅失敗的反覆運算。例如,您的Map
狀態包含兩個成功的反覆運算和一個失敗的反覆運算。如果您已定義Map
狀態Retry
的欄位,則重試政策會套用至所有三個Map
狀態反覆運算,而不只是失敗的反覆運算。 Catch
(選用)-
稱為 Catcher 的物件陣列,可定義後援狀態。如果狀態遇到執行時間錯誤,而且沒有重試政策,或他們的重試政策已用盡,則會執行擷取器。如需詳細資訊,請參閱備用狀態。
Output
(選用,JSONata僅限 )-
用來指定和轉換 狀態的輸出。指定時,該值會覆寫狀態輸出預設值。
輸出欄位接受任何JSON值 (物件、陣列、字串、數字、布林值、 null)。任何字串值,包括物件或陣列內的值,都會被評估JSONata為以 {% %} 字元包圍。
輸出也直接接受JSONata表達式,例如:「輸出」:「{% jsonata 表達式 %}」
如需詳細資訊,請參閱在 Step Functions 中使用 JSONata 轉換資料。
-
Assign
(選用) -
用來存放變數。
Assign
欄位接受具有金鑰/值對的JSON物件,這些金鑰/值對定義變數名稱及其指派的值。任何字串值,包括物件或陣列內的值,都會評估為以{% %}
字元包圍JSONata時如需詳細資訊,請參閱使用變數在狀態之間傳遞資料。
已棄用的欄位
注意
雖然您可以繼續包含使用下列欄位Map
的狀態,但強烈建議您Iterator
以 ItemProcessor
和 Parameters
取代 ItemSelector
。
-
Iterator
-
指定JSON物件,定義一組處理陣列中每個元素的步驟。
Parameters
-
指定索引鍵值對的集合,其中的值可以包含下列任何項目:
-
您在狀態機器定義中定義的靜態值。
-
使用路徑從輸入中選取的值。
-
內嵌映射狀態範例 (JSONPath)
請考慮下列在內嵌模式下執行之Map
狀態的輸入資料。
{
"ship-date": "2016-03-14T01:59:00Z",
"detail": {
"delivery-partner": "UQS",
"shipped": [
{ "prod": "R31", "dest-code": 9511, "quantity": 1344 },
{ "prod": "S39", "dest-code": 9511, "quantity": 40 },
{ "prod": "R31", "dest-code": 9833, "quantity": 12 },
{ "prod": "R40", "dest-code": 9860, "quantity": 887 },
{ "prod": "R40", "dest-code": 9511, "quantity": 1220 }
]
}
}
根據先前的輸入,下列範例中Map
的狀態會針對 shipped
欄位中陣列的每個項目叫用名為 ship-val
一次的 AWS Lambda 函數。
"Validate All": {
"Type": "Map",
"InputPath": "$.detail",
"ItemProcessor": {
"ProcessorConfig": {
"Mode": "INLINE"
},
"StartAt": "Validate",
"States": {
"Validate": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"OutputPath": "$.Payload",
"Parameters": {
"FunctionName": "arn:aws:lambda:us-east-2:123456789012:function:ship-val:$LATEST
"
},
"End": true
}
}
},
"End": true,
"ResultPath": "$.detail.shipped",
"ItemsPath": "$.shipped"
}
狀態的每個反覆運算都會Map
傳送陣列中的項目,該項目會隨 ItemsPath 欄位一起選取,做為 ship-val
Lambda 函數的輸入。下列值是 Map
狀態傳送至 Lambda 函數呼叫的輸入範例:
{
"prod": "R31",
"dest-code": 9511,
"quantity": 1344
}
完成後,Map
狀態的輸出為JSON陣列,其中每個項目都是反覆運算的輸出。在此情況下,此陣列包含 ship-val
Lambda 函數的輸出。
使用 的內嵌映射狀態範例 ItemSelector
假設上一個範例中的 ship-val
Lambda 函數也需要有關寄件快遞的資訊。此資訊是每次反覆運算陣列中項目的補充。您可以包含來自輸入的資訊,以及Map
狀態目前反覆運算的特定資訊。請注意下列範例中ItemSelector
的欄位:
"Validate-All": {
"Type": "Map",
"InputPath": "$.detail",
"ItemsPath": "$.shipped",
"MaxConcurrency": 0,
"ResultPath": "$.detail.shipped",
"ItemSelector": {
"parcel.$": "$$.Map.Item.Value",
"courier.$": "$.delivery-partner"
},
"ItemProcessor": {
"StartAt": "Validate",
"States": {
"Validate": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:ship-val",
"End": true
}
}
},
"End": true
}
ItemSelector
區塊會以JSON節點取代反覆運算的輸入。此節點同時包含內容物件的目前項目資料,以及Map
狀態輸入delivery-partner
欄位的快遞資訊。以下是單一反覆運算的輸入範例。Map
狀態會將此輸入傳遞給 ship-val
Lambda 函數的呼叫。
{
"parcel": {
"prod": "R31",
"dest-code": 9511,
"quantity": 1344
},
"courier": "UQS"
}
在先前的內嵌映射狀態範例中, ResultPath
欄位會以與輸入相同的格式產生輸出。不過,它會使用陣列覆寫 detail.shipped
欄位,其中每個元素是每個反覆 ship-val
Lambda 調用的輸出。
如需使用內嵌映射狀態及其欄位的詳細資訊,請參閱以下內容。
內嵌Map
狀態輸入和輸出處理
對於指定Map
狀態, 會InputPath選取狀態輸入的子集。
Map
狀態的輸入必須包含JSON陣列。Map
狀態會針對陣列中的每個項目執行 ItemProcessor
區段一次。如果您指定 ItemsPath 欄位,Map
狀態會選取輸入中要反覆運算的陣列位置。如果未指定,則 ItemsPath
的值為 $
,而 ItemProcessor
區段預期陣列是唯一的輸入。如果您指定 ItemsPath
欄位,其值必須是參考路徑。Map
狀態會在套用 之後,將此路徑套用至有效輸入InputPath
。必須ItemsPath
識別值為JSON陣列的欄位。
根據預設,每個反覆運算的輸入是 ItemsPath
值所識別陣列欄位的單一元素。您可以使用 ItemSelector (地圖)
欄位覆寫此值。
完成後,Map
狀態的輸出為JSON陣列,其中每個項目都是反覆運算的輸出。
如需內嵌映射狀態輸入和輸出的詳細資訊,請參閱以下內容: