Step Functions Local でのテストにモックサービス統合を使用する - AWS Step Functions

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

Step Functions Local でのテストにモックサービス統合を使用する

Step Functions Local では、モックサービス統合を使用して、統合サービスを実際に呼び出さなくてもステートマシンの実行パスをテストできます。モックサービス統合を使用するようにステートマシンを設定するには、モック設定ファイルを作成します。このファイルでは、サービス統合に必要な出力をモックレスポンスとして定義し、モックレスポンスを使用して実行パスをシミュレートする実行をテストケースとして定義します。

Step Functions Local にモック設定ファイルを提供して、実際のサービス統合呼び出しを行う代わりに、テストケースで指定されたモックレスポンスを使用するステートマシンを実行して、サービス統合呼び出しをテストできます。

注記

モック設定ファイルでモックサービス統合レスポンスを指定しない場合、Step Functions Local は を呼び出します。 AWS Step Functions Local の設定時に設定したエンドポイントを使用した サービス統合。Step Functions Local のエンドポイントの設定については、「Step Functions Local の設定オプションを指定する」を参照してください。

このトピックでは、以下のリストに定義されているいくつかの概念を使用しています。

  • モックサービス統合 - 実際のサービス呼び出しを実行する代わりにモックレスポンスを使用するように設定された Task ステートを指します。

  • モックレスポンス - Task ステートが使用するように設定できるモックデータを指します。

  • テストケース - モックサービス統合を使用するように設定されたステートマシン実行を指します。

  • モック設定ファイル - モックサービス統合JSON、モックレスポンス、テストケースを定義する を含むモック設定ファイルを指します。

モックサービス統合の設定

Step Functions Local を使用して任意のサービス統合をモックできます。ただし、Step Functions Local は、モックを実際の と同じに強制しませんAPIs。モックされた Task がサービスエンドポイントを呼び出すことはありません。モックレスポンスを指定しない場合、Task はサービスエンドポイントを呼び出そうとします。また、Step Functions Local は、.waitForTaskToken を使用してタスクをモックすると、自動的にタスクトークンを生成します。

ステップ 1: モック設定ファイルでモックサービス統合を指定する

Step Functions をテストできます AWS SDK Step Functions Local を使用した および最適化されたサービス統合。以下のイメージは、[ステートマシンの定義] タブで定義されているステートマシンを示しています。

モックサービス統合の例。

