피드로 돌아가기
매출 손실을 줄여주는 외부링크 관제 Bot, 'URL Checker' 개발기
뱅크샐러드 기술블로그뱅크샐러드 기술블로그
Backend

매출 손실을 줄여주는 외부링크 관제 Bot, 'URL Checker' 개발기

뱅크샐러드가 Puppeteer + 이미지 비교 + Kubernetes CronJob으로 제휴사 외부 링크 장애를 자동 감시해 장애 인지 시간을 2~4일에서 1일 이내로 단축

2020년 3월 13일12intermediate

Context

뱅크샐러드가 제휴사의 상품 상세 페이지를 WebView로 노출하면서, 제휴사 서버 장애나 URL 변경으로 인한 문제를 탐지할 방법이 없었다. 제휴사 페이지 문제가 발생해도 뱅크샐러드 팀이 인지하기까지 2~4일이 소요되었으며, 운영팀이 매시간 URL을 수동으로 확인해야 했다.

Technical Solution

  • Headless Browser 페이지 접근 자동화: Puppeteer를 사용해 사람 개입 없이 제휴사 페이지에 자동 접근
  • 이미지 기반 변경 감지: 페이지 스크린샷을 캡처한 후 Resemble.js로 정상 상태 이미지와 비교해 50% 이상 차이 시 장애 판단
  • Google Sheets API 연동: 빠른 가설 검증을 위해 AWS S3에 origin.png(정상 상태), current.png(현재 상태) 저장 및 구글 시트 연동
  • 주기적 모니터링 구성: 초기 GitHub Actions 선택 후 간헐적 에러 발생으로 self-hosted runner용 EC2 도입, 최종적으로 Kubernetes CronJob 전환
  • 서버 리소스 최적화: Kubernetes Pod에 메모리 8Gi(requests) / 16Gi(limits), CPU 2 할당으로 안정화
  • Slack 통지: 장애 감지 시 Slack incoming Webhooks로 관계자에게 즉시 알림

Impact

  • 제휴 상품 페이지 확인에 소요되는 주간 시간: 2~3시간에서 1시간 이내로 단축
  • 장애 인지 시간: 2~4일 이내에서 1일 이내로 단축
  • URL Checker 자체 에러 발생률: 33%에서 3% 수준으로 감소, Kubernetes CronJob 전환 후 7일 모니터링 결과 0건

Key Takeaway

외부 의존 시스템 모니터링 시 텍스트나 DOM 비교보다 최종 사용자 관점의 스크린샷 비교가 더 신뢰할 수 있으며, 운영 환경 선택(GitHub Actions → EC2 → Kubernetes)은 초기 개발 편의성보다 문제 발생 원인을 명확히 파악하고 제거할 수 있는 구조를 우선으로 해야 한다.


제휴사나 외부 API 서버 상태를 모니터링하는 팀에서 Puppeteer + 스크린샷 비교 + 이미지 diff 라이브러리(Resemble.js)를 조합하면 텍스트 변경에 민감하지 않으면서도 사용자 관점의 장애를 정확히 감지할 수 있으며, 운영 초기에는 GitHub Actions 같은 매니지드 CronJob으로 빠르게 검증한 후 문제가 명확해지면 Kubernetes로 전환해 리소스 제어와 로깅을 강화할 수 있다.

원문 읽기