本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Step Functions 數工作流程中的參數來操作狀態
Parameters
和ResultSelector
欄位提供了一種在InputPath
工JSON作流程中移動時進行操作的方法。 InputPath
可以透過使用路徑篩選JSON符號來限制傳遞的輸入 (請參閱使用路徑存取 Step Functions 工作流程的輸入)。您可以使用 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 ARNs 而不是在 Step Functions 中傳遞大型有效載荷。
或者,您可以調整實施以在執行中傳遞較小的有效載荷。
ResultSelector
在套用之前ResultPath
,使用ResultSelector
欄位來操作狀態的結果。此ResultSelector
欄位可讓您建立索引鍵值組的集合,其中值為靜態或從狀態的結果中選取。使用該ResultSelector
字段,您可以選擇要傳遞給該ResultPath
字段的狀態結果的哪些部分。
注意
使用該ResultPath
字段,您可以將ResultSelector
字段的輸出添加到原始輸入中。
ResultSelector
是處於下列狀態的選擇性欄位:
例如,Step Functions 服務整合會傳回結果中有效負載以外的中繼資料。 ResultSelector
可以選擇結果的部分,並將它們與狀態輸入合併ResultPath
。在此範例中,我們只想選取resourceType
和ClusterId
,並將其與 Amazon EMR createCluster .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"
}
}
扁平化數組數組
如果狀態機器中的平行工作流狀態或 地圖工作流程狀 state 傳回陣列陣列陣列,您可以將它們轉換成含有ResultSelector欄位的平面陣列。您可以將此欄位包含在「平行」或「對映」狀態定義中,以操作這些狀態的結果。
若要扁平化陣列,請使用ResultSelector
欄位[*]
中的JMESPath語法
"ResultSelector": { "flattenArray.$": "$[*][*]" }
如需示範如何平面化陣列的範例,請參閱下列自學課程中的步驟 3: