특정 시간에 반복적으로 어떤 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용은 상태를 '비활성' 해서 실행되지 않도록 바꿨다.

반응형
Posted by 돌비
,