[AWS] CloudWatch를 통한 CronTab 스케줄러 생성하기

David Im·2022년 5월 1일
0

본 글은 야간모드에 최적화 되어있습니다. 우측 상단에서 해 혹은 달모양을 클릭시어 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에 대해서는 잠깐이나마 활용할 가치가 있겠다 싶어 해당 방법으로 결정했다.


1. AWS CloudWatch Synthetic Canary 접속


우선 AWS Management Console에 접속해서 Cloud Watch에 접속한다.

접속하면 CloudWatch 대시보드가 보일텐데 좌측 메뉴에서 Synthetic Canary를 선택해주자.

접속을 하게 되면 현재 적용되어있는 Synthetic Canary의 리스트와 실행 상태에 대한 지표가 보여지는 페이지가 보여진다.

이 페이지에서 'Canary 생성'을 눌러준다.

눌러서 Canary 생성을 접속하게 되면 아래와 같이 Canary 지정 방식등에 대해서 설정할 수 있는 페이지가 보여진다.

여기서 하트비트 모니터링API Canary가 우리가 crontab 용도로 사용할 기능이다.

둘의 차이점은 설명에도 적혀있지만 상세히 적어보면 다음과 같다.

  • 하트비트 모니터링
    - 단순한 GET API 형식만 지정 가능하며, 단일 API에 대한 페이지 정보 로드를 테스트한다.
    - 주로 서버 상태를 체크할 때 많이 사용되는 용도이며, 우리 서버도 여기에 health-check 용도로 하나가 등록이 되어있다.

  • API Canary
    • 하트비트 모니터링과 같이 API 지정이 가능하지만, 좀 더 다양한 기능을 제공한다
      • GET / POST 두가지 방식 지원
      • 단일 API 뿐 아니라 여러개의 API를 등록 가능
      • API 결과 창에 대한 화면 자체도 캡쳐를 지원
      • crontab에서 사용할 수 있는 형식으로 사용가능

나는 여기서 API Canary를 사용했다. POST를 사용해야하기도 하고, crontab 형식으로 시간을 지정해야하기 때문이었다. API Canary 자체는 기본시간으로는 최대 1시간에 1번까지 밖에 실행할 수 없어, 1일에 한번 동작하도록 해야했던 나는 crontab 형식에서 사용하는 문법으로 사용하여 등록했다.

2. API Canary 생성

위에서 생성을 눌러 API Canary 생성페이지 접속했다면 가장 먼저 마주하게 되는 페이지이다.

캐너리 빌더의 이름인데 말그대로 내가 CloudWatch Synthetic Canary 페이지에서 구분해서 볼수 있는 이름을 지정하면 된다. 최대 22자 까지만 지정이 가능하기 때문에

나의 경우에는 단일 API만 호출하도록 지정할 예정이라서 아래처럼 서비스형태-api이름(이름의 space는 under bar로 구분) 이런식으로 해두었다.

Canary Builder name : net-update_state

여러개의 API를 동시간대에 묶어서 처리하게 하려면 API 이름이 아니라 어떤 역할을 하는지 포괄적으로 설명해서 적으면 좋을 듯 하다.


그다음은 호출할 API를 설정해주면 된다. 여기서 위에 언급한 것처럼 여러개의 API를 실행하게 등록할 수 있다.

HTTP 요청 추가 버튼을 클릭하면 다음의 화면이 보인다.

우리가 설정해주면 되는 부분은 위의 3가지 부분이다.

1. Method

  • HTTP 요청 방식이다. GET / POST 두가지 중 하나를 선택해서 추가 할 수 있다.

2. Application or API End-point URL

  • Synthetic Canary가 일정 시간마다 호출할 API의 URL을 지정하면 된다.

3. Header

  • cURL에서 사용하는 것처럼 Header를 추가해주면 된다.
  • request body / request query params 등 추가적인 정보가 필요한 경우 여기서 새 헤더 추가를 통해 추가해주면 된다.

나는 단일 API 호출만을 위한 것이라 하나만 추가하였지만 여러 API를 추가하고 싶다면 해당 단계에서 HTTP 요청 추가를 통해 더 추가가 가능하다.


3. API Canary 일정 정보 선택

원하는 요청을 전부 추가 한 이후에 이제는 crontab을 실행할 주기를 설정하면 된다.

아래 "일정" 탭에서 설정이 가능하다.

