本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Step Functions 工作流程中以內嵌模式使用對映狀態
依預設,Map
狀態會以內嵌模式執行。在內聯模式下,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
(必要)-
包含下列指JSON定
Map
狀態處理模式和定義的物件。定義包含處理每個陣列項目時要重複的一組步驟。
-
ProcessorConfig
— 指定JSON狀態處理模式的選用Map
物件。此物件包含Mode
子欄位。此欄位預設為INLINE
,此欄位使用內嵌模式下的Map
狀態。在這種模式下,任何迭代的失敗都會導致
Map
狀態失敗。當Map
狀態失敗時,所有版序都會停止。
StartAt
— 指定指示工作流程中第一個狀態的字串。此字串區分大小寫,且必須與其中一個狀態物件的名稱相符。此狀態會先針對資料集中的每個項目執行。您提供給Map
狀態的任何執行輸入會先傳遞至StartAt
狀態。-
States
— 包JSON含逗號分隔狀態集的物件。在此物件中,您可以定義Map workflow.注意
-
ItemProcessor
欄位中的狀態只能相互轉換。ItemProcessor
欄位外的任何狀態都無法轉換為其中的狀態。 -
此
ItemProcessor
欄位會取代現在已取代的Iterator
欄位。雖然您可以繼續包含使用此Iterator
欄位的Map
狀態,但我們強烈建議您將此欄位取代為ItemProcessor
。Step Functions 本地目前不支持該
ItemProcessor
字段。我們建議您使用Iterator
欄位與 Step Functions 本機。
-
-
ItemsPath
(選用)-
使用JsonPath
語法指定參考路徑。此路徑選擇包含狀態輸入內的項目數組的JSON節點。如需詳細資訊,請參閱ItemsPath (地圖)。 ItemSelector
(選用)-
覆寫輸入陣列項目的值之前,它們被傳遞到每個
Map
狀態迭代。在此欄位中,您可以指定包JSON含索引鍵值配對集合的有效值。這些配對可以包含下列任何項目:
如需詳細資訊,請參閱ItemSelector (地圖)。
此
ItemSelector
欄位會取代現在已取代的Parameters
欄位。雖然您可以繼續包含使用此Parameters
欄位的Map
狀態,但我們強烈建議您將此欄位取代為ItemSelector
。 MaxConcurrency
(選用)-
指定整數值,提供可 parallel 執行之
Map
狀態反覆次數的上限。例如,MaxConcurrency
值 10 會將Map
狀態限制為一次執行 10 個並行反覆項目。注意
並發迭代可能會受到限制。發生這種情況時,在先前的迭代完成之前,某些迭代才會開始。當您的輸入陣列有超過 40 個項目時,發生這種情況的可能性就會增加。
為了實現更高的並發性,請考慮分散式模式。
預設值為
0
,這對並行沒有限制。Step Functions 盡可能同時調用迭代。的
MaxConcurrency
值會針對每個陣列元素1
叫用ItemProcessor
一次。陣列中的項目會依照其在輸入中出現的順序進行處理。Step Functions 不會啟動一個新的迭代,直到它完成前一次迭代。 MaxConcurrencyPath
(選用)-
如果您想要使用
MaxConcurrencyPath
參考路徑從狀態輸入動態提供最大並行值,請使用。解析後,參考路徑必須選取值為非負整數的欄位。注意
狀
Map
態不能同時包含MaxConcurrency
和MaxConcurrencyPath
。 ResultPath
(選用)-
指定在輸入中存儲狀
Map
態迭代輸出的位置。然後地圖狀態過濾輸入由OutputPath字段指定,如果指定。然後,它使用過濾的輸入作為狀態的輸出。如需詳細資訊,請參閱輸入和輸出處理。 ResultSelector
(選用)-
傳遞鍵值對的集合,其中的值是靜態的或從結果中選擇的。如需詳細資訊,請參閱ResultSelector。
提示
如果您在狀態機器中使用的「平行」或「對映」狀態傳回陣列陣列,您可以將它們轉換為具有ResultSelector欄位的平面陣列。如需詳細資訊,請參閱扁平化陣列的陣列。
Retry
(選用)-
物件陣列 (稱為「擷取器」),可定義重試原則。當狀態遇到執行階段錯誤時,會使用重試原則。如需詳細資訊,請參閱使用「重試」和使用 Catch 的狀態機示例。
注意
如果您為「內嵌對應」狀態定義「擷取器」,則重試原則會套用至所有
Map
狀態版序,而不是僅套用失敗的版序。例如,您的Map
狀態包含兩個成功的版序和一個失敗的版序。如果您已定義Map
狀態的Retry
欄位,則重試原則會套用至所有三個Map
狀態版序,而不是僅套用到失敗的迭代。 Catch
(選用)-
稱為 Catcher 的物件陣列,可定義後援狀態。如果狀態遇到執行階段錯誤且沒有重試原則,或者其重試原則已用盡,則會執行捕捉器。如需詳細資訊,請參閱備用狀態。
已取代欄位
注意
雖然您可以繼續包含使用下列欄位的Map
狀態,但我們強烈建議您取代Iterator
為ItemProcessor
Parameters
和ItemSelector
。
-
Iterator
-
指定JSON物件,此物件會定義處理陣列中每個元素的一組步驟。
Parameters
-
指定索引鍵值配對的集合,其中值可以包含下列任何項目:
-
您在狀態機定義中定義的靜態值。
-
使用路徑從輸入中選取的值。
-
內聯映射狀態示例
請考慮以內嵌模式執行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
狀態會叫用 AWS Lambda 為欄位中陣列的ship-val
每個項目命名一次的函shipped
數。
"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數組,其中每個項目都是迭代的輸出。
如需有關內嵌對應狀態輸入和輸出的詳細資訊,請參閱下列內容: