← 모든 글

cron 시간대 사건 — 한 번 만나면 잊지 않는다

UTC/KST 혼선 하나가 새벽 배치를 8시간 어긋나게 만든 사건과 그 뒤처리.

사건

  • 배치 서버를 AWS ap-northeast-2 로 이전한 날 밤.
  • 기존 cron: 0 1 * * * — 팀 모두 “새벽 1시” 라고 알고 있었다.
  • 이전 전 서버는 로컬 타임존이 KST. 이전 후 서버는 기본값 UTC.
  • 결과: 배치가 KST 오전 10시에 돌았다. 정산 데이터가 업무 시간 한복판에 덮어씌워졌다.
  • 감지까지 40분. 롤백까지 20분. 총 피해: 당일 오전 집계 보고서 전면 재작성.

팀원 누구도 cron 표현식 옆에 타임존을 적지 않았다. “당연히 KST겠지” 라는 묵시적 가정이 이전 체크리스트에서도 빠졌다.

교훈

  • cron 에 타임존을 명시하지 않으면 그 값은 무의미하다.
    • systemd timer: OnCalendar= + [Timer] TimezoneName=Asia/Seoul
    • Kubernetes CronJob: spec.timeZone: "Asia/Seoul" (1.27+)
    • 그 외: 래퍼 스크립트 상단에 TZ=UTC 고정, 표현식은 UTC 기준으로만 작성.
  • 이전 체크리스트에 “타임존 명시 여부 확인” 항목 추가. 선택이 아니라 블로커.
  • 사건 직후 전체 cron/timer 목록 감사. 암묵적 KST 가정이 3개 더 발견됐다. 그날 전부 UTC 명시로 변환.
  • 모니터링: 배치 완료 시각을 로그에 UTC ISO 8601 로 남기고, 허용 창을 벗어나면 알림. 시각 자체를 검증 대상으로.

한 번 겪으면 이후로는 cron 한 줄 쓸 때마다 반사적으로 타임존을 확인하게 된다. 몸이 먼저 반응한다.

다음 한 가지

다음 글에서 “이전 체크리스트에 타임존 항목을 실제로 추가했나” 한 줄 확인하고 시작한다.


🛒 이 글과 어울리는 추천 상품

위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.