[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