[AWS] Step Function: 랜덤 딜레이 프로세스

관련 포스트
https://blog.naver.com/sssang97?Redirect=Log&logNo=222810066038&from=postView

특정 batch 프로세스를 1시간마다 돌려야 하는데, 그걸 또 1시간의 아무 시간에 랜덤하게 실행시킬 필요가 있었다.

그래서 Step Function으로 딜레이 통제를 하도록 적용해서 시도해봤다.

내 생각은 이러했다.

Lambda로 랜덤 시간을 0-59분 범위로 생성하고, 그걸 받아서 대기한 다음에, batch를 쏘는 것이다.




Lambda: 랜덤 시간 생성

먼저 랜덤 생성 함수를 만들었다.

별로 하는건 없다.
랜덤 분, 초 만들어서 뱉어줄 뿐이다.
그럼 저게 스텝펑션 컨텍스트에 저장될 것이다.

이건 코드

exports.handler = async (event) => {
    const minute = Math.floor(Math.random() * 60);
    const second = minute * 60;

    const response = {
        minute,
        second,
    };
    return response;
};

그리고 저 함수의 호출을 첫머리로 둔다.




대기

그 다음에는 Lambda의 리턴값을 받아서 대기하도록 했다.
상태머신은 단순히 전환 수를 기준으로만 비용을 부과하기 때문에, 이걸로 몇시간을 대기한다고 하더라도 비용이 나오거나 하진 않는다.



Batch 제출

그리고 대기한 다음에는 바로 batch 태스크를 쏘도록 했다.

그래서 내 경우에는 상태머신의 코드를 뽑으면 이런식으로 나왔다.

{
  "StartAt": "Lambda Invoke",
  "States": {
    "Lambda Invoke": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "OutputPath": "$.Payload",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:ap-northeast-2:?:function:get-random-minute:$LATEST"
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "Next": "Wait"
    },
    "Wait": {
      "Type": "Wait",
      "Next": "SubmitJob",
      "SecondsPath": "$.second"
    },
    "SubmitJob": {
      "Type": "Task",
      "Resource": "arn:aws:states:::batch:submitJob.sync",
      "Parameters": {
        "JobName": "HOURLY_RANDOM_SNAPSHOP",
        "JobDefinition": "arn:aws:batch:ap-northeast-2:?:job-definition/HOURLY_RANDOM_SNAPSHOP:1",
        "JobQueue": "arn:aws:batch:ap-northeast-2:?:job-queue/processor-prod"
      },
      "End": true
    }
  }
}

이대로 실행해보면 잘 기다리면서 버티는 것을 실시간으로 확인할 수 있다.

딜레이 처리는 됐으니 이제 저걸 eventbridge로 트리거하기만 하면 된다.




eventbridge

규칙을 만들고,

일정을 매 시간 정각으로 하고,

만들었던 상태머신에 트리거를 걸어주기만 하면 된다.

그럼 잘 돌아갈 것이다.



참조
https://advancedweb.hu/how-to-delay-calling-a-lambda-function-using-step-functions/