Railway Cron

개요

railway 서비스에 cron 스케줄러를 만들면 지정한 시간에만 해당 서비스의 컨테이너가 만들어지고, 지정한 명령을 실행하고나면 자동으로 컨테이너를 종료한다.

이 문서에서는 매일 07시에 카카오 알림톡 발송을 지정된 전화번호로 보내는 스케줄러를 작성한다. 잘 작동한다면 다음과 같이 로그가 쌓일 것이다.

railway-cron-alimtalk.png

설정 방법

예시의 앱은 Django로 개발했다. Django는 커스텀 관리 명령이란 것을 만들 수 있는데, 이렇게 만들고 나면 python manage.py my_custom_command와 같이 실행할 수 있다. 이 예시에서는 다음 파일에 작성했다: src/notifications/management/commands/alimtalk_healthcheck.py 따라서 python manage.py alimtalk_healthcheck 라는 명령을 실행하면 카카오 알림톡 발송 스크립트가 실행된다. 여기서는 파일명만 이렇게 하고 실제로는 print()를 실행하는 간단한 코드를 사용한다.

코드 작성하기

알림톡 코드 작성

다음과 같이 작성하자.

alimtalk_healthcheck.py
print("sending alimtalk messsage...")

실제로 알림톡을 보내는 것이 아니기 때문에 작동하는지 확인하려면 railway 대시보드를 이용해야 한다.

cron 작성

다음과 같이 .toml 파일을 만든다. 시간을 UTC로 기준으로 작성해야 하는데, KST 기준 07시에 실행해야 하니까 -09:00를 적용하면 22시가 된다.

railway.cron.toml
[deploy]
startCommand = "python src/manage.py alimtalk_healthcheck"
cronSchedule = "0 22 * * *"

스케줄러는 이 파일에서 직접 작성해도 되고, Railway의 해당 프로젝트의 Settings에서 정의할 수도 있다. 여기서 이렇게 코드로 등록하면 환경에 상관없이 자동으로 등록된다.

Railway에 적용하기

위 코드를 git push 하고 나면 Railway에서 인식한다. 해당 서비스를 선택하고 Settings로 들어가보자. Deploy > Config-as-code 항목에 /railway.cron.toml를 입력(선택)한다.

이제 다시 배포를 하자.

Settings > Deploy 에 다음 두 가지 항목을 확인한다.

  1. Custom start command: python src/manage.py alimtalk_healthcheck
  2. Cron schedule: Custom, 0 22 * * *

railway.cron.toml 파일에 작성한 값이 읽기 전용으로 설정된다.

또한 다음과 같이 Cron Runs 항목이 추가된다.

railway-cron-runs.png

내일 아침 7시까지 기다릴 수는 없는 노릇이니 Run now 버튼을 클릭해서 바로 실행시킬 수 있다. 그러면 새 컨테이너를 생성하고 Deploy Logs에서 출력 결과를 볼 수 있다.

환경별로 cron 스케줄링하기

알림톡 발송도 비용이 드는거라 내 경우에는 staging에서는 알림톡을 안 보내고, production에서만 보내도록 설정했다. 이렇게 하려면 railway.cron.toml 파일에서 cronSchedule 항목을 삭제하고 Railway 프로젝트에서 해당 서비스의 Settings에서 직접 스케줄링을 설정하면 된다.

railway.cron.toml
 [deploy]
 startCommand = "python src/manage.py alimtalk_healthcheck"
-cronSchedule = "0 22 * * *"

다시 배포하고나면 아까와 달리 cron scheduler 설정하는 항목을 직접 입력할 수 있게 바뀌었다. 다음과 같이 해당 명령을 실행할 환경에서 직접 정의해보자.

railway-settings-cron.png
맨 위로