Step Functions のステートマシンについて - AWS Step Functions

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

Step Functions のステートマシンについて

Step Functions は、ワークフローとも呼ばれるステートマシンに基づいています。ワークフローは、一連のイベント駆動型ステップで構成されます。

ASL とも呼ばれる Amazon States Language を使用してワークフローを定義します。必要に応じて、ビジュアルワークフローデザイナーである Workflow Studio を使用して、ワークフローを構築および編集できます。

ワークフローの各ステップはステートと呼ばれます。状態には、フロー状態とタスク状態の 2 種類があります。

フロー状態

フロー状態は、ステップの実行フローを制御します。例えば、Choice 状態は条件付きロジックを提供し、Waiting 状態はワークフロー実行を一時停止し、Map 状態はデータセット内の項目ごとに子ワークフローを実行し、Parallel 状態はワークフローに個別のブランチを作成します。

タスクの状態

タスクの状態は、別の AWS のサービス や API の呼び出しなど、別の AWS サービスが実行する作業単位を表します。タスクの状態はアクションとも呼ばれます。 AWS および外部サービスで作業を実行するには、数百のアクションを選択できます。(注: Step Functions の外部で実行されるワーカーを使用してタスクを実行することもできます。 詳細については、「」を参照してくださいアクティビティ。)

Step Functions ワークフローのコンポーネントの例。

実行とエラーの処理

ワークフローを実行すると、Step Functions は実行と呼ばれるワークフローインスタンスを作成します。ワークフロー実行のステータスをモニタリングできます。実行でエラーが発生した場合、ワークフローはエラーをキャッチする可能性があります。ユースケースによっては、後で実行を再処理してワークフローを再開できます。

データの受け渡し

オプションで、JSON テキスト形式でワークフローに入力データを提供できます。各ステップは、変数と状態出力を使用して後続のステップにデータを渡すことができます。変数に保存されているデータは、後のステップで使用できます。状態出力は、次のステップの入力になります。データの受け渡しの詳細については、「」を参照してください変数を使用して状態間でデータを渡す

ワークフローの最後に、ステートマシンはオプションで JSON 形式で出力を生成できます。

データの変換

ステートマシンとステートマシンは、クエリ言語を使用してデータを変換できます。推奨されるクエリ言語は JSONata ですが、re:Invent 2024 より前に作成されたステートマシンは JSONPath を使用します。下位互換性のために、ステートマシンまたは個々の状態は、クエリ言語に JSONata を使用することをオプトインする必要があります。

JSONata ステートマシンと個々の状態は、JSONata」に設定されたQueryLanguageフィールドで認識できます。JSONPath を使用するステートマシンとステートには QueryLanguageフィールドがありません。

JSONPath を使用する状態には、InputPath、Parameters、ResultSelector、ResultPath、OutputPath などの状態フィールドがあります。JSONPath ステートマシン定義では、 で終わるフィールド名.$と、 $.と のプレフィックスが付いた値も表示されます。$$.どちらもパスを表します。パスには、 などのさまざまな組み込み関数が表示される場合がありますStates.MathAdd。組み込み関数は JSONPath でのみ使用されます。

JSONata の状態は、引数フィールドと出力フィールドを使用します。これらのオプションフィールドには、 のような JSONata 式が表示される場合があります"{% $type = 'local' %}"。JSONata では、式、演算子、関数を使用できます。詳細については、「Step Functions での JSONata を使用したデータの変換」を参照してください。

注記

状態ごとに使用できるクエリ言語は 1 つだけです。JSONPath と JSONata を 1 つのステップで混在させることはできません。

主要なコンセプト

以下に、コンテキストの Step Functions の主要な用語の概要を示します。

言葉 説明
ワークフロー 多くの場合、ビジネスプロセスを反映する一連のステップ。
States

ステートマシンの個別のステップでは、入力に基づいて決定を行い、それらの入力からアクションを実行して、出力を他の状態に渡すことができます。

詳細については、「Step Functions で使用するワークフローの状態の検出」を参照してください。

Workflow Studio

ワークフローのプロトタイプ作成と構築を迅速に行えるようにする視覚的なワークフローデザイナー。

詳細については、「Step Functions Workflow Studio でのワークフローの開発」を参照してください。

ステートマシン

StartAtTimeoutSecondsVersion などのフィールドを使用してワークフロー内の個々の状態またはステップを表す JSON テキストを使って定義されるワークフロー。

詳細については、「Step Functions ワークフローの Amazon States Language でのステートマシン構造」を参照してください。

Amazon States Language

