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

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

在 Step Functions 工作流程的內嵌模式中使用映射狀態

根據預設, 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 狀態不能同時包含 MaxConcurrencyMaxConcurrencyPath

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以 取代 ItemProcessorParameters並以 取代 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 陣列,其中每個項目都是反覆運算的輸出。

如需內嵌映射狀態輸入和輸出的詳細資訊,請參閱以下內容: