使用模擬服務集成 - AWS Step Functions

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用模擬服務集成

在 Step Functions Local 中,您可以使用模擬服務整合來測試狀態機器的執行路徑,而無需實際呼叫整合式服務。要將狀態機器配置為使用模擬服務集成,請創建一個模擬配置文件。在此文件中,您將服務集成的所需輸出定義為模擬響應,以及使用模擬響應將執行路徑模擬為測試用例的執行的執行。

藉由將模擬設定檔提供給 Step Functions Local,您可以執行使用測試案例中指定的模擬回應的狀態機器來測試服務整合呼叫,而不是進行實際的服務整合呼叫。

注意

如果您沒有在模擬配置文件中指定模擬服務集成響應,Step Functions 本地將使用您在設置步 Step Functions 本地配置的端點調用 AWS 服務集成。如需有關設定 Step Functions 本機端點的資訊,請參閱設定 Step Functions 的組態選項本機

本主題的關鍵概念

本主題使用下列清單中定義的數個概念:

  • 模擬服務集成-指配置為使用模擬響應而不是執行實際服務調用的任務狀態。

  • 模擬響應-指任務狀態可以配置為使用的模擬數據。

  • 測試用例-是指配置為使用模擬服務集成的狀態機器執行。

  • 模擬配置文件-指包含 JSON 的模擬配置文件,該文件定義了模擬服務集成,模擬響應和測試用例。

步驟 1:在模擬配置文件中指定模擬服務集成

您可以使用 Step Functions 本機來測試 Step Functions AWS SDK 和最佳化服務整合。下圖顯示了狀態機器定義標籤中定義的狀態機器:

模擬服務集成示例。

要做到這一點,你必須創建一個模擬配置文件,其中包含如中所定義的部分引入模擬配置的結構

  1. 建立名為的檔案MockConfigFile.json以設定具有模擬服務整合的測試。

    下列範例會示範參照狀態機器的模擬組態檔案,其中兩個已定義的狀態為LambdaStateSQSState

    Mock configuration file example

    以下是模擬組態檔案的範例,該檔案示範如何從叫用 Lambda 函數並將訊息傳送至 Amazon SQS 來模擬回應。在此範例中,LambdaSQSIntegration狀態機器包含三個名為HappyPath、的測試案例RetryPath,以及HybridPath模擬命名為LambdaState和的Task狀態SQSState。這些狀態會使用MockedLambdaSuccessMockedSQSSuccess、和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,它定義了兩個名為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-此測試MockedSQSSuccess分別嘲笑LambdaStateSQSState使用MockedLambdaSuccess和的輸出。

      • 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-此測試MockedSQSSuccess分別嘲笑LambdaStateSQSState使用MockedLambdaRetry和的輸出。此外,還設定LambdaState為執行四次重試嘗試。這些嘗試的模擬回應會在狀態中定義並建MockedLambdaRetry立索引。

      • 初始嘗試以工作失敗結束,其中包含原因和錯誤訊息,如下列範例所示:

        "0":{ "Throw": { "Error": "Lambda.ResourceNotReadyException", "Cause": "Lambda resource is not ready." } }
      • 第一次和第二次重試嘗試以工作失敗結束,其中包含原因和錯誤訊息,如下列範例所示:

        "1-2":{ "Throw": { "Error": "Lambda.TimeoutException", "Cause": "Lambda timed out." } }
      • 第三次重試嘗試以任務成功結束,其中包含來自模擬 Lambda 回應中「有效負載」區段的狀態結果。

        "3":{ "Return": { "StatusCode": 200, "Payload": { "StatusCode": 200, "body": "Hello from Lambda!" } } }
        注意
        • 對於具有重試原則的狀態,「Step Functions 本機」會耗盡原則中設定的重試嘗試,直到收到成功回應為止。這意味著您必須表示具有連續嘗試次數的重試模擬,並且應該在返回成功響應之前覆蓋所有重試嘗試。

        • 如果您沒有為特定的重試嘗試指定模擬回應 (例如重試「3」),則狀態機器執行將會失敗。

    • HybridPath-此測試嘲笑的LambdaState輸出。成功LambdaState運行並接收模擬數據作為響應後,對生產中指定的資源SQSState執行實際的服務調用。

    有關如何使用模擬服務集成開始測試執行的信息,請參閱。步驟 3:執行模擬服務整合測試

  2. 請確定模擬回應的結構符合您進行整合式服務呼叫時所收到的實際服務回應結構。如需有關模擬回應之結構需求的資訊,請參閱設定模擬服務整合

    在前面的示例模擬配置文件中,在中定義的模擬響應MockedLambdaSuccessMockedLambdaRetry符合從調用HelloFromLambda返回的實際響應的結構。

    重要

    AWS 不同服務之間的服務回應可能會有所不同。Step Functions Local 不驗證模擬響應結構是否符合實際的服務響應結構。在測試之前,您必須確保模擬響應符合實際響應。若要檢閱服務回應的結構,您可以使用 Step Functions 執行實際的服務呼叫,或檢視這些服務的說明文件。

