Asia/Seoul cron 과 UTC 의 결혼식
DST 가 없는 한국에서도 cron 시간이 어긋났다 — UTC 컨테이너 시간대의 함정.
한국은 DST 가 없다. 그래서 “시간대 문제는 우리랑 상관없겠지” 라고 한참 믿었다.
사건
월요일 아침 9시에 슬랙으로 와야 할 주간 메트릭이 18시에 도착했다.
cron 라인은 0 9 * * 1 ... — 월요일 9시. 그런데 도구가 도는 컨테이너의 시간대가 UTC 였다. UTC 09:00 = KST 18:00.
진짜 원인 — 왜 UTC 가 됐나
Docker 의 base image (python:3.12-slim) 가 기본 UTC. n8n base image 도 같음. 우리 docker-compose 에 TZ=Asia/Seoul 을 안 넣었다. 호스트는 KST 였지만, 컨테이너는 UTC.
environment:
- TZ=Asia/Seoul
한 줄 추가로 끝. 그런데 추가 후에도 일부 라이브러리 (특히 APScheduler) 는 datetime.now() 와 cron 표현식 간 해석이 갈렸다. 시스템 TZ 와 별개로 라이브러리 명시 timezone 인자 를 줘야 안전.
가장 안전한 패턴
cron 표현식 안에 시간대를 명시할 수 있는 라이브러리만 쓴다. 그게 아니면 cron 자체를 UTC 기준으로 적고 우리가 변환해서 적는다 (0 0 * * 1 = 월요일 KST 09:00). 코드 리뷰에서 시간대 의도가 명확해진다.
다음에는 다르게 할 한 가지
스케줄링은 항상 UTC 기준으로 적고 주석에 KST 변환을 적는다. 호스트 TZ 가 KST 라고 안심하면, 다음 컨테이너 마이그레이션에서 또 9시간 차이가 난다.
🛒 이 글과 어울리는 추천 상품
위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.