使用模拟服务集成 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用模拟服务集成

在 Step Functions Local 中,您可以使用模拟服务集成来测试状态机的执行路径,而无需实际调用集成服务。要将状态机配置为使用模拟服务集成,请创建模拟配置文件。在此文件中,您将服务集成的所需输出定义为模拟响应和使用模拟响应模拟执行路径作为测试用例的执行路径的执行。

通过将模拟配置文件提供给Step Functions在本地,您可以通过运行使用测试用例中指定的模拟响应的状态机来测试服务集成调用,而不是进行实际的服务集成调用。

注意

如果您不要在模拟配置文件中指定模拟服务集成响应,Step Functions 本地将调用Amazon使用您在设置 Step Functions 本地时配置的终端节点进行服务集成。有关为 Step Functions 本地配置终端节点的信息,请参阅设置 Step Functions 本地的配置选项.

本主题中的关键概念

本主题使用以下列表中定义的几个概念:

  • 模拟服务集成-指配置为使用模拟响应而不是执行实际服务调用的任务状态。

  • 模拟响应-指可以将任务状态配置为使用的模拟数据。

  • 测试用例-指配置为使用模拟服务集成的状态机执行。

  • 模拟配置文件-指包含 JSON 的模拟配置文件,该文件定义了模拟服务集成、模拟响应和测试用例。

第 1 步:在模拟配置文件中指定模拟服务集成

您可以测试Step FunctionsAmazon使用 Step Functions Local 进行 SDK 和优化的服务集成。下图显示了在 “状态机定义” 选项卡中定义的状态机:


        模拟服务集成示例。

要执行此操作,必须创建包含中定义的部分的模拟配置文件。介绍模拟配置的结构.

  1. 创建一个名为的文件MockConfigFile.json以配置使用模拟服务集成的测试。

    以下示例显示了一个模拟配置文件,该文件引用了具有两个已定义状态的状态机LambdaStateSQSState.

    Mock configuration file example

    以下是模拟配置文件的示例:它演示了如何模拟来自的回复调用 Lambda 函数向 Amazon SQS 发送消息. 在此示例中,LambdaSQSIntegration状态机包含三个测试用例名为HappyPathRetryPath, 和HybridPath 这模拟了Task 已命名的州LambdaStateSQSState. 这些州使用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,它定义了两个服务集成任务状态,名为LambdaStateSQSState.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-这个测试模拟了LambdaStateSQSState使用MockedLambdaSuccessMockedSQSSuccess分别。

      • 这些区域有: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-这个测试模拟了LambdaStateSQSState使用MockedLambdaRetryMockedSQSSuccess分别。此外,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 Local 将用尽策略中设置的重试尝试,直到收到成功响应。这意味着您必须表示具有连续尝试次数的重试模拟,并应在返回成功响应之前覆盖所有重试尝试次数。

        • 如果您没有为特定的重试尝试指定模拟响应,例如重试 “3”,则状态机执行将失败。

    • HybridPath-这个测试模拟了LambdaState. 晚于LambdaState成功运行并接收模拟数据作为响应,SQSState对生产中指定的资源执行实际的服务调用。

    有关如何使用模拟服务集成启动测试执行的信息,请参阅第 3 步:运行模拟服务集成测试.

  2. 确保那模拟响应'结构符合您在进行集成服务呼叫时收到的实际服务响应的结构。有关模拟响应的结构要求的信息,请参阅配置模拟服务集成.

    在以前示例模拟配置文件,中定义的模拟响应MockedLambdaSuccessMockedLambdaRetry符合调用后返回的实际响应的结构HelloFromLambda.

    重要

    Amazon不同服务之间的服务响应结构可能有所不同。Step Functions Local 不验证模拟的响应结构是否符合实际的服务响应结构。在测试之前,您必须确保模拟的回复符合实际响应。目的评论服务响应的结构,您可以使用 Step Functions 执行实际的服务调用,也可以查看文档为了那些服务。

第 2 步:将模拟配置文件提供给 Step Functions 本地

你可以向 Step Functions 本地提供模拟配置文件在使用以下方法之一:

Docker
注意

如果您使用的是 Docker 版本的 Step Functions Local,则只能使用环境变量提供模拟配置文件。此外,您必须在服务器初始启动时将模拟配置文件挂载到 Step Functions Local 容器上。

将模拟配置文件挂载到任何目录之内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/workspacedirectory.

    export SFN_MOCK_CONFIG="/home/workspace/EnvSpecifiedMockConfig.json"
注意
  • 如果你不提供环境变量SFN_MOCK_CONFIG默认情况下,Step Functions Local,它将尝试读取名为的模拟配置文件MockConfigFile.json在启动 “Step Functions 本地” 的目录中。

  • 如果您将模拟配置文件放在相同的目录中,请与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 调用。要做到这一点,请附加后缀,#test_name,转到使用的状态机 ARNStartExecution.test_name是一个测试用例,在同一模拟配置文件中为状态机配置。

    以下命令是使用LambdaSQSIntegration状态机和模拟配置。在此示例中,LambdaSQSIntegration状态机是使用HappyPath在中定义的测试第 1 步:在模拟配置文件中指定模拟服务集成. 这些区域有:HappyPathtest 包含执行的配置处理模拟服务集成呼吁LambdaStateSQSState州使用MockedLambdaSuccessMockedSQSSuccess模拟服务响应。

    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. 检查执行的结果通过制作ListExecutionsDescribeExecution,或者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 中显示的示例响应. 在此示例中,的输出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 } } }, ... ] }