[AWS] Event Scheduler: 유연한 시간 (flexible-time-window)

자주 있는 일은 아니지만, 랜덤한 시간에 batch 프로세스를 트리거할 필요가 있었다.
1시간마다 실행되고, 1시간 안의 아무때나 무작위로 실행이 되어야 했다.

이건 일부 리전에서 일정(schduler)에서 유연한 시간(flexible-time-window)이라는 형태로 기능을 제공한다.

만약 이런식으로 설정을 한다면, 매 시간의 10-40분 안의 아무때나 실행이 될 것이다.

저 셀렉트에 없는 다른 값이 필요하다면 aws-cli를 사용해서 수정해주면 된다.

aws scheduler update-schedule --name 스케줄이름 --flexible-time-window '{ "Mode": "FLEXIBLE", "MaximumWindowInMinutes": 50}'



미지원 리전

근데 스케줄러에는 커다란 문제가 있다. 서울 리전은 지원이 되지 않는다는 것이다.

도쿄 리전 같은 1티어 리전들은 저 스케줄링 기능을 "scheduler"라는 리소스 형태로 지원하는데,
서울 리전 같은 낙후된 리전은 "rule"이라는 레거시한 단위로 관리되고 저런 기능이 없다.

그래서 서울 리전에서 저 기능을 활용하고 싶다면, 도쿄 리전을 이용해서 해야 한다.
스케줄링은 도쿄에서 하되, 프록시를 통해 크로스-리전으로 서울에 batch를 제출하도록 하면 되는 것이다.

그래서 난
스케줄러(도쿄) -> Lambda(도쿄) -> Batch(서울) 의 호출 구조로 구현했다.

이렇게 도쿄에 함수 하나 파서

이렇게 코드로 제출하도록 구현했다.

const aws = require('aws-sdk');
const batch = new aws.Batch({
    region: 'ap-northeast-2' // 서울 리전
});

exports.handler = async (event) => {
    const params = {
        jobDefinition: "HOURLY_RANDOM_SNAPSHOP:1", 
        jobName: "HOURLY_RANDOM_SNAPSHOP", 
        jobQueue: "arn:aws:batch:ap-northeast-2:...:job-queue/processor"
    };
    const result = await batch.submitJob(params).promise();

    console.log('result', result);

    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

Lambda 역할에 batch 권한을 추가해줘야 한다.

그리고 저 람다를 도쿄 스케줄러에 등록해주면 끝이다.

그럼 이제 되긴 되는데...

생각보다 랜덤 분포가 고르게 되거나 그런거는 아니었다..
엿장수 맘대로다.

시도만 해보고 버렸다.



참조
https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-schedule-flexible-time-windows.html