ステートマシンを定義するための、JSON ベースの構造化言語。ASL では、ユーザーが作業の実行 (Task 状態)、次に移行する状態の決定 (Choice 状態)、エラーによる実行の停止 (Fail 状態) などを実行できる、状態のコレクションを定義します。

詳細については、「Amazon States Language を使用して Step Functions ワークフローを定義する」を参照してください。

入力および出力の設定

ワークフローの状態で JSON データを入力として受け取ります。また、通常 JSON データを出力として次の状態に渡します。Step Functions には、状態間のデータフローを制御するためのフィルターが用意されています。

詳細については、「Step Functions の入力および出力処理」を参照してください。

サービス統合

ワークフローから AWS サービス API アクションを呼び出すことができます。

詳細については、「サービスと Step Functions の統合」を参照してください。

サービス統合タイプ
  • AWS SDK 統合 – ステートマシンから直接 200 以上 AWS のサービス 9,000 以上の API アクションを呼び出す標準的な方法です。

  • 統合の最適化 - 特定のサービスとのデータの呼び出しと交換を合理化するカスタム統合。例えば、Lambda Invoke は、レスポンスの Payload フィールドを、エスケープされた JSON 文字列から自動的に JSON オブジェクトに変換します。

サービス統合パターン

を呼び出すときは AWS のサービス、次のいずれかのサービス統合パターンを使用します。

実行

ステートマシンの実行は、ワークフローを実行してタスクを実施するインスタンスです。

詳細については、「Step Functions でステートマシンの実行を開始する」を参照してください。

ステートマシンデータ

ステートマシンのデータは、次の形式です。

  • ステートマシンへの最初の入力

  • 状態間で渡されるデータ

  • ステートマシンからの出力

このセクションでは、ステートマシンのデータを AWS Step Functionsでフォーマットして使用する方法について説明します。

データ形式

ステートマシンデータは JSON テキストで表されます。JSON によってサポートされる任意のデータ型を使用して、ステートマシンに値を指定できます。

注記
  • JSON テキスト形式の数値は、JavaScript セマンティクスに準拠します。これらの数値は通常、倍精度 IEEE-854 値に対応しています。

  • 有効な JSON テキストを次に示します。

    • 引用符で区切られたスタンドアロンの文字列

    • オブジェクト

    • 配列

    • 数字

    • ブール値

    • null

  • 状態の出力は、次の状態の入力になります。ただし、入力および出力処理を使用することにより、状態が入力データのサブセットでのみ機能するよう制限できます。

ステートマシンの入出力

初期入力データは、2 つの方法のいずれかで AWS Step Functions ステートマシンに渡すことができます。実行を開始すると、データを StartExecution アクションに渡すことができます。Step Functions コンソールから、データをステートマシンに渡すこともできます。初期データは、ステートマシンの StartAt 状態に渡されます。入力が提供されない場合、デフォルトは空のオブジェクト ({}) です。

実行の出力は、最後の状態 (terminal) により返されます。この出力は、実行の結果に JSON テキストとして表示されます。

標準ワークフローの場合、DescribeExecution アクションなど、外部呼び出し元を使用して実行履歴から実行結果を取得できます。実行結果は、Step Functions コンソールで確認できます。

Express ワークフローについては、ログ記録を有効にしている場合は、CloudWatch Logs から結果を取得したり Step Functions コンソールで実行を表示およびデバッグしたりすることができます。詳細については、CloudWatch Logs を使用した Step Functions の実行履歴のログ記録およびStep Functions コンソールでの実行の詳細の表示を参照してください。

ステートマシンに関連するクォータも考慮する必要があります。詳細については、「Step Functions のサービスクォータ」を参照してください

状態の入出力

各状態の入力は、前の状態の JSON テキストで構成されます。または、StartAt 状態の場合、実行への入力で構成されます。特定のフロー制御状態は、その出力への入力をエコーします。

