翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Step Functions Local はサポートされていません
Step Functions Local は機能パリティを提供しておらず、サポートされていません。
テスト目的で Step Functions をエミュレートするサードパーティーソリューションを検討することもできます。
Step Functions Local では、モックサービス統合を使用して、統合サービスを実際に呼び出さなくてもステートマシンの実行パスをテストできます。モックサービス統合を使用するようにステートマシンを設定するには、モック設定ファイルを作成します。このファイルでは、サービス統合に必要な出力をモックレスポンスとして定義し、モックレスポンスを使用して実行パスをシミュレートする実行をテストケースとして定義します。
Step Functions Local にモック設定ファイルを提供して、実際のサービス統合呼び出しを行う代わりに、テストケースで指定されたモックレスポンスを使用するステートマシンを実行して、サービス統合呼び出しをテストできます。
注記
モック設定ファイルでモックサービス統合レスポンスを指定しない場合、Step Functions Local は Step Functions Local の設定時に設定したエンドポイントを使用して AWS サービス統合を呼び出します。Step Functions Local のエンドポイントの設定については、「Step Functions Local の設定オプションを指定する」を参照してください。
このトピックでは、以下のリストに定義されているいくつかの概念を使用しています。
モックサービス統合 - 実際のサービス呼び出しを実行する代わりにモックレスポンスを使用するように設定された Task ステートを指します。
モックレスポンス - Task ステートが使用するように設定できるモックデータを指します。
テストケース - モックサービス統合を使用するように設定されたステートマシン実行を指します。
モック設定ファイル - JSON を含むモック設定ファイルを指します。JSON はモックサービス統合、モックレスポンス、テストケースを定義します。
モックサービス統合の設定
Step Functions Local を使用して任意のサービス統合をモックできます。ただし、Step Functions Local はモックを実際の API と同じにすることを強制しません。モックされた Task がサービスエンドポイントを呼び出すことはありません。モックレスポンスを指定しない場合、Task はサービスエンドポイントを呼び出そうとします。また、Step Functions Local は、.waitForTaskToken
を使用してタスクをモックすると、自動的にタスクトークンを生成します。
ステップ 1: モック設定ファイルでモックサービス統合を指定する
Step Functions Local を使用して、Step Functions AWS SDK と最適化されたサービス統合をテストできます。以下のイメージは、[ステートマシンの定義] タブで定義されているステートマシンを示しています。

