

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

# 在 Step Functions 工作流程中操作參數
<a name="input-output-inputpath-params"></a>

**管理狀態和轉換資料**  
了解如何[使用變數在狀態與使用 JSONata 轉換資料之間傳遞資料](workflow-variables.md)。 [ JSONata](transforming-data.md)

`InputPath`、 `Parameters`和 `ResultSelector` 欄位提供在 JSON 在工作流程中移動時操作 JSON 的方法。 `InputPath`可以使用路徑篩選 JSON 表示法來限制傳遞的輸入 （請參閱 [使用 JSONPath 路徑](amazon-states-language-paths.md))。使用 `Parameters` 欄位，您可以使用靜態值或使用路徑從輸入中選擇來傳遞鍵值對的集合。

 `ResultSelector` 欄位提供在`ResultPath`套用 之前操作狀態結果的方法。

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

## InputPath
<a name="input-output-inputpath"></a>

使用 `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
<a name="input-output-parameters"></a>

本節說明您可以使用參數欄位的不同方式。

### 鍵值對
<a name="input-output-parameters-keyvalue"></a>

使用 `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 中的內容物件存取執行資料](input-output-contextobject.md)。

### 連線的資源
<a name="input-output-parameters-connected"></a>

`Parameters` 欄位也可以將資訊傳遞給已連線的資源。例如，如果您的任務狀態正在協調AWS Batch任務，您可以將相關的 API 參數直接傳遞至該服務的 API 動作。如需詳細資訊，請參閱：
+ [在 Step Functions 中將參數傳遞至服務 API](connect-parameters.md)
+ [整合 服務](integrate-services.md)

### Amazon S3
<a name="input-output-parameters-s3"></a>

如果您要在狀態之間傳遞的 Lambda 函數資料可能成長到超過 262，144 個位元組，我們建議您使用 Amazon S3 來存放資料，並實作下列其中一種方法：
+ 在工作流程中使用*分散式映射狀態*，讓`Map`狀態可以直接從 Amazon S3 資料來源讀取輸入。如需詳細資訊，請參閱[分散式模式](state-map-distributed.md)。
+ 在 `Payload` 參數中剖析儲存貯體的 Amazon Resource Name (ARN)，以取得儲存貯體名稱和金鑰值。如需詳細資訊，請參閱[在 Step Functions 中使用 Amazon S3 ARNs 而非傳遞大型承載](sfn-best-practices.md#avoid-exec-failures)。

或者，您可以調整實作，以在執行中傳遞較小的承載。

## ResultSelector
<a name="input-output-resultselector"></a>

 在`ResultPath`套用 之前，使用 `ResultSelector` 欄位來操作狀態的結果。`ResultSelector` 欄位可讓您建立金鑰值對的集合，其中值為靜態或從狀態的結果中選取。使用 `ResultSelector` 欄位，您可以選擇您要傳遞給 `ResultPath` 欄位之狀態結果的哪些部分。

**注意**  
使用 `ResultPath` 欄位，您可以將 `ResultSelector` 欄位的輸出新增至原始輸入。

`ResultSelector` 是下列狀態的選用欄位：
+ [映射工作流程狀態](state-map.md)
+ [任務工作流程狀態](state-task.md)
+ [平行工作流程狀態](state-parallel.md)

例如，除了結果中的承載之外，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": {
      "ClusterId": "AKIAIOSFODNN7EXAMPLE",
      "ResourceType": "elasticmapreduce",
  }
}
```

### 平面化陣列陣列
<a name="flatten-array-of-arrays-result-selector"></a>

如果狀態機器中的 [平行工作流程狀態](state-parallel.md)或 [映射工作流程狀態](state-map.md) 狀態傳回陣列，您可以使用 [ResultSelector](#input-output-resultselector) 欄位將陣列轉換為平面陣列。您可以在平行或映射狀態定義中包含此欄位，以操作這些狀態的結果。

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

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

如需示範如何扁平化陣列的範例，請參閱下列教學課程中*的步驟 3*：
+ [在 Step Functions 中使用 Lambda 函數處理批次資料](tutorial-itembatcher-param-task.md)
+ [在 Step Functions 中使用 Lambda 函數處理個別項目](tutorial-itembatcher-single-item-process.md)