본 글은 야간모드에 최적화 되어있습니다. 우측 상단에서 해 혹은 달모양을 클릭시어 velog 설정을 야간모드로 해주시면 더욱 편안하게 읽으실 수 있습니다.
API를 개발하다가 crontab을 사용해야할 일이 생겼다.
스타트업이다 보니, 아무래도 crontab을 돌릴 상황이 크게 없었고, crontab 서버를 구성하려고 하기엔 당장의 시간이 부족해서 아래의 방법을 고려를 했었다.
AWS EC2를 사용해서 임시의 crontab 서버를 구축하고 우선은 python 모듈만 설치해서 api call을 시키는것을 crontab으로 등록하는 방법이었는데, EC2를 띄우고 구축하려다가, 여러개의 crontab을 돌릴것도 아니고.. 단순히 2개정도의 간단한 cron API를 테스트하고 적용할 뿐인데 EC2 하나를 띄우자니 t2.micro로 써도 낭비라는 생각이 들었다.
그래서 다른 방법이 없을까 하다가 문득 AWS의 CloudWatch가 생각났다.
지금은 단순한 서버의 health-check를 위한 용도와 서버 RDS 모니터링 용도로 해서 사용중인건데, 찾다보니 Synthetic Canary라는 것이 Cron 서버 구축 전까지 잠시나마 그 역할을 해줄 수 있을 것 같았다.
사실 그러한 용도로 있는것은 아닌것이 알지만 ㅋㅋㅋ...
Synthetic Canary는 일정 주기마다 단일 API 호출을 테스트하고 로깅 및 모니터링을 위한 기능인데, 지금 crontab 돌리려고 하는 API의 경우에는 request_body같은것도 필요없이, 상태만 업데이트 해주는 기능이어서 목적으로도 알맞았다.
EC2 띄우는것보다 효율적이고, 로그도 쌓아주고.. 하나의 API에 대해서는 잠깐이나마 활용할 가치가 있겠다 싶어 해당 방법으로 결정했다.
우선 AWS Management Console에 접속해서 Cloud Watch에 접속한다.
접속하면 CloudWatch 대시보드가 보일텐데 좌측 메뉴에서 Synthetic Canary를 선택해주자.
접속을 하게 되면 현재 적용되어있는 Synthetic Canary의 리스트와 실행 상태에 대한 지표가 보여지는 페이지가 보여진다.
이 페이지에서 'Canary 생성'을 눌러준다.
눌러서 Canary 생성을 접속하게 되면 아래와 같이 Canary 지정 방식등에 대해서 설정할 수 있는 페이지가 보여진다.
여기서 하트비트 모니터링과 API Canary가 우리가 crontab 용도로 사용할 기능이다.
둘의 차이점은 설명에도 적혀있지만 상세히 적어보면 다음과 같다.
위에서 생성을 눌러 API Canary 생성페이지 접속했다면 가장 먼저 마주하게 되는 페이지이다.
캐너리 빌더의 이름인데 말그대로 내가 CloudWatch Synthetic Canary 페이지에서 구분해서 볼수 있는 이름을 지정하면 된다. 최대 22자 까지만 지정이 가능하기 때문에
나의 경우에는 단일 API만 호출하도록 지정할 예정이라서 아래처럼 서비스형태-api이름(이름의 space는 under bar로 구분) 이런식으로 해두었다.
Canary Builder name : net-update_state
여러개의 API를 동시간대에 묶어서 처리하게 하려면 API 이름이 아니라 어떤 역할을 하는지 포괄적으로 설명해서 적으면 좋을 듯 하다.
우리가 설정해주면 되는 부분은 위의 3가지 부분이다.
1. Method
2. Application or API End-point URL
3. Header
나는 단일 API 호출만을 위한 것이라 하나만 추가하였지만 여러 API를 추가하고 싶다면 해당 단계에서 HTTP 요청 추가를 통해 더 추가가 가능하다.
원하는 요청을 전부 추가 한 이후에 이제는 crontab을 실행할 주기를 설정하면 된다.
아래 "일정" 탭에서 설정이 가능하다.
3가지 옵션을 우선 선택할 수 있는데,
지속적으로 실행
CRON 표현식
한번만 실행
위의 API 설정과 일정정보까지 모두 설정했다면 나머지는 기타 정보들이다.
나는 단순히 API 호출만을 위한 목적으로 사용하려 했고, 기존에도 서버의 health-check만을 위해 등록해놓은 것 뿐이라서 따로 건드린 부분은 없었다.
필요에 따라서 설정해주면 될 것 같다.
1. 데이터 보존
ps. 이번에 추가하는 API 호출에 대해서는 로그에 대한 데이터 보존을 하루치만 저장하게 했다. 1시간에 한번씩 호출하게 해야하는 API인데 처리하는건 별거 없는지라 로그를 굳이 많이 쌓아봤자 의미없을 내용들이라서 이 부분만 설정해주었다.
2. 데이터 스토리지
3. 액세스 권한
4. CloudWatch 경보
5. VPC 설정
위의 과정을 모두 거쳐서 crontab을 실행하게 했다.
등록이 완료되면 맨 처음 Synthetics Canary 페이지에서 등록된 API canary 리스트가 보이고 실행하면서 모니터링 되는 화면이 아래처럼 나타난다.
crontab 실행 모니터링 모습
단순한 API call을 통해 우리 서버 내부에서 로직을 처리하게 하는 그런 Cron이라면 여기서 설정해서 돌려도 될 것 같다.
그리고 모니터링으로 성공인지 실패인지도 알 수 있고, 로그도 지원해주다 보니 꽤 나쁘지 않을지도...? 라는 생각이 들었다.
물론 여러개의 crontab이 추가되면 별도의 crontab 서버를 구성해서 돌려야겠지만 이정도 수준에서의 crontab은 굳이 EC2를 띄우지 않고 CloudWatch의 Synthetics Canary를 통해 실행해도 무리가 없어 보였다.
지금도 정상적으로 잘 돌아가고 있고 의외로 나쁜 방법은 아닐지도 싶다
crontab에 필요한 기능들에 대해 리스트업 완료되면 서버를 따로 구축해야겠다.
이번 2개는 좀 급하게 돌아가야해서 추가한것 일 뿐인데 나름 잘 돌아가서 신기하기도 하고, 이런 형태로 CloudWatch Synthetic Canary를 써보는 것도 처음이라 잘될까 싶었지만 잘 돌아가고 있으니 괜찮은 것 같다.