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

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

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

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

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

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

フロー状態

フロー状態は、ステップの実行フローを制御します。例えば、選択状態は条件付きロジックを提供し、待機状態はワークフロー実行を一時停止し、マップ状態はデータセット内の各項目に対して子ワークフローを実行し、並列状態はワークフローに別々のブランチを作成します。

タスクの状態

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

Step Functions ワークフローのコンポーネントの例を示します。

実行とエラーの処理

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

データの受け渡し

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

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

データの変換

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

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

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

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

注記

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

主要なコンセプト

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

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

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

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

Workflow Studio

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

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

ステートマシン

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

詳細については、「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 は、エスケープされたJSON文字列からのレスポンスの Payloadフィールドを JSON オブジェクトに自動的に変換します。

サービス統合パターン

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

実行

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

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

ステートマシンデータ

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

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

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

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

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

データ形式

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

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

  • 有効なJSONテキストは次のとおりです。

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

    • オブジェクト

    • 配列

    • 数字

    • ブール値

    • null

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

ステートマシンの入出力

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

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

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

Express ワークフローでは、ログ記録を有効にした場合は、 CloudWatch ログから結果を取得するか、Step Functions コンソールで実行を表示およびデバッグできます。詳細については、 CloudWatch ログを使用した 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 から を呼び出す

ステートマシンを呼び出すため他の複数のサービスを構成できます。ステートマシンのワークフロータイプに基づいて、ステートマシンを非同期または同期的で呼び出すことができます。ステートマシンを同期的に呼び出すには、 StartSyncExecutionAPI呼び出しまたは 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 リソースネーム) が使用されます。UpdateStateMachine を呼び出したすぐ後に開始された実行では、前のステートマシン定義と roleArn が使用されることがあります。

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