Supercronic으로 Crontab 사용하기
컨테이너 안에서 crontab을 사용할 때의 불편함과, 그 대안으로 supercronic을 Fly에서 실행하는 방법을 알려드릴게요. crontab 파일을 만들고 Dockerfile에 supercronic을 설치한 뒤, web과 cron 프로세스를 분리해서 배포하는 전체 과정을 따라 해 볼 수 있습니다.
출처: 문서
본문
개요
crontab은 컨테이너에는 조금 너무 자의적입니다. 아주 좋은 작은 도구이지만, 컨테이너 안에서 실행하면 우리가 원하는 방식으로 ENV 변수를 가져오지 않습니다. 다행히 supercronic이라는 Go 바이너리가 있어서 컨테이너용 drop-in 대체재가 됩니다.
좋은 소식은 약간의 복사와 붙여넣기만 하면 Fly에서 꽤 쉽게 실행할 수 있다는 것입니다. 시작해 볼게요.
crontab 파일 만들기
프로젝트 루트에 crontab 파일을 추가하세요.
touch ./crontab
5분마다 작업을 실행해야 한다면 crontab 파일은 대략 이렇게 될 것입니다:
*/5 * * * * echo "hello world!"
빠른 crontab 문법 참조가 필요하면 cron.help를 확인해 보세요.
컨테이너 안에 supercronic 설치하기
supercronic의 최신 릴리스는 GitHub에 있으며, Dockerfile에 넣는 복사 붙여넣기 🍝 지침도 함께 포함되어 있습니다. 2024년 1월 기준 현재 supercronic 버전은 v0.2.29입니다. 릴리스 페이지에서 최신 버전을 확인해야 하겠지만, 지금은 대략 다음과 같이 생겼습니다:
# Latest releases available at https://github.com/aptible/supercronic/releases
ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.2.29/supercronic-linux-amd64 \
SUPERCRONIC=supercronic-linux-amd64 \
SUPERCRONIC_SHA1SUM=cd48d45c4b10f3f0bfdd3a57d054cd05ac96812b
RUN curl -fsSLO "$SUPERCRONIC_URL" \
&& echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - \
&& chmod +x "$SUPERCRONIC" \
&& mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}" \
&& ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic
# You might need to change this depending on where your crontab is located
COPY crontab crontab
이것을 Dockerfile에 넣은 다음, Fly가 supercronic 인스턴스 하나만 실행하도록 구성하겠습니다. 왜일까요? 고객에게 이메일을 보내는 cronjob이 있다면, 그들이 그 이메일을 한 번만 받기를 원하기 때문입니다. 실행 중인 인스턴스 수만큼 서비스에서 이메일을 받는 것은 원하지 않겠죠.
web & cron 프로세스 설정하기
fly.toml 파일 맨 아래에 다음을 추가하세요:
[processes]
# The command below is used to launch a Rails server; be sure to
# replace with the command you're using to launch your server.
web = "bin/rails fly:server"
cron = "supercronic /app/crontab"
그런 다음 [[services]] 아래에 이 내용을 넣어 Fly에 web 프로세스가 서비스와 연결된다는 것을 알려야 합니다.
# Make sure there's only one `processes` entry under `[[services]]`
[[services]]
processes = ["web"]
이 변경은 [processes]에서 정의한 web 프로세스가 공개 인터넷에 노출된다는 것을 Fly에 알려줍니다. cron 프로세스는 공개 인터넷에 노출될 필요가 없으므로 노출되지 않습니다!
새 프로세스 배포 & 스케일링
supercronic을 Dockerfile에 추가하고, crontab을 프로젝트 폴더 루트에 두고, fly.toml 파일을 재구성했으니 이제 프로덕션에 배포할 준비가 되었습니다.
$ fly deploy
그런 다음 cron 프로세스가 있는 가상 머신 컨테이너를 하나만 실행하도록 프로세스를 스케일링해야 합니다. web은 이전에 있던 숫자로 바꾸는 것을 잊지 마세요.
$ fly scale count cron=1 web=
끝입니다! 모두 잘 진행되었다면 이제 Fly 가상 머신의 cron 프로세스에서 cron이 실행 중입니다. fly deploy를 실행하면 최신 코드 변경을 가져와 가상 머신을 재부팅합니다.
리소스
관련 읽을거리
- Task scheduling guide with Cron Manager and friends Fly.io에서 작업을 스케줄링하는 더 넓은 관점 — Cron Manager, Supercronic, 스케줄링된 Machines 등을 다룹니다.
- Run multiple process groups in an app
fly.toml에서 프로세스를 정의하고 여러 프로그램(web, cron, workers)을 실행하며 그룹별로 스케일링하는 방법을 설명합니다. - App Configuration (
fly.toml) 서비스, 프로세스, 헬스 체크 등을 조율하는 구성 파일에 대한 심층 설명.