在 Step Functions 工作流程中以內嵌模式使用對映狀態 - AWS Step Functions

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

在 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態不能同時包含MaxConcurrencyMaxConcurrencyPath

ResultPath (選用)

指定在輸入中存儲狀Map態迭代輸出的位置。然後地圖狀態過濾輸入由OutputPath字段指定,如果指定。然後,它使用過濾的輸入作為狀態的輸出。如需詳細資訊,請參閱輸入和輸出處理

ResultSelector (選用)

傳遞鍵值對的集合,其中的值是靜態的或從結果中選擇的。如需詳細資訊,請參閱ResultSelector

提示

如果您在狀態機器中使用的「平行」或「對映」狀態傳回陣列陣列,您可以將它們轉換為具有ResultSelector欄位的平面陣列。如需詳細資訊,請參閱扁平化陣列的陣列

Retry (選用)

物件陣列 (稱為「擷取器」),可定義重試原則。當狀態遇到執行階段錯誤時,會使用重試原則。如需詳細資訊,請參閱使用「重試」和使用 Catch 的狀態機示例

注意

如果您為「內嵌對應」狀態定義「擷取器」,則重試原則會套用至所有Map狀態版序,而不是僅套用失敗的版序。例如,您的Map狀態包含兩個成功的版序和一個失敗的版序。如果您已定義Map狀態的Retry欄位,則重試原則會套用至所有三個Map狀態版序,而不是僅套用到失敗的迭代。

Catch (選用)

稱為 Catcher 的物件陣列,可定義後援狀態。如果狀態遇到執行階段錯誤且沒有重試原則,或者其重試原則已用盡,則會執行捕捉器。如需詳細資訊,請參閱備用狀態

已取代欄位

注意

雖然您可以繼續包含使用下列欄位的Map狀態,但我們強烈建議您取代IteratorItemProcessorParametersItemSelector

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數組,其中每個項目都是迭代的輸出。

如需有關內嵌對應狀態輸入和輸出的詳細資訊,請參閱下列內容: