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을 사용하여 Task를 모의할 때 자동으로 작업 토큰을 생성합니다.

1단계: 모의 구성 파일에 모의 서비스 통합 지정

Step Functions를 테스트할 수 있습니다. AWS SDKStep Functions Local을 사용하여 서비스 통합을 최적화했습니다. 다음 이미지에서는 상태 시스템 정의 탭에 정의된 상태 시스템을 보여줍니다.

모의 서비스 통합 예제입니다.

이렇게 하려면 모의 구성 파일 구조에 정의된 섹션이 포함된 모의 구성 파일을 만들어야 합니다.

  1. MockConfigFile.json 파일을 만들어 모의 서비스 통합으로 테스트를 구성합니다.

    다음 예제에서는 LambdaStateSQSState라는 정의된 상태 2개가 있는 상태 시스템을 참조하는 모의 구성 파일을 보여줍니다.

    Mock configuration file example

    다음은 Lambda 함수를 호출하고 Amazon에 메시지를 전송하여 응답을 모의하는 방법을 보여주는 모의 구성 파일의 예입니다. SQS 이 예제에서 LambdaSQSIntegration 상태 시스템에는 LambdaStateSQSState라는 Task 상태를 모의하는 HappyPath, RetryPathHybridPath라는 테스트 사례 3개가 포함되어 있습니다. 이러한 상태는 MockedLambdaSuccess, MockedSQSSuccessMockedLambdaRetry 모의 서비스 응답을 사용합니다. 이러한 모의 서비스 응답은 파일의 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라는 서비스 통합 작업 상태 2개를 정의합니다. 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":{ "Throw": { "Error": "Lambda.TimeoutException", "Cause": "Lambda timed out." } }
      • 세 번째 재시도는 모의 Lambda 응답의 Payload 섹션의 상태 결과가 포함된 작업 성공으로 끝납니다.

        "3":{ "Return": { "StatusCode": 200, "Payload": { "StatusCode": 200, "body": "Hello from Lambda!" } } }
        참고
        • 재시도 정책이 있는 상태의 경우 Step Functions Local은 성공 응답을 수신할 때까지 정책에 설정된 재시도 횟수를 모두 활용합니다. 즉, 연속 시도 횟수가 있는 재시도에 대해서는 모의로 표시해야 하며 성공 응답을 반환하기 전의 모든 재시도 횟수를 포함해야 합니다.

        • 특정 재시도(예: 재시도 “3”)에 모의 응답을 지정하지 않으면 상태 시스템 실행이 실패합니다.

    • HybridPath - 이 테스트는 LambdaState 출력을 모의합니다. LambdaState가 성공적으로 실행되고 모의 데이터를 응답으로 수신한 후에SQSState는 프로덕션에 지정된 리소스에 대한 실제 서비스를 직접적으로 호출합니다.

    모의 서비스 통합으로 테스트 실행을 시작하는 방법은 3단계: 모의 서비스 통합 테스트 실행 섹션을 참조하세요.

  2. 모의 응답 구조가 통합 서비스를 직접적으로 호출할 때 수신한 실제 서비스 응답 구조를 따르는지 확인합니다. 모의 응답의 구조적 요구 사항은 모의 서비스 통합 구성 섹션을 참조하세요.

    이전 예제 모의 구성 파일에서는 MockedLambdaSuccessMockedLambdaRetry에 정의된 모의 응답이 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 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 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. 모의 서비스 통합을 사용하여 상태 시스템을 실행합니다.

    모의 구성 파일을 사용하려면 모의 구성 파일에 구성된 상태 머신을 StartExecution API 호출하십시오. 이렇게 하려면 에서 사용하는 스테이트 머신에 접미사#test_name, 를 추가하십시오. ARN StartExecution test_name동일한 모의 구성 파일에서 상태 머신에 대해 구성된 테스트 케이스입니다.

    다음 명령은 LambdaSQSIntegration 상태 시스템과 모의 구성을 사용하는 예제입니다. 이 예시에서 LambdaSQSIntegration 상태 시스템은 1단계: 모의 구성 파일에 모의 서비스 통합 지정에 정의된 HappyPath 테스트를 통해 실행됩니다. HappyPath 테스트에는 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, 또는 GetExecutionHistory API 호출을 통해 실행 결과를 확인합니다.

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

    다음 예제는 2단계에 표시된 예제 응답의 실행을 GetExecutionHistory ARN 사용하여 호출에 대한 응답의 일부를 보여줍니다. 이 예제에서 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 } } }, ... ] }