そのためには、モック設定のファイル構造 で定義されているセクションを含むモック設定ファイルを作成する必要があります。
-
モックサービス統合を含むテストを設定するための
MockConfigFile.json
という名前のファイルを作成します。次の例は、
LambdaState
とSQSState
という名前の 2 つのステートが定義されているステートマシンを参照するモック設定ファイルを示しています。以下は、Lambda 関数を呼び出して Amazon SQS にメッセージを送信するレスポンスをモックする方法を示すモック設定ファイルの例です。この例では、LambdaSQSIntegration ステートマシンには、
HappyPath
、RetryPath
、HybridPath
という名前の 3 つのテストケースがあり、これらはLambdaState
およびSQSState
という名前のTask
ステートをモックします。これらのステートはMockedLambdaSuccess
、MockedSQSSuccess
、MockedLambdaRetry
およびモックサービスのレスポンスを使用します。これらのモックサービスのレスポンスはファイルのMockedResponses
セクションで定義されています。{ "StateMachines":{ "LambdaSQSIntegration":{ "TestCases":{ "HappyPath":{ "LambdaState":"MockedLambdaSuccess", "SQSState":"MockedSQSSuccess" }, "RetryPath":{ "LambdaState":"MockedLambdaRetry", "SQSState":"MockedSQSSuccess" }, "HybridPath":{ "LambdaState":"MockedLambdaSuccess" } } } }, "MockedResponses":{ "MockedLambdaSuccess":{ "0":{ "Return":{ "StatusCode":200, "Payload":{ "StatusCode":200, "body":"Hello from Lambda!" } } } }, "LambdaMockedResourceNotReady":{ "0":{ "Throw":{ "Error":"Lambda.ResourceNotReadyException", "Cause":"Lambda resource is not ready." } } }, "MockedSQSSuccess":{ "0":{ "Return":{ "MD5OfMessageBody":"3bcb6e8e-7h85-4375-b0bc-1a59812c6e51", "MessageId":"3bcb6e8e-8b51-4375-b0bc-1a59812c6e51" } } }, "MockedLambdaRetry":{ "0":{ "Throw":{ "Error":"Lambda.ResourceNotReadyException", "Cause":"Lambda resource is not ready." } }, "1-2":{ "Throw":{ "Error":"Lambda.TimeoutException", "Cause":"Lambda timed out." } }, "3":{ "Return":{ "StatusCode":200, "Payload":{ "StatusCode":200, "body":"Hello from Lambda!" } } } } } }
以下のテストケースのいずれかを使用して、モック設定ファイルで参照されている
LambdaSQSIntegration
ステートマシン定義を実行できます。-
HappyPath
- このテストでは、それぞれMockedLambdaSuccess
とMockedSQSSuccess
を使用してLambdaState
とSQSState
の出力をモックします。-
LambdaState
は次の値を返します。"0":{ "Return":{ "StatusCode":200, "Payload":{ "StatusCode":200, "body":"Hello from Lambda!" } } }
-
SQSState
は次の値を返します。"0":{ "Return":{ "MD5OfMessageBody":"3bcb6e8e-7h85-4375-b0bc-1a59812c6e51", "MessageId":"3bcb6e8e-8b51-4375-b0bc-1a59812c6e51" } }
-
-
RetryPath
- このテストでは、それぞれMockedLambdaRetry
とMockedSQSSuccess
を使用してLambdaState
とSQSState
の出力をモックします。また、LambdaState
は 4 回再試行するように設定されています。これらの試行に対するモックレスポンスはMockedLambdaRetry
ステートで定義され、インデックス化されます。-
最初の試行は、次の例に示すように、原因とエラーメッセージを含むタスク失敗で終了します。
"0":{ "Throw": { "Error": "Lambda.ResourceNotReadyException", "Cause": "Lambda resource is not ready." } }
-
1 回目と 2 回目の再試行は、次の例に示すように、原因とエラーメッセージを含むタスク失敗で終了します。
"1-2":{ "Throw": { "Error": "Lambda.TimeoutException", "Cause": "Lambda timed out." } }
-
3 回目の再試行は、モックされた Lambda レスポンスの Payload セクションからのステート結果を含むタスク成功で終了します。
"3":{ "Return": { "StatusCode": 200, "Payload": { "StatusCode": 200, "body": "Hello from Lambda!" } } }
注記
再試行ポリシーが設定されているステートでは、Step Functions Local は成功レスポンスを受け取るまで、ポリシーに設定された再試行回数を使い果たします。つまり、モックの再試行を連続する試行回数で示し、成功レスポンスを返すまですべての再試行を実施する必要があります。
再試行「3」のように、特定の再試行に対してモックレスポンスを指定しないと、ステートマシンの実行は失敗します。
-
-
HybridPath
- このテストはLambdaState
の出力をモックします。LambdaState
が正常に実行され、モックされたデータをレスポンスとして受信したら、SQSState
は本番環境で指定されたリソースに対して実際のサービス呼び出しを実行します。
モックサービス統合を使用してテスト実行を開始する方法については、「ステップ 3: モックサービス統合テストを実行する」を参照してください。
モックレスポンスの構造が、統合サービス呼び出しを行うときに受け取る実際のサービスレスポンスの構造と一致していることを確認してください。モックレスポンスの構造要件については、「モックサービス統合の設定」を参照してください。
前述のモック設定ファイルの例では、
MockedLambdaSuccess
およびMockedLambdaRetry
で定義されたモック応答は、HelloFromLambda
の呼び出しから返される実際の応答の構造に準拠しています。重要
AWS サービスレスポンスの構造は、サービスによって異なる場合があります。Step Functions Local は、モックレスポンス構造が実際のサービスレスポンス構造に準拠しているかどうかを検証しません。テストする前に、モックレスポンスが実際のレスポンスと一致していることを確認する必要があります。サービスレスポンスの構造を確認するには、Step Functions を使用して実際のサービス呼び出しを実行するか、それらのサービスのドキュメントを参照してください。
ステップ 2: Step Functions Local にモック設定ファイルを提供する
Step Functions Local には、次のいずれかの方法でモック設定ファイルを提供できます。
注記
Docker バージョンの Step Functions Local を使用している場合、環境変数のみを使用してモック設定ファイルを指定できます。また、サーバーの初回起動時に Step Functions Local コンテナにモック設定ファイルをマウントする必要があります。
Step Functions Local コンテナ内の任意のディレクトリにモック設定ファイルをマウントします。次に、コンテナ内のモック設定ファイルへのパスを含む SFN_MOCK_CONFIG
という名前の環境変数を設定します。この方法では、環境変数にファイルパスと名前が含まれている限り、モック設定ファイルに任意の名前を付けることができます。
以下のコマンドは Docker イメージを開始する形式を示しています。
docker run -p 8083:8083
--mount type=bind,readonly,source={absolute path to mock config file},destination=/home/StepFunctionsLocal/MockConfigFile.json
-e SFN_MOCK_CONFIG="/home/StepFunctionsLocal/MockConfigFile.json" amazon/aws-stepfunctions-local
次の例では、コマンドを使用して Docker イメージを開始します。
docker run -p 8083:8083
--mount type=bind,readonly,source=/Users/admin/Desktop/workplace/MockConfigFile.json,destination=/home/StepFunctionsLocal/MockConfigFile.json
-e SFN_MOCK_CONFIG="/home/StepFunctionsLocal/MockConfigFile.json" amazon/aws-stepfunctions-local
ステップ 3: モックサービス統合テストを実行する
モック設定ファイルを作成して Step Functions Local に提供したら、モック設定ファイルに設定されたステートマシンをモックサービス統合を使用して実行します。次に API アクションを使用して実行結果を確認します。
-
モック設定ファイル内の前述の定義に基づいてステートマシンを作成します。
aws stepfunctions create-state-machine \ --endpoint http://localhost:8083 \ --definition "{\"Comment\":\"Thisstatemachineiscalled:LambdaSQSIntegration\",\"StartAt\":\"LambdaState\",\"States\":{\"LambdaState\":{\"Type\":\"Task\",\"Resource\":\"arn:aws:states:::lambda:invoke\",\"Parameters\":{\"Payload.$\":\"$\",\"FunctionName\":\"arn:aws:lambda:us-east-1:123456789012:function:HelloWorldFunction\"},\"Retry\":[{\"ErrorEquals\":[\"States.ALL\"],\"IntervalSeconds\":2,\"MaxAttempts\":3,\"BackoffRate\":2}],\"Next\":\"SQSState\"},\"SQSState\":{\"Type\":\"Task\",\"Resource\":\"arn:aws:states:::sqs:sendMessage\",\"Parameters\":{\"QueueUrl\":\"https://sqs.us-east-1.amazonaws.com/123456789012/myQueue\",\"MessageBody.$\":\"$\"},\"End\":true}}}" \ --name "LambdaSQSIntegration" --role-arn "arn:aws:iam::123456789012:role/service-role/LambdaSQSIntegration"
-
モックサービス統合を使用してステートマシンを実行します。
モック設定ファイルを使用するには、モック設定ファイルに設定されているステートマシンで
StartExecution
API 呼び出しを行います。これを行うには、StartExecution
が使用するステートマシン ARN にサフィックス、#
を追加します。test_name
はテストケースで、同じモック設定ファイルでステートマシン用に設定されます。test_name
以下のコマンドは、
LambdaSQSIntegration
ステートマシンとモックコンフィグレーションを使用する例です。この例では、ステップ 1: モック設定ファイルでモックサービス統合を指定する で定義されたHappyPath
テストを使用してLambdaSQSIntegration
ステートマシンが実行されます。HappyPath
テストには、LambdaState
ステートおよびSQSState
ステートがMockedLambdaSuccess
およびMockedSQSSuccess
のモックサービスのレスポンスを使用して行うモックサービス統合呼び出しを処理するための実行設定が含まれています。aws stepfunctions start-execution \ --endpoint http://localhost:8083 \ --name executionWithHappyPathMockedServices \ --state-machine arn:aws:states:us-east-1:123456789012:stateMachine:LambdaSQSIntegration#HappyPath
ステートマシンの実行レスポンスを表示します。
モックサービス統合テストを使用した
StartExecution
の呼び出しに対するレスポンスは、通常のStartExecution
の呼び出しに対するレスポンスと同じであり、実行 ARN と開始日を返します。以下は、モックサービス統合テストを使用した
StartExecution
の呼び出しに対するレスポンスの例です。{ "startDate":"2022-01-28T15:03:16.981000-05:00", "executionArn":"arn:aws:states:us-east-1:123456789012:execution:LambdaSQSIntegration:executionWithHappyPathMockedServices" }
ListExecutions
、DescribeExecution
、またはGetExecutionHistory
API の呼び出しを実行して、実行の結果を確認します。aws stepfunctions get-execution-history \ --endpoint http://localhost:8083 \ --execution-arn arn:aws:states:us-east-1:123456789012:execution:LambdaSQSIntegration:executionWithHappyPathMockedServices
次の例は、ステップ 2 で示したレスポンス例の実行 ARN を使用して
GetExecutionHistory
の呼び出しに対する応答の一部を示しています。この例では、LambdaState
とSQSState
の出力は、モック設定ファイルのMockedLambdaSuccess
とMockedSQSSuccess
で定義されているモックデータです。また、モックデータは、実際のサービス統合呼び出しを実行して返されるデータと同じ方法で使用されます。また、この例では、LambdaState
からの出力が入力としてSQSState
に渡されます。{ "events": [ ... { "timestamp": "2021-12-02T19:39:48.988000+00:00", "type": "TaskStateEntered", "id": 2, "previousEventId": 0, "stateEnteredEventDetails": { "name": "LambdaState", "input": "{}", "inputDetails": { "truncated": false } } }, ... { "timestamp": "2021-11-25T23:39:10.587000+00:00", "type": "LambdaFunctionSucceeded", "id": 5, "previousEventId": 4, "lambdaFunctionSucceededEventDetails": { "output": "{\"statusCode\":200,\"body\":\"\\\"Hello from Lambda!\\\"\"}", "outputDetails": { "truncated": false } } }, ... "timestamp": "2021-12-02T19:39:49.464000+00:00", "type": "TaskStateEntered", "id": 7, "previousEventId": 6, "stateEnteredEventDetails": { "name": "SQSState", "input": "{\"statusCode\":200,\"body\":\"\\\"Hello from Lambda!\\\"\"}", "inputDetails": { "truncated": false } } }, ... { "timestamp": "2021-11-25T23:39:10.652000+00:00", "type": "TaskSucceeded", "id": 10, "previousEventId": 9, "taskSucceededEventDetails": { "resourceType": "sqs", "resource": "sendMessage", "output": "{\"MD5OfMessageBody\":\"3bcb6e8e-7h85-4375-b0bc-1a59812c6e51\",\"MessageId\":\"3bcb6e8e-8b51-4375-b0bc-1a59812c6e51\"}", "outputDetails": { "truncated": false } } }, ... ] }
Step Functions でモックサービス統合を使用するための設定ファイル
Step Functions Local はサポートされていません
Step Functions Local は機能パリティを提供しておらず、サポートされていません。
テスト目的で Step Functions をエミュレートするサードパーティーソリューションを検討することもできます。
モックサービス統合を使用するには、まずモック設定を含む MockConfigFile.json
という名前のモック設定ファイルを作成する必要があります。次に、Step Functions Local にモック設定ファイルを提供します。この設定ファイルは、モックサービス統合レスポンスを使用するモックステートを含むテストケースを定義します。以下のセクションには、モックステートとモックレスポンスを含むモック設定の構造に関する情報が含まれています。
モック設定のファイル構造
モック設定は、次の最上位のフィールドを含む JSON オブジェクトです。
-
StateMachines
- このオブジェクトのフィールドは、モックサービス統合を使用するように設定されたステートマシンを表します。 -
MockedResponse
- このオブジェクトのフィールドは、サービス統合呼び出しのモックレスポンスを表します。
以下は、StateMachine
定義と MockedResponse
を含むモック設定ファイルの例です。
{
"StateMachines":{
"LambdaSQSIntegration":{
"TestCases":{
"HappyPath":{
"LambdaState":"MockedLambdaSuccess",
"SQSState":"MockedSQSSuccess"
},
"RetryPath":{
"LambdaState":"MockedLambdaRetry",
"SQSState":"MockedSQSSuccess"
},
"HybridPath":{
"LambdaState":"MockedLambdaSuccess"
}
}
}
},
"MockedResponses":{
"MockedLambdaSuccess":{
"0":{
"Return":{
"StatusCode":200,
"Payload":{
"StatusCode":200,
"body":"Hello from Lambda!"
}
}
}
},
"LambdaMockedResourceNotReady":{
"0":{
"Throw":{
"Error":"Lambda.ResourceNotReadyException",
"Cause":"Lambda resource is not ready."
}
}
},
"MockedSQSSuccess":{
"0":{
"Return":{
"MD5OfMessageBody":"3bcb6e8e-7h85-4375-b0bc-1a59812c6e51",
"MessageId":"3bcb6e8e-8b51-4375-b0bc-1a59812c6e51"
}
}
},
"MockedLambdaRetry":{
"0":{
"Throw":{
"Error":"Lambda.ResourceNotReadyException",
"Cause":"Lambda resource is not ready."
}
},
"1-2":{
"Throw":{
"Error":"Lambda.TimeoutException",
"Cause":"Lambda timed out."
}
},
"3":{
"Return":{
"StatusCode":200,
"Payload":{
"StatusCode":200,
"body":"Hello from Lambda!"
}
}
}
}
}
}
モック設定フィールドリファレンス
以下のセクションでは、モック設定で定義する必要がある最上位のオブジェクトフィールドについて説明します。
StateMachines
StateMachines
オブジェクトは、どのステートマシンがモックサービス統合を使用するかを定義します。各ステートマシンの設定は、StateMachines
の最上位フィールドとして表されます。フィールド名はステートマシンの名前で、値は TestCases
という名前の 1 つのフィールドを含むオブジェクトです。そのフィールドはそのステートマシンのテストケースを表します。
次の構文は、2 つのテストケースを含むステートマシンを示しています。
"MyStateMachine": {
"TestCases": {
"HappyPath": {
...
},
"SadPath": {
...
}
}
TestCases
TestCases
のフィールドはステートマシンの個々のテストケースを表します。各テストケースの名前はステートマシンにつき一意である必要があり、各テストケースの値はステートマシンの Task 状態に使用するモックレスポンスを指定するオブジェクトです。
次の TestCase
の例は、2 つの Task
状態を 2 つの MockedResponses
にリンクしています。
"HappyPath": {
"SomeTaskState": "SomeMockedResponse",
"AnotherTaskState": "AnotherMockedResponse"
}
MockedResponses
MockedResponses
は、一意のフィールド名を持つ複数のモックレスポンスオブジェクトを含むオブジェクトです。モックレスポンスオブジェクトは、モックされた Task 状態が呼び出されるたびに、成功結果またはエラー出力を定義します。呼び出し番号は、「0」、「1」、「2」、「3」などの個別の整数文字列、または「0-1」、「2-3」などの整数の範囲を使用して指定します。
Task をモックする場合、呼び出しのたびにモックレスポンスを指定する必要があります。レスポンスには、Return
または Throw
という名前のフィールドが 1 つ含まれている必要があります。このフィールドの値は、モックされた Task 呼び出しの結果またはエラー出力です。モックレスポンスを指定しない場合、ステートマシンの実行は失敗します。
以下は、Throw
および Return
オブジェクトを含む MockedResponse
の例です。この例では、ステートマシンを最初の 3 回実行すると、"0-2"
で指定されたレスポンスが返され、4 回目にステートマシンが実行されると、"3"
で指定されたレスポンスが返されます。
"SomeMockedResponse": {
"0-2": {
"Throw": {
...
}
},
"3": {
"Return": {
...
}
}
}
注記
Map
ステートを使用していて、その Map
ステートに対するレスポンスを予測できるようにする場合は、maxConcurrency
の値を 1 に設定します。1 より大きい値を設定すると、Step Functions Local は複数の反復を同時に実行するため、反復にわたるステートの全体的な実行順序が予測できなくなります。これにより、Step Functions Local は、ある実行から次の実行までの反復状態に対して異なるモックレスポンスを使用する可能性があります。
戻る
Return
は MockedResponse
オブジェクトのフィールドとして表されます。Task ステートをモックした場合の成功結果を指定します。
以下は、Lambda 関数の Invoke
を呼び出すためのモックレスポンスを含む Return
オブジェクトの例です。
"Return": {
"StatusCode": 200,
"Payload": {
"StatusCode": 200,
"body": "Hello from Lambda!"
}
}
Throw
Throw
は MockedResponse
オブジェクトのフィールドとして表されます。失敗したタスクのエラー出力を指定します。Throw
の値は、文字列値を持つ Error
および Cause
フィールドを含むオブジェクトである必要があります。MockConfigFile.json
の Error
フィールドに指定する文字列値は、ステートマシンの Retry
および Catch
セクションで処理されるエラーと一致する必要があります。
以下は、Lambda 関数の Invoke
を呼び出すためのモックレスポンスを含む Throw
オブジェクトの例です。
"Throw": {
"Error": "Lambda.TimeoutException",
"Cause": "Lambda timed out."
}