특정 시간에 반복적으로 어떤 api 를 호출해야 할 경우, 쉬운 방법이다.
(스프링의 Batch 또는 Schedule 을 사용하지 않고)
* 장점
- api서버의 인스턴스가 n개일때, 스케쥴이 하나의 인스턴스에서만 동작하도록 보장하는 코드를 작성할 필요가 없음.
- 스케쥴을 활성/비활성 할때 소스의 배포 없이, CloudWatch 에서 즉시 변경 가능함.
- 테스트 하기 쉬움.
먼저 특정 api를 호출하는 람다함수를 만든다.
aws 콘솔에서 Lambda 에 접속한다.
함수생성 버튼 클릭.
함수 이름 : 원하는 이름을 입력함
런타임 : 어떤 언어로 람다함수를 작성할지 결정한다 (나는 Node.js 12.x 를 선택함)
이제 람다함수를 작성하는 화면이 나온다.
먼저 함수코드 영역.
index.js 파일에 api를 호출하는 코드를 작성하면 됨.
아래는 실제 람다 함수의 스크립트 전부다.
apiRequest() 함수에서 api 를 호출하고,
슬랙에 성공/실패 결과를 쓴다.
특별히 어려운건 없다.
const http = require('http');
const https = require('https');
// 람다 환경변수 값을 읽어옴.
const { API_HOST_NAME, API_URL_PATH, ENVIRONMENT, JOB_NAME, LAMBDA_NAME, SLACK_HOST_NAME, SLACK_URL_PATH } = process.env;
const api_options = {
host: API_HOST_NAME,
path: API_URL_PATH,
method: 'GET'
};
// const slack_options = {
// host: SLACK_HOST_NAME,
// path: SLACK_URL_PATH,
// method: 'POST'
// };
exports.handler = async function(event, context) {
const promise = new Promise(apiRequest);
return promise;
};
function apiRequest() {
let start_date = new Date();
let end_date = new Date();
let body_data = '';
console.log('start.');
const request = http.request(api_options, function(response) {
console.log('response.statusCode : ' + response.statusCode);
if(response.statusCode != 200) {
//sendToSlack('Failed', 'response.statusCode : ' + response.statusCode);
return;
}
// 응답 데이타를 받을때
response.on('data', function(body_chunk) {
console.log('response.on.body : ' + body_chunk);
body_data += body_chunk;
});
// 응답 데이타가 끝났을때
response.on('end', function() {
if(body_data.startsWith('OK')) {
end_date = new Date();
let duration_time = (end_date - start_date) / 1000;
//sendToSlack('Success (' + (duration_time) + '초)', body_data);
console.log('Success (' + (duration_time) + '초)', body_data);
} else {
//sendToSlack('Failed', body_data);
console.log('Failed', body_data);
}
});
});
// 요청 timeout
request.on('timeout', function() {
console.log('timeout');
//request.abort();
});
// 요청 에러
request.on('error', function(error) {
//sendToSlack('Failed', error);
console.log('api call failed');
console.log(error);
});
request.end();
}
// function sendToSlack(result, msg) {
// const format = {
// 'text': '*' + JOB_NAME + '*',
// 'username': 'BatchBot',
// 'attachments': [
// {
// 'color': '#36a64f',
// 'fields': [
// {
// 'title': 'Environment',
// 'value': ENVIRONMENT,
// 'short': true
// },
// {
// 'title': 'Result',
// 'value': result,
// 'short': true
// },
// {
// 'title': 'Message',
// 'value': msg,
// 'short': false
// },
// {
// 'title': 'CloudWatch Log',
// 'value': '...',
// 'short': false
// }
// ],
// }
// ]
// };
// const slack_message = JSON.stringify(format);
// const request = https.request(slack_options, function(response) {
// response.on('data', function(body) {
// console.info('webhook call success');
// console.info(body);
// });
// });
// request.on('error', function(error) {
// console.info('webhook call failed');
// console.info(error);
// });
// request.write(slack_message);
// request.end();
// }
환경변수 영역.
람다함수 스크립트에서 사용할 키/값을 설정한다.
함수생성 완료후, 제일 상단의 '테스트' 버튼을 클릭하여 api 호출이 정상적으로 되는지 확인한다.
이제 작성한 람다함수를 정기적으로 호출해줄 CloudWatch 규칙을 만든다.
aws 콘솔에서 CloudWatch 에 접속한다.
이벤트 > 규칙 > 규칙생성
이벤트 소스 : 일정 (규칙적인 반복 실행을 위하여)
고정비율 : 특정 시간 간격으로 반복 실행시 사용
Cron표현식 : 특정 날짜/시간에 반복 실행시 사용 (GMT 기준)
나는 매일 오전 10시에 실행할것이기 때문에 Cron 표현식을 선택함
0 01 * * ? * (오전 10시는 GMT 01시)
대상 : Lambda 함수를 선택하고 먼저 생성한 람다 함수를 지정한다.
완성된 모습.
나는 작업을 모두 끝마친 상태라서
dev용은 상태를 '비활성' 해서 실행되지 않도록 바꿨다.
'잡다한 자료' 카테고리의 다른 글
Redis. Keyspace Notifications (0) | 2021.02.16 |
---|---|
GitHub. Two-Factor Auth. SourceTree. ssh 연결 (0) | 2020.12.22 |
EFK 로그수집 (ElasticSearch+Fluendt+Kibana) (0) | 2019.04.12 |
aws. rds read replica. 로드밸런싱 (0) | 2018.06.12 |
aws. sns. 푸쉬발송 (0) | 2018.02.19 |