cron -> Lambda + EventBridge 전환을 선택한 이유

  • 나는 현재 서비스 개발 과정에서 AWS 같은 환경에서의 비용 발생을 최소화하기 위해 Ubuntu OS 가 설치된 VM 환경에서 개발을 진행하고 있다.
  • 현재 집에 구축된 홈랩에서 개발 환경을 제공하고 있으나 전기 공급 문제 or 인터넷 일시적 단절 문제 같은 24시간 안정성을 해치는 문제가 존재한다.

Linux 서버 자체에서 제공하는 스케줄링은 다음과 같은 문제로 피하려고 한다.

  • ⚡ 전력 공급 불안정 → 서버 다운 → cron 중단
  • 🌐 인터넷 연결 불안정 → 외부 API 호출 실패
  • 🔥 하드웨어 장애 → 전체 서비스 중단
  • 😱 외부에 있는 경우 → 장애 발생시 조치 어려움

위 문제로 cron을 사용하지 않는다고 하면? -> "홈랩을 기준으로 프로덕션 서비스를 운영하기 위한 서버에서 안정성이 고민된다면 AWS 같은 클라우드 환경에서 동작시키면 문제가 없는것 아닌가" 라는 질문이 100% 떠오르게 될것이다.

클라우드 환경의 프로덕션에서 만약 상황에 따라 다중 인스턴스 같은 Replica를 고려해야하는 상황이 찾아오게 된다면?

Load Balancer
├── Web Server 1 (cron 실행) ← 여기서만 실행해야 함
├── Web Server 2 (cron 실행 X)
└── Web Server 3 (cron 실행 X)

  • 모든 서버에서 cron 실행 → 중복 작업 발생 😱
  • 한 서버에서만 실행 → 해당 서버 다운 시 작업 중단 😱
  • 서버 추가/제거 시마다 cron 설정 수정 필요 😱

내가 만드는 서비스에서는 이러한 오토 스케일링 같은 부분은 사실 필요할 일이 없을 수 있다. -> 100% 확신을 가지고 이야기 할 수 없는 부분이라면 이러한 변수까지 고려해서 방안을 찾는게 맞다고 생각한다.

내가 만드는 서비스의 프레임워크인 Django 의 Django-cron을 사용하더라도, 각 서버의 프로세스가 각자 크론을 따로 실행시키는것을 피할 수 없는것도 사실이다.


INSTALLED_APPS = [
    'django_cron',
]

# 여전히 각 인스턴스에서 실행됨
@CronJobBase
class MyCronJob(CronJobBase):
    schedule = Schedule(run_every_mins=5)
    code = 'app.my_cron_job'

    def do(self):

로그 관리와 디버깅 또한 이러한 다중 인스턴스 같은 부분에서도 고려할 대상이 되어버린다.

# 서버 1
tail -f /var/log/cron.log | grep my_job

# 서버 2  
ssh server2 "tail -f /var/log/cron.log | grep my_job"

# 서버 3
ssh server3 "tail -f /var/log/cron.log | grep my_job"
  • 😱 어느 서버에서 실행됐는지, 왜 실패했는지 파악하기 어려움

다중 환경에서의 배포 및 롤백의 복잡성이 증가하는 부분도 문제가 된다.

  • cron 업데이트 시나리오
      1. 코드 수정
      1. 각 서버에 개별 배포
      1. cron 재시작
      1. 문제 발생 시 각 서버 개별 롤백
  • 😱 다중 서버 중 1개의 서버라도 실패하는 경우 일관성 깨짐

위에 언급한 문제 말고도 모니터링 + 비용 + 서버 관리 + 개발/스테이징/프로덕션 등의 환경 관리 등등 많은 포인트들을 고려해야한다.


Lambda + EventBridge로 전환하게 된다면?


# 모든 로그가 CloudWatch에 중앙화
aws logs tail /aws/lambda/my-function --follow

💰 비용 효율성 - 서버 운영 vs 서버리스

cron 스케줄링을 위한 추가적인 cron 서버를 운영하는 경우 다음과 같은 비용이 발생한다.

  • EC2 t3.small: $16.79/월 (만약 사양이 부족하다면 여기서 추가적인 비용 발생 )
    • 1분마다 크롤링 작업 실행 (24시간 풀 가동 필요)
    • 서버 자체 리소스 사용은 정당함
  • 추가 관리 비용: (저는 실제로 적용하지 않았지만 이러한 비용까지 발생할 수 있다는 점을 참고해주세요.)
    • 서버 모니터링 도구: $15/월 (DataDog 등)
    • 백업 스토리지: $5/월
    • 관리 시간 (월 4시간 × $50): $200/월
  • 연간 총 비용: $2,838

