ステートマシンのアプリケーションパターン - AWS Lambda

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

ステートマシンのアプリケーションパターン

Step Functions では、ステートマシンを使用してリソースをオーケストレーションします。ステートマシンは、Amazon ステートメント言語と呼ばれる JSON ベースの構造化言語で定義されています。

ステートマシンのコンポーネント

ステートマシンには、ワークフローを構成する状態と呼ばれる要素が含まれています。各状態のロジックによって、次に来る状態、渡すデータ、ワークフローを終了するタイミングが決定されます。状態は、その名前で参照します。名前には任意の文字列を使用できますが、ステートマシン全体内で一意にする必要があります。

Lambda を使用するステートマシンを作成するには、次のコンポーネントが必要です。

  1. 1 つ以上のアクセス許可ポリシー AWS Identity and Access Management (AWSLambdaRoleサービスアクセス許可など) を持つ Lambda の (IAM) ロール。

  2. 特定のランタイム用の 1 つ以上の Lambda 関数 (IAM ロールがアタッチ済み)。

  3. Amazon ステートメント言語で作成されたステートマシン。

ステートマシンのアプリケーションパターン

次のようなアプリケーションパターンを使用して、ステートマシンの複雑なオーケストレーションを作成できます。

  • キャッチと再試行 — 高度な catch-and-retry 機能を使用してエラーを処理します。

  • 分岐 - Lambda 関数の出力に基づいて異なる分岐を選択するようにワークフローを設計します。

  • チェーン - 複数の関数を一連のステップとして連結し、1 つのステップの出力を次のステップの入力にします。

  • 並列処理 - 関数を並列に実行するか、動的並列処理を使用して任意の配列のメンバーごとに関数を呼び出します。

ステートマシンへのパターンの適用

これらのアプリケーションパターンを Amazon ステートメント言語の定義内のステートマシンに適用する方法を次に示します。

キャッチと再試行

Catch フィールドと Retryフィールドは、ステートマシンに catch-and-retry ロジックを追加します。キャッチ ("Type": "Catch") は、フォールバック状態を定義するオブジェクトの配列です。再試行 ("Type": "Retry") は、状態でランタイムエラーが発生した場合の再試行ポリシーを定義するオブジェクトの配列です。

分岐

Choice ステートは、ステートマシンに分岐ロジックを追加します。Choice ("Type": "Choice") は、ステートマシンが次に移行する状態を決定するルールの配列です。

チェーン

「チェーン」パターンは、ステートマシン内の相互に接続された複数の Lambda 関数を表します。チェーンを使用すると、ステートマシンの Task ("Type": "Task") 状態から再利用可能なワークフロー呼び出しを作成できます。

並列処理

Parallel ステートは、ステートマシンに並列処理ロジックを追加します。Parallel ステート ("Type": "Parallel") を使用して、ステートマシンに呼び出しの並列分岐を作成できます。

動的並列処理

Map ステートは、ステートマシンに動的な「for-each」ループロジックを追加します。Map ステート ("Type": "Map") を使用して、ステートマシン内の入力配列の要素ごとに一連のステップを実行できます。Parallel ステートは、同じ入力を使用してステップの複数の分岐を呼び出しますが、Map ステートは配列の複数のエントリに対して同じステップを呼び出します。

Step Functions は、アプリケーションパターンに加えて、さまざまなサービス統合パターンをサポートしています。これには、人間による承認のためにワークフローを一時停止する機能、レガシーシステムやその他のサードパーティーを呼び出す機能が含まれます。

分岐アプリケーションパターンの例

次の例では、Amazon ステートメント言語 (ASL) 定義で定義されている WhichCoat ステートマシンが、Choice 状態 ("Type": "Choice") の分岐アプリケーションパターンを示しています。3 つの Choice ステートのいずれかの条件が満たされると、Lambda 関数が Task として呼び出されます。

  1. WearHeavyCoat ステートは wear_heavy_coat Lambda 関数を呼び出し、メッセージを返します。

  2. WearLightJacket ステートは wear_light_jacket Lambda 関数を呼び出し、メッセージを返します。

  3. None ステートは no_jacket Lambda 関数を呼び出し、メッセージを返します。

WhichCoat ステートマシンの構造は次のとおりです。

例 Amazon ステートメント言語の定義の例

WhichCoat ステートマシンの次の Amazon ステートメント言語定義では、Variable という Weather コンテキストオブジェクトを使用します。StringEquals の 3 つの条件のいずれかが満たされると、Resource フィールドの Amazon リソースネーム (ARN) に定義されている Lambda 関数が呼び出されます。

{ "Comment":"Coat Indicator State Machine", "StartAt":"WhichCoat", "States":{ "WhichCoat":{ "Type":"Choice", "Choices":[ { "Variable":"$.Weather", "StringEquals":"FREEZING", "Next":"WearHeavyCoat" }, { "Variable":"$.Weather", "StringEquals":"COOL", "Next":"WearLightJacket" }, { "Variable":"$.Weather", "StringEquals":"WARM", "Next":"None" } ] }, "WearHeavyCoat":{ "Type":"Task", "Resource":"arn:aws:lambda:us-west-2:01234567890:function:wear_heavy_coat", "End":true }, "WearLightJacket":{ "Type":"Task", "Resource":"arn:aws:lambda:us-west-2:01234567890:function:wear_light_jacket", "End":true }, "None":{ "Type":"Task", "Resource":"arn:aws:lambda:us-west-2:01234567890:function:no_coat", "End":true } } }

例 Python 関数の例

Python (wear_heavy_coat) の次の Lambda 関数は、前の例で定義したステートマシンに対して呼び出すことができます。WhichCoat ステートマシンが FREEZING の文字列値に等しい場合、wear_heavy_coat 関数が Lambda から呼び出され、ユーザーは、関数「You should wear a heavy coat today」に対応するメッセージを受け取ります。

from __future__ import print_function import datetime def wear_heavy_coat(message, context): print(message) response = {} response['Weather'] = message['Weather'] response['Timestamp'] = datetime.datetime.now().strftime("%Y-%m-%d %H-%M-%S") response['Message'] = 'You should wear a heavy coat today.' return response
例 呼び出しデータの例

次の入力データは、Weather 変数が FREEZING の文字列値と等しいときに、wear_heavy_coatLambda 関数を呼び出す WearHeavyCoat ステートを実行します。

{ "Weather":"FREEZING" }

詳細については、AWS Step Functions デベロッパーガイドCreating a Step Functions State Machine That Uses Lambda を参照してください。