

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

# 例: Step Functions ワークフローでパスを使用したステートデータの操作
<a name="input-output-example"></a>

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

このトピックでは、InputPath フィールド、ResultPath フィールド、および OutputPath フィールドを使用して、状態入力と出力 JSON を操作する方法の例を示します。

[ワークフロー状態に失敗する](state-fail.md) 状態または [Succeed ワークフロー状態](state-succeed.md) 状態以外のすべての状態には、`InputPath`、`ResultPath`、`OutputPath`などの入力および出力処理フィールドを含めることができます。また、[Wait ワークフロー状態](state-wait.md) および [Choice ワークフローの状態](state-choice.md) 状態は `ResultPath` フィールドをサポートしていません。これらのフィールドを使用すると、[JSJsonPath](https://datatracker.ietf.org/wg/jsonpath/about/) を使用してワークフロー内を移動する JSON データをフィルタリングできます。

`Parameters` フィールドを使用して、JSON データがワークフロー内を移動する際にそのデータを操作することもできます。`Parameters` の使用の詳細については、「[Step Functions ワークフロー内でパラメータを操作する](input-output-inputpath-params.md)」を参照してください。

例えば、AWS Lambda チュートリアルに示す [Lambda を使用する Step Functions ステートマシン状態の作成](tutorial-creating-lambda-state-machine.md) 関数とステートマシンから開始します。次の `InputPath`、`ResultPath`、`OutputPath` が含まれるように、ステートマシンを変更します。

```
{
  "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function",
  "StartAt": "HelloWorld",
  "States": {
    "HelloWorld": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:region:123456789012:function:HelloFunction",
      "InputPath": "$.lambda",
      "ResultPath": "$.data.lambdaresult",
      "OutputPath": "$.data",
      "End": true
    }
  }
}
```

次の入力を使用して実行を開始します。

```
{
  "comment": "An input comment.",
  "data": {
    "val1": 23,
    "val2": 17
  },
  "extra": "foo",
  "lambda": {
    "who": "AWS Step Functions"
  }
}
```

`comment` および `extra` ノードは破棄できますが、Lambda 関数の出力を含め、`data` ノードに情報を保存したいと思っています。

更新されたステートマシンで、`Task` 状態は、タスクへの入力を処理するように変更されます。

```
"InputPath": "$.lambda",
```

ステートマシン定義のこの行によって、タスク入力は、状態入力から `lambda` ノードのみに制限されます。Lambda 関数は、入力として JSON オブジェクト (`{"who": "AWS Step Functions"}`) のみを受信します。

```
"ResultPath": "$.data.lambdaresult",
```

この `ResultPath` は、元のステートマシン入力の `data` ノードの子として、Lambda 関数の結果を `lambdaresult` という名前のノードに挿入するよう指示します。元の入力および `OutputPath` を使った結果に対してこれ以上処理を実行しないため、状態の出力には元の入力を使った Lambda 関数の結果が含まれるようになります。

```
{
  "comment": "An input comment.",
  "data": {
    "val1": 23,
    "val2": 17,
    "lambdaresult": "Hello, AWS Step Functions!"
  },
  "extra": "foo",
  "lambda": {
    "who": "AWS Step Functions"
  }
}
```

しかし、目的は `data` ノードのみを保持し、Lambda 関数の結果を含めることです。`OutputPath` を使用して、状態出力に渡す前に、結合されたこの JSON をフィルタリングします。

```
"OutputPath": "$.data",
```

これにより、出力に渡される、元の入力の `data` ノード (例: `lambdaresult` によって挿入される `ResultPath` の子) のみ選択されます。状態出力は、次のようにフィルタリングされます。

```
{
  "val1": 23,
  "val2": 17,
  "lambdaresult": "Hello, AWS Step Functions!"
}
```

この `Task` 状態では次のようになります。

1. `InputPath` では、Lambda 関数への入力から `lambda` ノードのみ送信します。

1. `ResultPath` では、元の入力の `data` ノードの子として結果を挿入します。

1. `OutputPath` では、`data` ノードのみが状態出力に渡されるように、状態入力 (現在は Lambda 関数の結果が含まれる) がフィルタリングされます。

**Example JsonPath を使用して、元のステートマシンの入力、結果、最終出力を操作する**  
保険申請者の身元と住所を検証する以下のステートマシンを考えてみましょう。  
完全な例を表示するには、「[Step Functions での JSON パスの使用方法](https://github.com/aws-samples/serverless-account-signup-service)」を参照してください。

```
{
  "Comment": "Sample state machine to verify an applicant's ID and address",
  "StartAt": "Verify info",
  "States": {
    "Verify info": {
      "Type": "Parallel",
      "End": true,
      "Branches": [
        {
          "StartAt": "Verify identity",
          "States": {
            "Verify identity": {
              "Type": "Task",
              "Resource": "arn:aws:states:::lambda:invoke",
              "Parameters": {
                "Payload.$": "$",
                "FunctionName": "arn:aws:lambda:us-east-2:111122223333:function:check-identity:$LATEST"
              },
              "End": true
            }
          }
        },
        {
          "StartAt": "Verify address",
          "States": {
            "Verify address": {
              "Type": "Task",
              "Resource": "arn:aws:states:::lambda:invoke",
              "Parameters": {
                "Payload.$": "$",
                "FunctionName": "arn:aws:lambda:us-east-2:111122223333:function:check-address:$LATEST"
              },
              "End": true
            }
          }
        }
      ]
    }
  }
}
```
次の入力を使用してこのステートマシンを実行すると、検証を実行する Lambda 関数は検証が必要なデータのみを入力として想定するため、実行は失敗します。そのため、適切な JsonPath を使用して検証する情報を含むノードを指定する必要があります。  

```
{
  "data": {
    "firstname": "Jane",
    "lastname": "Doe",
    "identity": {
      "email": "jdoe@example.com",
      "ssn": "123-45-6789"
    },
    "address": {
      "street": "123 Main St",
      "city": "Columbus",
      "state": "OH",
      "zip": "43219"
    },
    "interests": [
      {
        "category": "home",
        "type": "own",
        "yearBuilt": 2004
      },
      {
        "category": "boat",
        "type": "snowmobile",
        "yearBuilt": 2020
      },
      {
        "category": "auto",
        "type": "RV",
        "yearBuilt": 2015
      },
    ]
  }
}
```
`check-identity` Lambda 関数が使用する必要があるノードを指定するには、以下のように `InputPath` フィールドを使用します。  

```
"InputPath": "$.data.identity"
```
加えて、`check-address` Lambda 関数が使用する必要があるノードを指定するには、以下のように `InputPath` フィールドを使用します。  

```
"InputPath": "$.data.address"
```
ここで、検証結果を元のステートマシン入力内に保存する場合は、以下のように `ResultPath` フィールドを使用します。  

```
"ResultPath": "$.results"
```
ただし、ID と検証の結果のみが必要で、元の入力を破棄する場合は、以下のように `OutputPath` フィールドを使用します。  

```
"OutputPath": "$.results"
```

詳細については、「[Step Functions の入力および出力処理](concepts-input-output-filtering.md)」を参照してください。

## OutputPath を使用したステートの出力のフィルタリング
<a name="input-output-outputpath"></a>

`OutputPath` を使用すると、状態の出力の一部を選択して次の状態に渡すことができるようになります。このアプローチを使用すると、不要な情報をフィルタリングして、JSON データの必要な部分のみを渡すことができます。

`OutputPath` を指定しない場合、デフォルトの値は `$` です。これによって、JSON ノード全体 (状態の入力、タスクの結果、および `ResultPath` によって決定) が次の状態に渡されます。