本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
管理狀態和轉換資料
Step Functions 最近新增了變數,並JSONata管理狀態和轉換資料。
了解如何使用變數傳遞資料,以及使用 轉換資料JSONata。
InputPath
、 Parameters
和 ResultSelector
欄位提供在工作流程中移動JSON時操縱 的方式。 InputPath
可以使用路徑篩選JSON符號來限制傳遞的輸入 (請參閱 使用JSONPath路徑)。使用 Parameters
欄位,您可以使用靜態值或使用路徑從輸入中選擇,傳遞一組鍵/值對。
ResultSelector
欄位提供在ResultPath
套用 之前操作狀態結果的方法。
AWS Step Functions 會先套用 InputPath
欄位,再套用 Parameters
欄位。您可以先使用 InputPath
將原始輸入篩選成您所要的選取範圍,然後套用 Parameters
來進一步操作輸入,或增加新的值。然後,您可以使用 ResultSelector
欄位來操作ResultPath
套用前的狀態輸出。
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物件的特殊物件。內容物件包含狀態機器執行的相關資訊。請參閱 從 Step Functions 中的內容物件存取執行資料 。
連線的資源
Parameters
欄位也可以將資訊傳遞給已連線的資源。例如,如果您的任務狀態正在協調 AWS Batch 任務,您可以將相關API參數直接傳遞給該服務API的動作。如需詳細資訊,請參閱:
Amazon S3
如果您要在狀態之間傳遞的 Lambda 函數資料可能成長到超過 262,144 個位元組,我們建議您使用 Amazon S3 來存放資料,並實作下列其中一種方法:
在工作流程中使用分散式映射狀態,讓
Map
狀態可以直接從 Amazon S3 資料來源讀取輸入。如需詳細資訊,請參閱分散式模式。在
Payload
參數中剖析儲存貯體的 Amazon Resource Name (ARN),以取得儲存貯體名稱和索引鍵值。如需詳細資訊,請參閱在 Step Functions 中使用 Amazon S3 ARNs而非傳遞大型承載。
或者,您可以調整實作,以在執行中傳遞較小的承載。
ResultSelector
在ResultPath
套用 之前,使用 ResultSelector
欄位來操作狀態的結果。ResultSelector
欄位可讓您建立金鑰值對的集合,其中值為靜態或從狀態的結果中選取。使用 ResultSelector
欄位,您可以選擇您要傳遞給 ResultPath
欄位的狀態結果的哪些部分。
注意
使用 ResultPath
欄位,您可以將ResultSelector
欄位的輸出新增至原始輸入。
ResultSelector
是下列狀態的選用欄位:
例如,除了結果中的承載之外,Step Functions 服務整合還傳回中繼資料。 ResultSelector
可以選取結果的一部分,並使用 將其與狀態輸入合併ResultPath
。在此範例中,我們希望只選取 resourceType
和 ClusterId
,並將其與來自 Amazon .createClustersync EMR 的狀態輸入合併。有以下幾點:
{
"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": {
"ClusterId": "AKIAIOSFODNN7EXAMPLE",
"ResourceType": "elasticmapreduce",
}
}
平面化陣列陣列
如果狀態機器中的 平行工作流程狀態或 映射工作流程狀態 狀態傳回陣列,您可以使用 ResultSelector 欄位將陣列轉換為平面陣列。您可以在平行或映射狀態定義中包含此欄位,以操作這些狀態的結果。
若要扁平化陣列,請在 ResultSelector
[*]
欄位中使用語法:,如下列範例所示。
"ResultSelector": {
"flattenArray.$": "$[*][*]"
}
如需示範如何扁平化陣列的範例,請參閱下列教學課程中的步驟 3: