チュートリアル: Step Functions でステートマシンの実行を確認する - AWS Step Functions

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

チュートリアル: Step Functions でステートマシンの実行を確認する

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

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

注記

次の手順には、Standard ワークフロー実行の詳細を調べる方法が記載されていますが、Express ワークフロー実行の詳細を調べることもできます。Standard ワークフロータイプと Express ワークフロータイプの実行の詳細の違いについては、Step Functions でのワークフロー実行の詳細の表示 を参照してください。

ステップ 1: 必要な Lambda 関数を作成およびテストする

  1. Lambda コンソールを開き、ステップ 1: Lambda 関数を作成する セクションのステップ 1~4 を実行します。Lambda 関数には必ず GetListOfFruits と名前を付けてください。

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

    arn:aws:lambda:us-east-1:123456789012:function:function-name
  3. 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); };
  4. [デプロイ][テスト] の順に選択して変更をデプロイし、Lambda 関数の出力を確認します。

  5. 次のステップで、GetFruitPriceCalculateAverage という名前をそれぞれ付けた 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; };
    2. 次のコードを 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); };
    3. これら 2 つの Lambda 関数ARNsの をコピーし、デプロイしてテストしてください。

ステップ 2: ステートマシンを作成および実行する

Step Functions コンソールを使用して、ステップ 1 で作成した Lambda 関数を呼び出すステートマシンを作成します。このステートマシンには 3 つの Map ステートが定義されています。これらの各 Map ステートには、Lambda 関数のいずれかを呼び出す Task ステートが含まれています。また、各 Task ステートに 1 つの Retry フィールドと再試行回数が定義されています。Task ステートでランタイムエラーが発生した場合、その Task ステートに定義されている再試行回数まで再実行されます。

  1. Step Functions コンソールを開き、[コードでワークフローを記述] を選択します。

    重要

    ステートマシンが、前に作成した Lambda 関数と同じ AWS アカウントとリージョンにあることを確認します。

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

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

    { "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:us-east-1: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:us-east-1: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:us-east-1: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 } } }
  4. ステートマシンに名前を入力します。このページの他のオプションについては、デフォルトのままにし、[ステートマシンの作成] を選択します。

  5. ステートマシン名が記載されたページを開きます。ステップ 4: ステートマシンを実行する セクションのステップ 1~4 を実行しますが、実行入力には以下のデータを使用します。

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

ステップ 3: ステートマシンの実行の詳細を表示する

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

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

  2. ステートマシンの実行に失敗した場合は、エラーメッセージで [原因] または [ステップの詳細を表示] を選択します。エラーの詳細はステップの詳細セクションに表示されます。というTask状態であるエラーの原因となったステップがGetListofFruitsグラフビューテーブルビュー で強調表示されていることに注意してください。

    注記

    GetListofFruits ステップは Map状態内で定義され、ステップが正常に実行されなかったため、ステータスMapステップは失敗 と表示されます。

ステップ 4: さまざまな表示モードを詳しく見る

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

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

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

  2. [マップイテレーションビューア] から、表示するイテレーションを選択します。イテレーション回数はゼロからカウントされます。5 回のうち 3 回目のイテレーションを選択するには、[Map] ステート名の横にあるドロップダウンリストから [#2] を選択します。

    注記

    ステートマシンにネストされたMap状態が含まれている場合、Step Functions は、ネストされたMap状態のイテレーションデータを表す 2 つの個別のドロップダウンリストとして親ステートと子ステートのイテレーションを表示します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  3. Type = TaskFailed を選択します。

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

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