3가지 옵션을 우선 선택할 수 있는데,

  1. 지속적으로 실행

    • 주,월 단위가 아닌 분~하루 단위의 실행을 할 경우 여기서 지정해주면 된다.
    • 실행 단위는 매, 매일이 있다.
      • 매를 선택하게 되면 분단위를 지정해서 돌릴 수 있는데 분단위는 최대 60분까지 가능하다.
      • 매일을 선택하게 되면 매일 몇시에 실행 시킬건지 지정할 수 있다.
    • CRON 표현식을 통해 상세하게 돌아가야 하는 API가 아니라면 여기서 지속적 실행을 통해서도 충분히 가능하다.
  2. CRON 표현식

    • 우리가 알고 있는 Cron표현식이다.
    • 일반적으로 crontab에서 지정해서 해주는 것 처럼 좀 더 유연한 표현과 범위 지정이 가능하다.
    • 위의 지속적 실행에서 지정하는 시간범위인 60분을 넘는 단위(3시간, 6시간 등...)의 경우를 포함하여 주,월단위 실행과 같은 세부적 지정은 Cron 표현식을 사용해 설정하면 된다.
  3. 한번만 실행

    • 딱 1번만 호출 테스트하는 용도이다.
    • 정상적으로 돌아가는지 테스트 해보고 이후에 Canary 편집에서 다시 설정해서 테스트 해볼 수 있고, 기간도 재지정 가능하다.

4. API Canary 기타 정보 생성

위의 API 설정과 일정정보까지 모두 설정했다면 나머지는 기타 정보들이다.

나는 단순히 API 호출만을 위한 목적으로 사용하려 했고, 기존에도 서버의 health-check만을 위해 등록해놓은 것 뿐이라서 따로 건드린 부분은 없었다.

필요에 따라서 설정해주면 될 것 같다.

1. 데이터 보존

  • 데이터를 얼마나 보존 시킬지에 대한 기간을 설정 하는 것으로, 지정한 기간만큼 로그를 가지고 있는다.

ps. 이번에 추가하는 API 호출에 대해서는 로그에 대한 데이터 보존을 하루치만 저장하게 했다. 1시간에 한번씩 호출하게 해야하는 API인데 처리하는건 별거 없는지라 로그를 굳이 많이 쌓아봤자 의미없을 내용들이라서 이 부분만 설정해주었다.

2. 데이터 스토리지

  • 위의 보존되는 데이터들이 저장될 S3 bucket이다. 따로 지정하지 않으면 알아서 CloudWatch에서 경로를 지정해서 생성해준다.

3. 액세스 권한

  • Canary의 액세스 권한을 지정하는 것으로, 따로 설정하지 않으면 AWS Cloudwatch에서 현재 권한을 알아서 지정하여 생성해준다.

4. CloudWatch 경보

  • health-check 쪽에 달려있는 것인데,API 호출에서 문제가 있거나 실패하는 경우 Cloudwatch 경보를 통해 알려주게 된다.

5. VPC 설정

  • VPC 내에서 설정하여 API가 내부적으로 돌아야한다면 설정해주는 곳인듯하다.
  • 건드릴일은 나는 아직은 없을 듯 하다.

5. API Canary 생성 완료 및 모니터링

위의 과정을 모두 거쳐서 crontab을 실행하게 했다.

등록이 완료되면 맨 처음 Synthetics Canary 페이지에서 등록된 API canary 리스트가 보이고 실행하면서 모니터링 되는 화면이 아래처럼 나타난다.

crontab 실행 모니터링 모습


총 2개를 등록했고, 하나는 1시간, 하나는 하루에1번 실행하게 해두었다.

단순한 API call을 통해 우리 서버 내부에서 로직을 처리하게 하는 그런 Cron이라면 여기서 설정해서 돌려도 될 것 같다.

그리고 모니터링으로 성공인지 실패인지도 알 수 있고, 로그도 지원해주다 보니 꽤 나쁘지 않을지도...? 라는 생각이 들었다.

물론 여러개의 crontab이 추가되면 별도의 crontab 서버를 구성해서 돌려야겠지만 이정도 수준에서의 crontab은 굳이 EC2를 띄우지 않고 CloudWatch의 Synthetics Canary를 통해 실행해도 무리가 없어 보였다.

지금도 정상적으로 잘 돌아가고 있고 의외로 나쁜 방법은 아닐지도 싶다

crontab에 필요한 기능들에 대해 리스트업 완료되면 서버를 따로 구축해야겠다.
이번 2개는 좀 급하게 돌아가야해서 추가한것 일 뿐인데 나름 잘 돌아가서 신기하기도 하고, 이런 형태로 CloudWatch Synthetic Canary를 써보는 것도 처음이라 잘될까 싶었지만 잘 돌아가고 있으니 괜찮은 것 같다.

profile
코더보다 개발자로, 결과와 과정의 시너지를 만들어 가고 싶은 주니어 개발자

0개의 댓글