Lambda + EventBridge로 운영되는 경우 다음과 같은 비용이 발생한다.

  • Lambda 요청: 월 43,200회 (1분마다) = 무료 (100만 요청 한도 내)
  • Lambda 실행 시간: 월 720분 (평균 1초/회) = 무료 (40만 GB-초 한도 내)
  • EventBridge: 월 43,200회 = $0.43
  • 관리 시간: 거의 0시간
  • 연간 총 비용: $5.16

연간 최대 절약 비용 : $2,833(99.8% 절약!)

관리 포인트의 극적인 단순화

  • cron 환경

서버 관리:
✋ OS 보안 패치 (월 1회)
✋ 서버 상태 모니터링 (일일 체크)
✋ 디스크 용량 관리 (로그 정리)
✋ 네트워크 및 방화벽 설정
✋ cron 서비스 상태 확인

다중 인스턴스 관리 (확장 시):
✋ 어느 서버에서 cron 실행할지 결정
✋ 서버 추가/제거 시 cron 재배치
✋ 각 서버별 로그 수집 및 분석
✋ 로드밸런서와 cron 서버 분리 고려

배포 및 업데이트:
✋ 각 서버에 개별 배포
✋ 배포 실패 시 롤백 프로세스
✋ 환경별(dev/staging/prod) 개별 관리
  • Lambda + EventBridge 환경

관리할 것들:
✅ 코드 작성
✅ 배포 (1회 명령)
✅ 끝.

AWS가 자동 관리:
🤖 서버 패치 및 보안
🤖 가용성 및 확장
🤖 모니터링 및 로깅
🤖 장애 복구
🤖 백업 및 재해복구

관리 복잡도의 실질적인 비교 예시

  • cron 환경
1.  스크립트 파일 작성 (30분)
2.  각 서버에 파일 배포 (15분)
3.  crontab 수정 (10분)
4.  권한 및 환경변수 설정 (15분)
5.  로그 로테이션 설정 (10분)
6.  모니터링 알람 설정 (30분)
7.  문서화 (20분)

총 소요 시간: 2시간 10분  
관리 포인트: 7개 서버 × 7개 설정 = 49개 체크리스트
  • Lambda + EventBridge 환경
1. 함수 코드 작성 (30분)
2. 배포 (5분)
3. EventBridge 규칙 생성 (5분)

총 소요 시간: 40분
관리 포인트: 3개 체크리스트

장애 대응 시나리오 비교 예시

  • cron 환경
시나리오: 크롤링 작업이 갑자기 동작하지 않음

1.  어느 서버에서 문제인지 확인 (10분)  
    ssh server1 "sudo systemctl status cron"  
    ssh server2 "sudo systemctl status cron"  
    ssh server3 "sudo systemctl status cron"
2.  각 서버 로그 확인 (15분)  
    ssh server1 "tail -100 /var/log/cron.log"  
    ssh server2 "tail -100 /var/log/cron.log"  
    ssh server3 "tail -100 /var/log/cron.log"
3.  스크립트 실행 확인 (10분)  
    ssh server1 "cd /opt && python3 crawler.py"
4.  환경변수/권한 확인 (10분)
5.  수정 후 각 서버 재배포 (20분)

총 복구 시간: 65분
  • Lambda + EventBridge 환경
시나리오: Lambda 함수 실행 실패

1. CloudWatch에서 에러 로그 확인 (2분)
2. 로컬에서 코드 수정 (15분)  
3. 배포 (1분)

총 복구 시간: 18분

핵심 요약 정리

  • 📊 비용: 연간 $2,833 → $5.16 (99.8% 절약)
  • ⏰ 관리 시간: 2시간 10분 → 40분 (70% 단축)
  • 🚨 장애 복구: 65분 → 18분 (72% 단축)
  • 🎯 관리 포인트: 49개 → 3개 (94% 단순화)

결론적으로, 일정 단위로 동작하는 스케줄링이라면 서버를 기준으로 24시간 가동은 당연히 필요한 부분,
하지만 그로 인해 발생하는 남는 리소스 + 관리 오버헤드가 문제였고, Lambda + EventBridge를 통해 해결할 수 있었습니다.

이제 서버 관리 대신 실제 비즈니스 로직 개발에만 집중하시면 됩니다! 💪

+ Recent posts