第 2 步:提供模擬配置文件 Step Functions 本地

您可以通過以下方式之一提供模擬配置文件 Step Functions 局部:

Docker
注意

如果您使用的是 Step Functions 數本地的 Docker 版本,則只能使用環境變量提供模擬配置文件。此外,您必須在初始伺服器啟動時,將模擬配置檔案掛載到 Step Functions 本機容器上。

將模擬配置文件安裝到 Step Functions 本地容器中的任何目錄。然後,設置一個名為的環境變量,SFN_MOCK_CONFIG該變量包含容器中的 mock 配置文件的路徑。這種方法使模擬配置文件被命名為任何只要環境變量包含文件路徑和名稱。

下面的命令顯示了啟動 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 局部:

  • 將模擬配置文件放在與相同的目錄中Step FunctionsLocal.jar。使用此方法時,您必須命名模擬配置文件MockConfigFile.json

  • 在運行 Step Functions 數本地的會話中,將名為SFN_MOCK_CONFIG的環境變量設置為模擬配置文件的完整路徑。這種方法使模擬配置文件只要環境變量包含其文件路徑和名稱被命名為任何東西。在下面的例子中,SFN_MOCK_CONFIG變量被設置為指向一個名為的模擬配置文件EnvSpecifiedMockConfig.json,位於目/home/workspace錄中。

    export SFN_MOCK_CONFIG="/home/workspace/EnvSpecifiedMockConfig.json"
注意
  • 如果您不提供環境變量 SFN_MOCK_CONFIG Step Functions 數本地,默認情況下,它將嘗試讀取從中啟動 Step Functions 數本地目錄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. 使用模擬服務集成運行狀態機。

    要使用模擬配置文件,請在模擬配置文件中配置的狀態機器上進行 StartExecution API 調用。若要這麼做,請將尾碼附加至使用的狀態機器 ARN。#test_name StartExecution test_name是一個測試用例,該用例在同一模擬配置文件中為狀態機配置。

    以下命令是使用LambdaSQSIntegration狀態機和模擬配置的示例。在此範例中,使用中定義的HappyPath測試執行LambdaSQSIntegration狀態機器步驟 1:在模擬配置文件中指定模擬服務集成。該HappyPath測試包含用於處理模擬服務集成調用的執行配置,以LambdaState及使用MockedLambdaSuccess和模MockedSQSSuccess擬服務響應進行的SQSState狀態。

    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. 透過進行ListExecutionsDescribeExecutionGetExecutionHistory API 呼叫來檢查執行結果。

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

    下列範例會示範GetExecutionHistory使用步驟 2 所示範例回應的執行 ARN 呼叫的部分回應。在此範例中,LambdaState和的輸出SQSState是在 mock 組態檔案中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 } } }, ... ] }