

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

# Step Functions でステートマシンの実行を調査する
<a name="debug-sm-exec-using-ui"></a>

このチュートリアルでは、*実行の詳細*ページに表示される実行情報を調べて、実行が失敗した理由を確認する方法を学習します。次に、`Map` ステート実行のさまざまなイテレーションにアクセスする方法について学習します。最後に、**[テーブルビュー]** で列を設定し、適切なフィルターを適用して関心のある情報のみを表示する方法を学習します。

このチュートリアルでは、フルーツセットの価格を取得する標準タイプのステートマシンを作成します。これを実行するのに、ステートマシンは 3 つの AWS Lambda 関数を使用して、4 つの果物のランダムなリスト、各果物の価格、果物の平均価格を返します。Lambda 関数は、果物の価格がしきい値以下の場合にエラーを返します。

**注記**  
次の手順には、Standard ワークフロー実行の詳細を調べる方法が記載されていますが、Express ワークフロー実行の詳細を調べることもできます。Standard ワークフロータイプと Express ワークフロータイプの実行の詳細の違いについては、[Standard コンソールと Express コンソールのエクスペリエンスの違い](concepts-view-execution-details.md#console-exp-differences) を参照してください。

## ステップ 1: 必要な Lambda 関数を作成およびテストする
<a name="step-create-all-lambda-functions"></a>

1. [Lambda コンソール](https://console.aws.amazon.com/lambda/home)を開き、[ステップ 1: Lambda 関数を作成する](tutorial-creating-lambda-state-machine.md#create-lambda-function) セクションのステップ 1～4 を実行します。Lambda 関数には必ず **GetListOfFruits** と名前を付けてください。

1. Lambda 関数を作成したら、ページの右上隅に表示されている関数の Amazon リソースネーム (ARN) をコピーします。ARN をコピーするには、コピーアイコンをクリックして Lambda 関数の Amazon リソースネームをコピーします。ARN の例を次に示します。ここで、*`function-name`* は Lambda 関数の名前 (この場合は `GetListOfFruits`) です。

   ```
   arn:aws:lambda:region:123456789012:function:function-name
   ```

1. Lambda 関数の次のコードを、**[GetListOfFruits]** ページの **[コードソース]** エリアにコピーします。

   ```
   function getRandomSubarray(arr, size) {
       var shuffled = arr.slice(0), i = arr.length, temp, index;
       while (i--) {
           index = Math.floor((i + 1) * Math.random());
           temp = shuffled[index];
           shuffled[index] = shuffled[i];
           shuffled[i] = temp;
       }
       return shuffled.slice(0, size);
   }
   
   exports.handler = async function(event, context) {
       
       const fruits = ['Abiu','Açaí','Acerola','Ackee','African cucumber','Apple','Apricot','Avocado','Banana','Bilberry','Blackberry','Blackcurrant','Jostaberry'];
   
       
        const errorChance = 45;
       
       const waitTime = Math.floor( 100 * Math.random() );
   
       await new Promise( r => setTimeout(() => r(), waitTime));
   
       const num = Math.floor( 100 * Math.random() );
       // const num = 51;
        if (num <= errorChance) {
            throw(new Error('Error'));
        }
   
       return getRandomSubarray(fruits, 4);
   };
   ```

1. **[デプロイ]**、**[テスト]** の順に選択して変更をデプロイし、Lambda 関数の出力を確認します。

1. 次のステップで、**GetFruitPrice**、**CalculateAverage** という名前をそれぞれ付けた 2 つの Lambda 関数を追加します。

   1. 次のコードを、**[GetFruitPrice]** Lambda 関数の **[コードソース]** エリアにコピーします。

      ```
      exports.handler = async function(event, context) {
          
          const errorChance = 0;
          const waitTime = Math.floor( 100 * Math.random() );
      
          await new Promise( r => setTimeout(() => r(), waitTime));
      
          const num = Math.floor( 100 * Math.random() );
          if (num <= errorChance) {
              throw(new Error('Error'));
          }
      
          return Math.floor(Math.random()*100)/10;
      };
      ```

   1. 次のコードを、**[CalculateAverage]** Lambda 関数の **[コードソース]** エリアにコピーします。

      ```
      function getRandomSubarray(arr, size) {
          var shuffled = arr.slice(0), i = arr.length, temp, index;
          while (i--) {
              index = Math.floor((i + 1) * Math.random());
              temp = shuffled[index];
              shuffled[index] = shuffled[i];
              shuffled[i] = temp;
          }
          return shuffled.slice(0, size);
      }
      
      const average = arr => arr.reduce( ( p, c ) => p + c, 0 ) / arr.length;
          
      exports.handler = async function(event, context) {
              const errors = [
              "Error getting data from DynamoDB",
              "Error connecting to DynamoDB",
              "Network error",
              "MemoryError - Low memory"
              ]
              
          const errorChance = 0;
          
          const waitTime = Math.floor( 100 * Math.random() );
      
          await new Promise( r => setTimeout(() => r(), waitTime));
      
          const num = Math.floor( 100 * Math.random() );
          if (num <= errorChance) {
              throw(new Error(getRandomSubarray(errors, 1)[0]));
          }
      
          return average(event);
      };
      ```

   1. 必ず、これら 2 つの Lambda 関数の ARN をコピーしてから、**[デプロイ]** および **[テスト]** をクリックしてください。

## ステップ 2: ステートマシンを作成および実行する
<a name="step-create-exec-sm"></a>

[Step Functions コンソール](https://console.aws.amazon.com/states/home?region=us-east-1#/)を使用して、[ステップ 1 で作成した Lambda 関数](#step-create-all-lambda-functions)を呼び出すステートマシンを作成します。このステートマシンには 3 つの `Map` ステートが定義されています。これらの各 `Map` ステートには、Lambda 関数のいずれかを呼び出す `Task` ステートが含まれています。また、各 `Task` ステートに 1 つの `Retry` フィールドと再試行回数が定義されています。`Task` ステートでランタイムエラーが発生した場合、その `Task` ステートに定義されている再試行回数まで再実行されます。

1. [Step Functions コンソール](https://console.aws.amazon.com/states/home)を開き、**[コードでワークフローを記述]** を選択します。
**重要**  
ステートマシンが、前に作成した Lambda 関数と同じ AWS アカウントおよびリージョンにあることを確認します。

1. **[タイプ]** については、デフォルトの **[標準]** のままにします。

1. 以下の Amazon States Language をコピーして **[定義]** に貼り付けます。表示されている ARN は、先に作成した Lambda 関数の ARN に必ず置き換えてください。

   ```
   {
       "StartAt": "LoopOverStores",
       "States": {
           "LoopOverStores": {
               "Type": "Map",
               "Iterator": {
                   "StartAt": "GetListOfFruits",
                   "States": {
                       "GetListOfFruits": {
                           "Type": "Task",
                           "Resource": "arn:aws:states:::lambda:invoke",
                           "OutputPath": "$.Payload",
                           "Parameters": {
                               "FunctionName": "arn:aws:lambda:region:123456789012:function:GetListofFruits:$LATEST",
                               "Payload": {
                                   "storeName.$": "$"
                               }
                           },
                           "Retry": [
                               {
                                   "ErrorEquals": [
                                       "States.ALL"
                                   ],
                                   "IntervalSeconds": 2,
                                   "MaxAttempts": 1,
                                   "BackoffRate": 1.3
                               }
                           ],
                           "Next": "LoopOverFruits"
                       },
                       "LoopOverFruits": {
                           "Type": "Map",
                           "Iterator": {
                               "StartAt": "GetFruitPrice",
                               "States": {
                                   "GetFruitPrice": {
                                       "Type": "Task",
                                       "Resource": "arn:aws:states:::lambda:invoke",
                                       "OutputPath": "$.Payload",
                                       "Parameters": {
                                           "FunctionName": "arn:aws:lambda:region:123456789012:function:GetFruitPrice:$LATEST",
                                           "Payload": {
                                               "fruitName.$": "$"
                                           }
                                       },
                                       "Retry": [
                                           {
                                               "ErrorEquals": [
                                                   "States.ALL"
                                               ],
                                               "IntervalSeconds": 2,
                                               "MaxAttempts": 3,
                                               "BackoffRate": 1.3
                                           }
                                       ],
                                       "End": true
                                   }
                               }
                           },
                           "ItemsPath": "$",
                           "End": true
                       }
                   }
               },
               "ItemsPath": "$.stores",
               "Next": "LoopOverStoreFruitsPrice",
               "ResultPath": "$.storesFruitsPrice"
           },
           "LoopOverStoreFruitsPrice": {
               "Type": "Map",
               "End": true,
               "Iterator": {
                   "StartAt": "CalculateAverage",
                   "States": {
                       "CalculateAverage": {
                           "Type": "Task",
                           "Resource": "arn:aws:states:::lambda:invoke",
                           "OutputPath": "$.Payload",
                           "Parameters": {
                               "FunctionName": "arn:aws:lambda:region:123456789012:function:Calculate-average:$LATEST",
                               "Payload.$": "$"
                           },
                           "Retry": [
                               {
                                   "ErrorEquals": [
                                       "States.ALL"
                                   ],
                                   "IntervalSeconds": 2,
                                   "MaxAttempts": 2,
                                   "BackoffRate": 1.3
                               }
                           ],
                           "End": true
                       }
                   }
               },
               "ItemsPath": "$.storesFruitsPrice",
               "ResultPath": "$.storesPriceAverage",
               "MaxConcurrency": 1
           }
       }
   }
   ```

1. ステートマシンに名前を入力します。このページの他のオプションについては、デフォルトのままにし、**[ステートマシンの作成]** を選択します。

1. ステートマシン名が記載されたページを開きます。[ステップ 4: ステートマシンを実行する](tutorial-creating-lambda-state-machine.md#start-lambda-function) セクションのステップ 1～4 を実行しますが、実行入力には以下のデータを使用します。

   ```
   {
       "stores": [
         "Store A",
         "Store B",
         "Store C",
         "Store D"
       ]
   }
   ```

## ステップ 3: ステートマシンの実行の詳細を表示する
<a name="view-sm-exec-details"></a>

実行 ID がタイトルに表示されているページでは、実行結果を確認するほか、エラーをデバッグできます。

1. (オプション) *実行の詳細* ページに表示されているタブから選択すると、それぞれのタブに表示される情報を確認できます。例えば、ステートマシンの入力とその実行出力を表示するには、*[実行概要](concepts-view-execution-details.md#exec-details-intf-exec-summ)*セクションの **[実行の入力と出力]** を選択します。

1. ステートマシンの実行に失敗した場合は、エラーメッセージで **[原因]** または **[ステップの詳細を表示]** を選択します。エラーの詳細は*[ステップの詳細](concepts-view-execution-details.md#exec-details-intf-step-details)*セクションに表示されます。エラーの原因となったステップ (**[GetListofFruits]** という名前の `Task` ステート) が、**[グラフビュー]** と **[テーブルビュー]** でハイライトされていることに注意してください。
**注記**  
**[GetListofFruits]** ステップは `Map` ステート内で定義され、そのステップは正常に実行されなかったため、`Map` ステートステップの **[ステータス]** は **[失敗]** と表示されます。

## ステップ 4: さまざまな*表示モード*を詳しく見る
<a name="sm-exec-details-exp-view-modes"></a>

好みのモードを選択して、ステートマシンワークフローまたは実行イベント履歴を表示することができます。これらの*表示モード*で実行できるタスクには、次のようなものがあります。

### **[グラフビュー]** - 別の `Map` ステートイテレーションに切り替える
<a name="graph-view-see-map-state-iterations"></a>

**[Map]** ステートのイテレーションが 5 回あり、3 回目と 4 回目のイテレーションの実行詳細を表示する場合は、次の操作を行います。

1. イテレーションデータを表示する `Map` ステートを選択します。

1. **[マップイテレーションビューア]** から、表示するイテレーションを選択します。イテレーション回数はゼロからカウントされます。5 回のうち 3 回目のイテレーションを選択するには、**[Map]** ステート名の横にあるドロップダウンリストから **[\$12]** を選択します。
**注記**  
ステートマシンにネストされた `Map` ステートが含まれている場合、Step Functions は親と子の `Map` ステートイテレーションを、ネストされた状態のイテレーションデータを示す 2 つの別々のドロップダウンリストとして表示します。

1. (オプション) 1 つ以上の `Map` ステートイテレーションの実行に失敗したか、中断した状態で停止された場合は、失敗したイテレーションに関する詳細を確認できます。これらの詳細を確認するには、ドロップダウンリストの **[失敗]** または **[中断]** で該当するイテレーション番号を選択します。

### **[テーブルビュー]** - 別の `Map` ステートイテレーションに切り替える
<a name="table-view-see-map-state-iterations"></a>

**[Map]** ステートのイテレーションが 5 回あり、3 回目と 4 回目のイテレーションについて実行の詳細を表示する場合は、次の操作を行います。

1. 別のイテレーションデータを表示する `Map` ステートを選択します。

1. `Map` ステートイテレーションのツリービュー表示で、3 回目のイテレーションは **\$12** という名前が付いたイテレーションの行を選択します。同様に、4 回目のイテレーションは **\$13** という名前の行を選択します。

### **[テーブルビュー]** - 表示する列を設定する
<a name="table-view-cfg-display-cols"></a>

[設定] アイコンを選択します。次に、**[環境設定]** ダイアログボックスの **[表示する列を選択]** で表示する列を選択します。

デフォルトでは、このモードには、**[名前]**、**[タイプ]**、**[ステータス]**、**[リソース]**、**[開始後]** の各列が表示されます。

### **[テーブルビュー]** - 結果をフィルタリングする
<a name="table-view-filter-results"></a>

**ステータス**などのプロパティや日付と時刻の範囲に基づいて 1 つ以上のフィルターを適用して、表示する情報量を制限します。例えば、実行に失敗したステップを表示するには、次のフィルターを適用します。

1. **[プロパティによるフィルタリング、またはキーワードによる検索]** を選択し、**[プロパティ]** で **[ステータス]** を選択します。

1. **[オペレータ]** で **[ステータス =]** を選択します。

1. **[ステータス = 失敗]** を選択します。

1. (オプション) 適用したフィルターを削除するには、**[フィルターをクリア]** を選択します。

### **[イベントビュー]** - 結果をフィルタリングする
<a name="event-view-filter-results"></a>

**[タイプ]** などのプロパティや日付と時刻の範囲に基づいて 1 つ以上のフィルターを適用して、表示する情報量を制限します。例えば、実行に失敗した `Task` ステートを表示するには、次のフィルターを適用します。

1. **[プロパティによるフィルタリング、またはキーワードによる検索]** を選択し、**[プロパティ]** で **[タイプ]** を選択します。

1. **[オペレータ]** で **[タイプ =]** を選択します。

1. **[タイプ = TaskFailed]** を選択します。

1. (オプション) 適用したフィルターを削除するには、**[フィルターをクリア]** を選択します。

### **[イベントビュー]** - **[TaskFailed]** イベントの詳細を調査する
<a name="event-view-inspect-failed-task-details"></a>

**TaskFailed** イベントの ID の横にある矢印アイコンを選択して、ドロップダウンボックスに表示される入力、出力、リソース呼び出しなどの詳細を調べます。