次の例では、ステートマシンが 2 つの数値を同時に追加します。

  1. AWS Lambda 関数を定義します。

    function Add(input) { var numbers = JSON.parse(input).numbers; var total = numbers.reduce( function(previousValue, currentValue, index, array) { return previousValue + currentValue; }); return JSON.stringify({ result: total }); }
  2. ステートマシンを定義します。

    { "Comment": "An example that adds two numbers together.", "StartAt": "Add", "Version": "1.0", "TimeoutSeconds": 10, "States": { "Add": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Add", "End": true } } }
  3. 次の JSON テキストで実行を開始します。

    { "numbers": [3, 4] }

    Add 状態が JSON テキストを受け取り、Lambda 関数に渡します。

    Lambda 関数は、計算の結果をその状態に返します。

    状態は、その出力で次の値を返します。

    { "result": 7 }

    Add はステートマシンの最終状態でもあるため、この値はステートマシンの出力として返されます。

    最終状態が出力を返さない場合、ステートマシンは空のオブジェクト ({}) を返します。

詳細については、「Step Functions の入力および出力処理」を参照してください。

他の サービス AWS Step Functions から を呼び出す

ステートマシンを呼び出すため他の複数のサービスを構成できます。ステートマシンのワークフロータイプに基づいて、ステートマシンを非同期または同期的で呼び出すことができます。ステートマシンを同期で呼び出すには、StartSyncExecution API コールを使用するか、Amazon API Gateway を Express ワークフローと統合します。非同期呼び出しでは、Step Functions はタスクトークンが返されるまでワークフローの実行を一時停止します。ただし、タスクトークンを待っていると、ワークフローが同期します。

Step Functions を呼び出すように構成できるサービスには、次のものがあります。

Step Functions 呼び出しには、StartExecution クォータが適用されます。詳細については、以下を参照してください。

ステートマシンの移行

ステートマシンの新しい実行を開始すると、システムは最上位の StartAt フィールドで参照されている状態で開始されます。このフィールドは文字列として指定され、ワークフロー内の状態の名前と正確に一致する必要があります (大文字と小文字が区別されます)。

状態が実行されると、 は Nextフィールドの値 AWS Step Functions を使用して、次の状態を決定します。

Next フィールドでは、状態名を文字列として指定することもできます。この文字列では大文字と小文字が区別され、ステートマシンの説明で指定されたステートの名前と正確に一致する必要があります。

例えば、次の状態には NextState への移行が含まれています。

"SomeState" : { ..., "Next" : "NextState" }

ほとんどの状態では、Next フィールドによる 1 つの移行ルールのみ許可されます。ただし、特定のフロー制御ステート (Choice ステートなど) では、それぞれ独自の Next フィールドを使用して複数の移行ルールを指定できます。Amazon ステートメント言語では、移行の指定方法など、指定可能な各状態タイプについて詳しく説明されています。

状態には、他の状態からの受信移行を複数指定できます。

プロセスは、終了状態 ("Type": Succeed"Type": Fail、または "End": true の状態) のいずれかに到達するまで繰り返されます。そうでない場合は、ランタイムエラーが発生します。

実行を redrive すると状態遷移とみなされます。さらに、redrive で再実行されるすべての状態も状態遷移とみなされます。

ステートマシン内の状態には次のルールが適用されます。

  • 状態は、囲みブロック内ではどのような順序で発生してもかまいません。ただし、リストに記載されている順序は、実行順序には影響しません。この順序は状態の内容によって決まります。

  • ステートマシン内では、start 状態として指定できるのは 1 つの状態のみです。start 状態は最上位構造内の StartAt フィールドの値によって定義されます。

  • ステートマシンのロジックによっては (ステートマシンに複数のロジックブランチがあるかどうかなど)、複数の状態が存在する可能性があります。

  • ステートマシンが 1 つの状態のみで構成される場合、開始状態と終了状態の両方になることがあります。

分散マップの状態の遷移

Map 状態を分散モードで使用すると、分散マップ状態が開始された子ワークフロー実行ごとに 1 つの状態遷移に対して課金されます。Map 状態をインラインモードで使用すると、状態遷移は、インラインマップ状態が繰り返されるごとには課金されません。

Map 状態を分散モードで使用することによりコストを最適化し、ネストされたワークフローを Map 状態の定義に含めることができます。また、分散マップ状態は、Express タイプの子ワークフロー実行を開始するときに、より高い価値を発揮します。Step Functions は Express の子ワークフロー実行のレスポンスとステータスを保存します。そのため、実行データを CloudWatch Logs に保存する必要がなくなります。エラーしきい値の定義や項目グループのバッチ処理など、分散マップの状態で使用できるフロー制御にアクセスすることもできます。Step Functions の料金情報については、「AWS Step Functions の料金」を参照してください。

Step Functions 読み取り整合性

のステートマシンの更新 AWS Step Functions は、結果整合性があります。数秒以内のすべての StartExecution 呼び出しでは、更新された定義と roleArn (IAM ロールの Amazon リソースネーム (ARN)) が使用されます。UpdateStateMachine を呼び出したすぐ後に開始された実行では、前のステートマシン定義と roleArn が使用されることがあります。

詳細については次を参照してください: