モックサービス統合の使用 - AWS Step Functions

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

モックサービス統合の使用

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

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

注記

例えばDon'tモック設定ファイルにモックサービス統合レスポンスを指定すると、Step Functions Local はAWSStep Functions Local の設定中に構成したエンドポイントを使用したサービス統合。Step Functions Local のエンドポイントの設定については、を参照してください。Step Functions コンフィギュレーションオプションのローカル設定

このトピックの主な概念

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

  • Mocked Service Integrations-実際のサービスコールを実行する代わりに、モックされた応答を使用するように構成されたタスクの状態を指します。

  • モックレスポンス-タスク状態が使用するように構成できるモックデータを指します。

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

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

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

以下の操作を実行できます。テストステップ関数AWSStep Functions Local を使用した SDK および最適化されたサービス統合。次の図は、[ステートマシン定義] タブで定義されたステートマシンを示しています。


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

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

  1. という名前のファイルを作成します。MockConfigFile.jsonモックサービス統合でテストを構成します。

    次の例は、名前の 2 つの定義済みステートを持つステートマシンを参照するモック設定ファイルを示しています。LambdaStateそしてSQSState

    Mock configuration file example

    以下は、モック設定ファイルの例です。これは、からの応答をモックする方法を示していますLambda 関数の呼び出しそしてAmazon SQS にメッセージを送信する。この例では、LambdaSQSIntegrationステートマシンには、という名前の 3 つのテストケースが含まれていますHappyPath,RetryPath, およびHybridPath どのモックですかTask という名前の州LambdaStateそしてSQSState。これらの州は、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!" } } } } } }
    State machine definition

    以下は、と呼ばれるステートマシン定義の例です。LambdaSQSIntegrationという名前の 2 つのサービス統合タスクの状態を定義します。LambdaStateそしてSQSStateLambdaStateに基づく再試行ポリシーが含まれています。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-このテストは、LambdaStateそしてSQSStateを使用しますMockedLambdaSuccessそしてMockedSQSSuccessそれぞれ。

      • -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-このテストは、LambdaStateそしてSQSStateを使用しますMockedLambdaRetryそしてMockedSQSSuccessそれぞれ。また、LambdaStateは、4 回の再試行を実行するように構成されています。これらの試行のモックされた応答は、MockedLambdaRetry状態。

      • 最初の試行は、次の例に示すように、原因とエラーメッセージを含むタスク失敗で終了します。

        "0":{ "Throw": { "Error": "Lambda.ResourceNotReadyException", "Cause": "Lambda resource is not ready." } }
      • 最初の再試行と 2 回目の再試行は、次の例に示すように、原因とエラーメッセージを含むタスク失敗で終了します。

        "1-2":{ "Throw": { "Error": "Lambda.TimeoutException", "Cause": "Lambda timed out." } }
      • 3 回目の再試行は、モックされた Lambda レスポンスのペイロードセクションからの状態結果を含むタスクの成功で終了します。

        "3":{ "Return": { "StatusCode": 200, "Payload": { "StatusCode": 200, "body": "Hello from Lambda!" } } }
        注記
        • 再試行ポリシーが設定されている状態の場合、Step Functions Local は、成功応答を受信するまで、ポリシーで設定された再試行を使い果たします。つまり、連続した試行番号を持つ再試行のモックを示す必要があり、成功レスポンスを返す前にすべての再試行をカバーする必要があります。

        • 特定の再試行に対してモックされたレスポンスを指定しない場合、たとえば、「3" を再試行すると、ステートマシンの実行は失敗します。

    • HybridPath-このテストは、LambdaState。AfterLambdaState正常に実行され、モックされたデータを応答として受け取り、SQSStateは、実稼働環境に指定されたリソースに対して実際のサービスコールを実行します。

    モックサービス統合を使用してテストの実行を開始する方法の詳細については、「」ステップ 3: 模擬サービス統合テストの実行

  2. 次のことを確認してください。ということはモックされたレスポンス'構造は、統合サービスコールを行うときに受け取る実際のサービス応答の構造に準拠しています。モック応答の構造要件の詳細については、「」モックサービス統合の設定

    左前モック設定ファイルの例、で定義されたモックレスポンスMockedLambdaSuccessそしてMockedLambdaRetry呼び出しから返される実際のレスポンスの構造に従うHelloFromLambda

    重要

    AWSサービス応答は、サービスによって構造が異なる場合があります。Step Functions Local は、モックされたレスポンス構造が実際のサービス応答構造に適合しているかどうかを検証しません。テストする前に、モックされたレスポンスが実際の応答に準拠していることを確認する必要があります。操作レビューサービスレスポンスの構造については、Step Functions を使用して実際のサービスコールを実行するか、ドキュメントを参照できます。にとってそれらのサービス。

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

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

Docker
注記

Docker バージョンの Step Functions Local を使用している場合、環境変数のみを使用してモック設定ファイルを指定できます。さらに、最初のサーバー起動時に Step Functions ローカルコンテナにモック設定ファイルをマウントする必要があります。

モック設定ファイルを任意のディレクトリにマウントする以内にStep Functions ローカルコンテ。次に、という名前の環境変数を設定します。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変数は、という名前のモック設定ファイルを指すように設定されています。EnvSpecifiedMockConfig.json(と)。/home/workspaceディレクトリ。

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

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

ステップ 3: 模擬サービス統合テストの実行

After作成して提供するモック設定ファイルを 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. Runそのモックサービス統合を使用するステートマシン。

    モック設定ファイルを使用するには、StartExecutionモック設定ファイルで設定されたステートマシンでの API 呼び出し。これを行うには、サフィックスを追加します。#test_name(と) が使用するステートマシン ARNStartExecutiontest_nameはテストケースであり、同じモック設定ファイル内のステートマシンに対して設定されます。

    以下に示すのは、LambdaSQSIntegrationステートマシンとモック設定。この例では、LambdaSQSIntegrationステートマシンは、HappyPathで定義されたテストステップ 1: モック設定ファイルでのモックサービス統合の指定。-HappyPathtest には、に実行するための構成が含まれています。扱うモックサービス統合は、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モックサービス統合テストの使用は、呼び出しに対する応答と同じですStartExecution通常は、実行 ARN と開始日を返します。

    以下に、を呼び出した場合の応答の例を示します。StartExecutionモックサービス統合テストの使用:

    { "startDate":"2022-01-28T15:03:16.981000-05:00", "executionArn":"arn:aws:states:us-east-1:123456789012:execution:LambdaSQSIntegration:executionWithHappyPathMockedServices" }
  4. をチェックします。実行の結果をすることでListExecutions,DescribeExecution, またはGetExecutionHistoryAPI コール。

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

    次の例で、呼び出しに対する応答の一部を示します。GetExecutionHistoryからの実行 ARN を使用するステップ 2 に示した応答の例。この例では、LambdaStateそしてSQSStateモックデータはで定義されているのですかMockedLambdaSuccessそしてMockedSQSSuccessモック設定ファイル。さらに、モックされたデータは、実際のサービス統合呼び出しを実行して返されたデータと同じ方法で使用されます。Asoとなる。この例では、からの出力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 } } }, ... ] }