InputPath、參數和 ResultSelector - AWS Step Functions

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

InputPath、參數和 ResultSelector

ParametersResultSelector欄位提供了一種在 InputPath JSON 在工作流程中移動時操作的方法。 InputPath可以透過使用路徑篩選 JSON 標記法來限制傳遞的輸入 (請參閱路徑)。您可以使用 Parameters 欄位來傳遞索引鍵/值組集合,其中的值可能是您在狀態機器定義中的定義值,或是使用路徑從輸入所選取得出的值。該ResultSelector字段提供了一種在應用之前ResultPath操作狀態結果的方法。

AWS Step Functions 先套用InputPath欄位,然後套用Parameters欄位。您可以先使用 InputPath 將原始輸入篩選成您所要的選取範圍,然後套用 Parameters 來進一步操作輸入,或增加新的值。然後,您可以在套用之前ResultPath使用ResultSelector欄位來操作狀態的輸出。

提示

使用 Step Functions 主控台中的資料流程模擬器來測試 JSON 路徑語法、更好地瞭解如何在狀態內操作資料,並查看資料在狀態之間傳遞的方式。

InputPath

使用 InputPath 來選取一部分的狀態輸入。

例如,假設狀態的輸入包含下列項目:

{ "comment": "Example for InputPath.", "dataset1": { "val1": 1, "val2": 2, "val3": 3 }, "dataset2": { "val1": "a", "val2": "b", "val3": "c" } }

您可以套用 InputPath

"InputPath": "$.dataset2",

透過前述的 InputPath,依輸入方式傳遞的 JSON 將如下所示。

{ "val1": "a", "val2": "b", "val3": "c" }
注意

路徑可以產生一組值。請考量下列範例。

{ "a": [1, 2, 3, 4] }

如果您套用路徑 $.a[0:2],則結果如下。

[ 1, 2 ]

參數

本節說明使用「參數」欄位的不同方式。

鍵值對

使用此Parameters欄位建立作為輸入傳遞的索引鍵值配對集合。每一組的值可以是您包含在狀態機器定義中的靜態值,或使用路徑從輸入或內容物件中所選取的值。對於使用路徑來選取值的索引鍵/值組,索引鍵名稱必須以 .$ 做為結尾。

例如,假設您提供以下輸入。

{ "comment": "Example for Parameters.", "product": { "details": { "color": "blue", "size": "small", "material": "cotton" }, "availability": "in stock", "sku": "2317", "cost": "$23" } }

若要選取一些資訊,您可以在狀態機器定義中指定這些參數。

"Parameters": { "comment": "Selecting what I care about.", "MyDetails": { "size.$": "$.product.details.size", "exists.$": "$.product.availability", "StaticValue": "foo" } },

在前述輸入及 Parameters 欄位條件下,這是所傳遞的 JSON。

{ "comment": "Selecting what I care about.", "MyDetails": { "size": "small", "exists": "in stock", "StaticValue": "foo" } },

除了輸入,您可以存取特殊的 JSON 物件,即所謂的內容物件。內容物件包含關於狀態機器執行的資訊。請參閱內容物件

連線資源

Parameters 欄位也可以將資訊傳遞給已連線的資源。例如,如果您的任務狀態正在協調 AWS Batch 工作,則可以將相關 API 參數直接傳遞給該服務的 API 動作。如需詳細資訊,請參閱:

Amazon S3

如果您在各個狀態之間傳遞的 Lambda 函數資料可能會成長到 262,144 個位元組以上,我們建議您使用 Amazon S3 存放資料,並實作下列其中一種方法:

或者,您可以調整實施以在執行中傳遞較小的有效載荷。

ResultSelector

在套用之前ResultPath,使用ResultSelector欄位來操作狀態的結果。此ResultSelector欄位可讓您建立索引鍵值配對的集合,其中值為靜態或從狀態的結果中選取。使用該ResultSelector字段,您可以選擇要傳遞給該ResultPath字段的狀態結果的哪些部分。

注意

使用該ResultPath字段,您可以將ResultSelector字段的輸出添加到原始輸入中。

ResultSelector是處於下列狀態的選擇性欄位:

例如,Step Functions 服務整合會傳回結果中有效負載以外的中繼資料。 ResultSelector可以選擇結果的部分,並將它們與狀態輸入合併ResultPath。在此範例中,我們只想選取resourceTypeClusterId,並將其與來自 Amazon EMR 建立叢集 .sync 的狀態輸入合併。鑑於以下內容:

{ "resourceType": "elasticmapreduce", "resource": "createCluster.sync", "output": { "SdkHttpMetadata": { "HttpHeaders": { "Content-Length": "1112", "Content-Type": "application/x-amz-JSON-1.1", "Date": "Mon, 25 Nov 2019 19:41:29 GMT", "x-amzn-RequestId": "1234-5678-9012" }, "HttpStatusCode": 200 }, "SdkResponseMetadata": { "RequestId": "1234-5678-9012" }, "ClusterId": "AKIAIOSFODNN7EXAMPLE" } }

然後,您可以選擇resourceTypeClusterId使用ResultSelector

"Create Cluster": { "Type": "Task", "Resource": "arn:aws:states:::elasticmapreduce:createCluster.sync", "Parameters": { <some parameters> }, "ResultSelector": { "ClusterId.$": "$.output.ClusterId", "ResourceType.$": "$.resourceType" }, "ResultPath": "$.EMROutput", "Next": "Next Step" }

使用給定的輸入,使用ResultSelector產生:

{ "OtherDataFromInput": {}, "EMROutput": { "ResourceType": "elasticmapreduce", "ClusterId": "AKIAIOSFODNN7EXAMPLE" } }

扁平化數組數組

如果狀態機器中的平行Map state 傳回陣列陣列陣列,您可以將它們轉換成含有ResultSelector欄位的平面陣列。您可以將此欄位包含在「平行」或「對映」狀態定義中,以操作這些狀態的結果。

若要扁平化陣列,請在ResultSelector欄位中使用 JMESPath [*] 語法,如下列範例所示。

"ResultSelector": { "flattenArray.$": "$[*][*]" }

如需示範如何平面化陣列的範例,請參閱下列自學課程中的步驟 3