

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Step Functions ワークフロー内でパラメータを操作する
<a name="input-output-inputpath-params"></a>

**ステートの管理とデータの変換**  
[変数を使用したステート間のデータ受け渡し](workflow-variables.md)と [JSONata を使用したデータ変換](transforming-data.md)について説明します。

JSON はワークフローを通して動くため、`InputPath`、`Parameters`、および `ResultSelector` フィールドから JSON の操作方法を提供します。`InputPath` は、パスを使用して JSON 表記をフィルタリングして渡される入力を制限できます ([JSONPath パスの使用](amazon-states-language-paths.md) を参照)。`Parameters` フィールドでは、静的な値を使用するか、パスを使用して入力から選択して、キーと値のペアの集合を渡すことができます。

 `ResultSelector` フィールドは、`ResultPath` が適用される前の状態を操作する方法を提供します。

AWS Step Functionsは最初に `InputPath`フィールドを適用し、次に `Parameters`フィールドを適用します。最初に `InputPath` を使用して raw 入力をフィルタリングしてから、`Parameters` を適用して、入力をさらに操作するか、新しい値を追加します。その後、`ResultSelector` フィールドを使って、`ResultPath` を適用する前に、状態の出力を操作できます。

## 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 ]
```

## パラメータ
<a name="input-output-parameters"></a>

このセクションでは、[Parameters] (パラメータ) フィールドを使用するさまざまな方法を示します。

### キーバリューペア
<a name="input-output-parameters-keyvalue"></a>

入力として渡されるキーバリューのペアのコレクションを作成するには、`Parameters` フィールドを使用します。それぞれの値は、ステートマシン定義に含める静的な値にするか、パスを使用して入力または Context オブジェクトから選択することができます。パスを使用して値を選択するキーと値のペアの場合、キーの名前は `.$` で終わる必要があります。

例えば、以下の入力を使用するとします。

```
{
  "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"
  }
},
```

入力に加えて、Context オブジェクトと呼ばれる特別な JSON オブジェクトにもアクセスできます。Context オブジェクトには、ステートマシンの実行に関する情報が含まれています。「[Step Functions の Context オブジェクトから実行データにアクセスする](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 リソースネーム (ARN) を解析して、バケット名とキー値を取得します。詳細については、「[Step Functions で大きなペイロードを渡す代わりに Amazon S3 の ARN を使用する](sfn-best-practices.md#avoid-exec-failures)」を参照してください。

または、実行時に小さいペイロードを渡すように実装を調整します。

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

 `ResultPath` を適用する前に、`ResultSelector` フィールドを利用して、状態の結果を操作します。`ResultSelector` フィールドでは、キーバリューペアのコレクションを作成できます。ここでは、値は静的であるか、状態の結果から選択されます。`ResultSelector` フィールドを使用すると、状態の結果のどの部分を `ResultPath` フィールドに渡すかを選択できます。

**注記**  
`ResultPath` フィールドを使用すると、`ResultSelector` フィールドの出力を元の入力に追加できます。

`ResultSelector` は、次の状態のオプションのフィールドです。
+ [Map 状態のワークフロー](state-map.md)
+ [Task ワークフロー状態](state-task.md)
+ [Parallel ワークフローの状態](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"
  }
}
```

その後、`ResultSelector` を使って `resourceType` と `ClusterId` を選択できます。

```
"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>

ステートマシンの [Parallel ワークフローの状態](state-parallel.md) または [Map 状態のワークフロー](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)