本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
InputPath、參數和 ResultSelector
Parameters
和ResultSelector
欄位提供了一種在 InputPath
JSON 在工作流程中移動時操作的方法。 InputPath
可以透過使用路徑篩選 JSON 標記法來限制傳遞的輸入 (請參閱路徑)。您可以使用 Parameters
欄位來傳遞索引鍵/值組集合,其中的值可能是您在狀態機器定義中的定義值,或是使用路徑從輸入所選取得出的值。該ResultSelector
字段提供了一種在應用之前ResultPath
操作狀態結果的方法。
AWS Step Functions 先套用InputPath
欄位,然後套用Parameters
欄位。您可以先使用 InputPath
將原始輸入篩選成您所要的選取範圍,然後套用 Parameters
來進一步操作輸入,或增加新的值。然後,您可以在套用之前ResultPath
使用ResultSelector
欄位來操作狀態的輸出。
提示
使用 Step Functions 主控台中的資料流程模擬器
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 存放資料,並實作下列其中一種方法:
在工作流程中使用分散式地圖狀態,以便
Map
狀態可以直接從 Amazon S3 資料來源讀取輸入。如需詳細資訊,請參閱 在分散式模式中使用對應狀態。剖析
Payload
參數中儲存貯體的 Amazon 資源名稱 (ARN),以取得值區名稱和金鑰值。如需詳細資訊,請參閱 使用 Amazon S3 ARN 而不是傳遞大型有效載荷。
或者,您可以調整實施以在執行中傳遞較小的有效載荷。
ResultSelector
在套用之前ResultPath
,使用ResultSelector
欄位來操作狀態的結果。此ResultSelector
欄位可讓您建立索引鍵值配對的集合,其中值為靜態或從狀態的結果中選取。使用該ResultSelector
字段,您可以選擇要傳遞給該ResultPath
字段的狀態結果的哪些部分。
注意
使用該ResultPath
字段,您可以將ResultSelector
字段的輸出添加到原始輸入中。
ResultSelector
是處於下列狀態的選擇性欄位:
例如,Step Functions 服務整合會傳回結果中有效負載以外的中繼資料。 ResultSelector
可以選擇結果的部分,並將它們與狀態輸入合併ResultPath
。在此範例中,我們只想選取resourceType
和ClusterId
,並將其與來自 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"
}
}
然後,您可以選擇resourceType
並ClusterId
使用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: