데이터 모니터링 슬랙봇 구축기

yeahcold·2025년 4월 4일
0

Data Engineering

목록 보기
15/20
post-thumbnail

회사에서 EP 데이터를 자동으로 수집하고 관리하는 작업을 하고 있다. 이 과정에서 수집 상태를 매번 확인하기 어렵다는 문제가 있었고, 이를 해결하기 위해 슬랙봇을 직접 만들어 연동해보게 되었다.


왜 슬랙봇을 만들게 되었는가

EP 파일이 매일 새벽 자동으로 수집되긴 하지만, 실제로 잘 업로드되었는지, 데이터가 유효한지 확인할 방법이 필요했다. 이전에는 그냥 수동으로 URL 접속 후 파일을 확인하거나, 로그를 따로 살펴봐야 했다.

그래서 매일 슬랙에 상태를 자동으로 알려주는 슬랙봇이 있으면 훨씬 편하겠다는 생각이 들었다.


구현 방향 고민

  • 단순 알림이 아니라 스레드로 묶어서 하루치 기록을 한 곳에서 보이게 하고 싶었다.
  • 상태 메시지는 하루 4번 보내야 했기 때문에 thread_ts를 유지할 방법이 필요했다.
  • 인증 정보, 파일 저장소, Slack 전송 등 다양한 요소들이 엮여 있어서 구조를 나눌 필요가 있었다.

이런 고민 끝에 다음과 같은 구조로 구성했다.


시스템 흐름

전체 흐름은 다음과 같다.

  1. 00:00 - 슬랙에 새로운 스레드 생성 (create-daily-ep-thread)
  2. 00:05 / 09:50 / 13:50 / 17:50 - 파일 검증 결과를 스레드에 댓글로 전송 (verify-ikea-ep-file)
  3. 00:05 / 15:00 - 파일 생성 및 업로드, 결과 메시지 전송 (export-ikea-products)

스레드 ID는 thread_ts라는 값으로 관리되며, 이 값을 GCS 버킷(ikea-thread-tracker)에 텍스트로 저장해서 이후 댓글 전송 시 불러오는 방식이다.


주요 구성 요소

Cloud Functions

모든 작업은 Cloud Function으로 구현되었고, 각각 HTTP 트리거 방식으로 배포한 뒤 Cloud Scheduler로 스케줄링했다. 사용된 함수는 다음과 같다:

  • create-daily-ep-thread
  • verify-ikea-ep-file
  • export-ikea-products

Cloud Scheduler

크론 표현식을 이용해 정해진 시간에 함수가 실행되도록 했다:

  • 0 0 * * * → 매일 00:00 (스레드 생성)
  • 50 0,9,13,17 * * * → 하루 4번 상태 확인
  • 5 0 * * * → 업로드 작업 (스레드 생성 직후)
  • 0 15 * * * → 오후 업로드 1회 추가

Google Cloud Storage

  • thread_ts 값은 ikea-thread-tracker/thread.ts에 저장된다.
  • 슬랙 스레드 댓글 메시지를 보낼 때 이 값을 불러와 thread_ts로 사용.

Slack Web API

  • chat.postMessage API를 사용하여 메시지를 전송했다.
  • 스레드 댓글 전송 시 thread_ts 파라미터 포함
  • 메시지에는 유저 멘션(<@Uxxxxxx>)과 상태 텍스트 포함
  • 스레드 생성 후 첫 댓글에 안내 문구를 따로 추가

디렉토리 구조

ikea-auto-ep/
├── main.py                   # Cloud Function entry-point
├── env.yaml                  # 환경변수 파일
├── requirements.txt
├── .env                      # 로컬 테스트용
├── .gitignore / .gcloudignore
│
├── deploy/
│   ├── deploy.sh
│   ├── deploy_thread.sh
│   └── notify_deploy.sh
│
└── localpackage/
    ├── fetch.py              # JSON 데이터 수집
    ├── filter.py             # EP 필터링
    ├── save.py               # TSV 저장
    ├── transform.py          # 포맷 변환
    ├── uploader.py           # S3 업로드 + 캐시 무효화
    ├── notify.py             # 슬랙 전송
    ├── thread.py             # 스레드 생성/저장/불러오기
    └── verify.py             # 검증 로직

느낀 점

  • Cloud Scheduler와 Cloud Function만으로도 꽤 강력한 알림 시스템을 만들 수 있었다.
  • Slack 스레드를 통해 이력을 한눈에 확인할 수 있다는 점이 특히 만족스러웠다.
  • 단순히 작동하는 것 이상으로 "보기 좋은 메시지 구성"이 꽤 중요하다는 것도 느꼈다.
  • GCS를 상태 저장소처럼 쓰는 것도 꽤 괜찮은 방법이라는 걸 배웠다.
  • 위와 같이 구현이 가능했다!

앞으로는 이 구조를 다른 프로젝트에도 확장해볼 생각이다.

profile
Software Engineer

0개의 댓글