そのためには、モック設定ファイルの構造 で定義されているセクションを含むモック設定ファイルを作成する必要があります。

  1. モックサービス統合を含むテストを設定するための MockConfigFile.json という名前のファイルを作成します。

    次の例は、LambdaStateSQSState という名前の 2 つのステートが定義されているステートマシンを参照するモック設定ファイルを示しています。

    Mock configuration file example

    以下は、Lambda 関数を呼び出しAmazon にメッセージを送信SQSするレスポンスをモックする方法を示すモック設定ファイルの例です。この例では、LambdaSQSIntegration ステートマシンには、HappyPathRetryPathHybridPath という名前の 3 つのテストケースがあり、これらは LambdaState およびSQSState という名前の Task ステートをモックします。これらのステートは MockedLambdaSuccessMockedSQSSuccessMockedLambdaRetry およびモックサービスのレスポンスを使用します。これらのモックサービスのレスポンスはファイルの 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!" } } } } } }
    State machine definition

    以下は、LambdaState および SQSState という名前の 2 つのサービス統合タスクステートを定義する LambdaSQSIntegration というステートマシン定義の例です。LambdaState には、States.ALL に基づく再試行ポリシーが含まれています。

    { "Comment":"This state machine is called: LambdaSQSIntegration", "StartAt":"LambdaState", "States":{ "LambdaState":{ "Type":"Task", "Resource":"arn:aws:states:::lambda:invoke", "Parameters":{ "Payload.$":"$", "FunctionName":"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 } } }

    以下のテストケースのいずれかを使用して、モック設定ファイルで参照されている LambdaSQSIntegration ステートマシン定義を実行できます。

    • HappyPath - このテストでは、それぞれ MockedLambdaSuccessMockedSQSSuccess を使用して LambdaStateSQSState の出力をモックします。

      • 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 - このテストでは、それぞれ MockedLambdaRetryMockedSQSSuccess を使用して LambdaStateSQSState の出力をモックします。また、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: モックサービス統合テストを実行する」を参照してください。

  2. モックレスポンスの構造が、統合サービス呼び出しを行うときに受け取る実際のサービスレスポンスの構造と一致していることを確認してください。モックレスポンスの構造要件については、「モックサービス統合の設定」を参照してください。

    前述のモック設定ファイルの例では、MockedLambdaSuccess および MockedLambdaRetry で定義されたモック応答は、HelloFromLambda の呼び出しから返される実際の応答の構造に準拠しています。

    重要

    AWS サービスレスポンスは、サービスごとに構造が異なる場合があります。Step Functions Local は、モックレスポンス構造が実際のサービスレスポンス構造に準拠しているかどうかを検証しません。テストする前に、モックレスポンスが実際のレスポンスと一致していることを確認する必要があります。サービスレスポンスの構造を確認するには、Step Functions を使用して実際のサービス呼び出しを実行するか、それらのサービスのドキュメントを参照してください。

ステップ 2: Step Functions Local にモック設定ファイルを提供する

Step Functions Local には、次のいずれかの方法でモック設定ファイルを提供できます。

Docker
注記

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
JAR File

以下のいずれかの方法を使用してモック設定ファイルを Step Functions Local に提供します。

  • モック設定ファイルを Step FunctionsLocal.jar と同じディレクトリに置きます。この方法を使用するときは、モック設定ファイル MockConfigFile.json に名前を付ける必要があります。

  • Step Functions Local を実行しているセッションで、SFN_MOCK_CONFIG という名前の環境変数をモック設定ファイルのフルパスに設定します。この方法では、環境変数にそのファイルパスと名前が含まれている限り、モック設定ファイルに任意の名前を付けることができます。次の例では、SFN_MOCK_CONFIG 変数は /home/workspace ディレクトリにある EnvSpecifiedMockConfig.json という名前のモック設定ファイルを指すように設定されています。

    export SFN_MOCK_CONFIG="/home/workspace/EnvSpecifiedMockConfig.json"
注記
  • Step Functions Local に環境変数 SFN_MOCK_CONFIG を指定しない場合、デフォルトでは、Step Functions Local を起動したディレクトリにある MockConfigFile.json という名前のモック設定ファイルを読み込もうとします。

  • モック設定ファイルを Step FunctionsLocal.jar と同じディレクトリに配置して環境変数 SFN_MOCK_CONFIG を設定すると、Step Functions Local は環境変数で指定されたファイルを読み取ります。

ステップ 3: モックサービス統合テストを実行する

モック設定ファイルを作成して Step Functions Local に提供したら、モック設定ファイルに設定されたステートマシンをモックサービス統合を使用して実行します。次に、 APIアクションを使用して実行結果を確認します。

  1. モック設定ファイル内の前述の定義に基づいてステートマシンを作成します。

    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"
  2. モックサービス統合を使用してステートマシンを実行します。

    モック設定ファイルを使用するには、モック設定ファイルで設定されたステートマシンで をStartExecutionAPI呼び出します。これを行うには、 ARNで使用されるステートマシン#test_nameにサフィックス を追加しますStartExecutiontest_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
  3. ステートマシンの実行レスポンスを表示します。

    モックサービス統合テストStartExecutionを使用して を呼び出すレスポンスは、実行日ARNと開始日を返すStartExecution通常の を呼び出すレスポンスと同じです。

    以下は、モックサービス統合テストを使用した StartExecution の呼び出しに対するレスポンスの例です。

    { "startDate":"2022-01-28T15:03:16.981000-05:00", "executionArn":"arn:aws:states:us-east-1:123456789012:execution:LambdaSQSIntegration:executionWithHappyPathMockedServices" }
  4. ListExecutions、または GetExecutionHistoryAPI呼び出しを実行してDescribeExecution、実行の結果を確認します。

    aws stepfunctions get-execution-history \ --endpoint http://localhost:8083 \ --execution-arn arn:aws:states:us-east-1:123456789012:execution:LambdaSQSIntegration:executionWithHappyPathMockedServices

    次の例は、ステップ 2 で示したレスポンス例ARNの実行GetExecutionHistoryを使用して を呼び出すレスポンスの一部を示しています。この例では、LambdaStateSQSState の出力は、モック設定ファイルMockedLambdaSuccessMockedSQSSuccess で定義されているモックデータです。また、モックデータは、実際のサービス統合呼び出しを実行して返されるデータと同じ方法で使用されます。また、この例では、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 } } }, ... ] }