본문 바로가기

Server Story....

서버 가동률 99.9% 도전: Slack 실시간 장애 알림 시스템 구축

반응형

Slack 실시간 장애 알림

 



1. 도입 및 배경 (Why?) 💡

서버 운영자에게 가장 공포스러운 순간은 언제일까요? 😱 바로 내가 잠든 사이, 혹은 즐거운 외출 중에 서버가 조용히 죽어버리는 상황입니다.

뒤늦게 접속했을 때 이미 몇 시간 전부터 서비스가 중단되어 있었다면, 그동안의 방문자 유입 손실수익 하락은 뼈아픈 결과로 돌아옵니다.

수익형 블로그나 자동화 에이전트를 운영한다면 더욱 그렇습니다. "에이전트가 글을 쓰다 멈췄는지?", "DB 연결이 끊겼는지?" 실시간으로 아는 것이 곧 돈입니다. 💸

오늘은 전 세계 개발자들이 가장 선호하는 협업 툴인 **슬랙(Slack)**을 활용해, 내 서버의 상태를 스마트폰으로 즉시 받아보는 시스템을 구축해 보겠습니다.


2. 알림 시스템 구조 (What?) 🏗️

전체적인 흐름은 매우 직관적입니다. 리눅스 서버에서 돌아가는 파이썬 스크립트가 감시자 역할을 하다가, 문제가 생기면 슬랙의 API(Webhook)를 통해 메시지를 던지는 구조입니다.

Plaintext
 
  [ 감시 대상 ]            [ 감시자 ]             [ 전달자 ]            [ 수신자 ]
  Server / DB  ------>  Python Script  ------>  Slack API  ------>  Smartphone
  (상태 체크)             (에러 탐지)            (Webhook)           (실시간 푸시)

이 구조의 장점은 별도의 서버 구축 없이 슬랙이 제공하는 고성능 인프라를 그대로 이용한다는 점입니다. 우리는 그저 '주소' 하나만 잘 따오면 됩니다.


3. 사전 준비: 슬랙 앱 및 Webhook 생성 🛠️

본격적인 코딩에 앞서, 알림을 받아볼 '방'을 만들고 권한을 얻어야 합니다.

Step 1: 슬랙 앱 만들기

  1. Slack API 사이트에 접속합니다.
  2. Create New App 클릭 → **From scratch**를 선택하세요.
  3. 앱 이름은 Server-Alert-Bot 정도로 정하고 관리할 워크스페이스를 선택합니다.

Step 2: Incoming Webhooks 활성화

  1. 왼쪽 메뉴에서 **Incoming Webhooks**를 클릭하세요.
  2. Off 상태를 **On**으로 바꿉니다.
  3. 하단의 **Add New Webhook to Workspace**를 눌러 알림을 받을 채널(#general 등)을 지정합니다.

⚠️ 중요: 생성된 Webhook URL을 메모장에 복사해두세요! 이 URL은 우리 서버가 슬랙에 메시지를 보낼 때 사용하는 '비밀 주소'입니다.

. . .


4. 핵심 작업: 파이썬 알림 모듈 작성 🐍

이제 리눅스 서버로 돌아와 코드를 작성할 차례입니다. 초보자도 바로 복사해서 쓸 수 있도록 범용적인 **'알림 모듈'**을 만들어보겠습니다.

■ 4-1. 필수 라이브러리 설치

파이썬에서 웹 데이터를 보내기 위해 requests 라이브러리가 필요합니다.

Bash
 
# 리눅스 터미널에서 입력
sudo apt update
sudo apt install python3-pip -y
pip3 install requests

■ 4-2. 슬랙 알림 모듈 (slack_bot.py)

어느 프로그램에서든 불러다 쓸 수 있도록 함수 형태로 만드는 것이 고수의 방식입니다.

Python
 
import requests
import json
import datetime

# [보안 주의] 이 URL은 절대 외부에 노출하지 마세요!
SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/TXXX/BXXX/XXXX"

def send_slack_message(title, message, color="#eb4034"):
    """
    슬랙으로 깔끔한 카드 형태의 알림을 전송합니다.
    :param title: 알림 제목
    :param message: 상세 내용
    :param color: 사이드바 색상 (에러: 빨강(#eb4034), 성공: 초록(#36a64f))
    """
    
    payload = {
        "attachments": [
            {
                "color": color,
                "pretext": f"🚀 *Server Status Report*",
                "fields": [
                    {
                        "title": title,
                        "value": message,
                        "short": False
                    }
                ],
                "footer": f"Linux Monitor | {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
            }
        ]
    }

    try:
        response = requests.post(
            SLACK_WEBHOOK_URL, 
            data=json.dumps(payload),
            headers={'Content-Type': 'application/json'}
        )
        
        if response.status_code != 200:
            print(f"전송 실패: {response.status_code}")
            
    except Exception as e:
        print(f"오류 발생: {str(e)}")

# 테스트 실행 (파일을 직접 실행할 때만 동작)
if __name__ == "__main__":
    send_slack_message("✅ 시스템 가동", "서버 모니터링 모듈이 정상 시작되었습니다.")

5. 실전 응용: 디스크 용량 감시하기 📊

이제 위 모듈을 활용해 **'디스크 사용량'**을 24시간 감시해 보겠습니다.

■ check_disk.py 작성

Python
 
import shutil
from slack_bot import send_slack_message

# 1. 디스크 사용량 체크 (루트 경로 '/')
total, used, free = shutil.disk_usage("/")
used_percent = (used / total) * 100

print(f"현재 사용률: {used_percent:.2f}%")

# 2. 임계치(90%) 초과 시 알림 발송
if used_percent > 90:
    msg = f"‼️ 경고: 서버 디스크 사용량이 {used_percent:.2f}%입니다! 로그 정리가 필요합니다."
    send_slack_message("🚨 Disk Full Warning", msg, "#eb4034")

이렇게 만든 스크립트를 리눅스 **crontab**에 등록하면, 여러분이 잠든 사이에도 서버가 스스로 건강 상태를 체크하고 보고하게 됩니다. 🤖


6. 트러블슈팅: 당신이 겪을 에러 2가지 🛠️

Q1. No module named 'requests' 에러가 나요!

  • 해결: 파이썬 버전이 섞여 있을 때 발생합니다. python3 -m pip install requests 명령어로 설치해 보세요.

Q2. 슬랙에 메시지가 안 와요!

  • 해결: Webhook URL이 정확한지 확인하고, 서버에서 외부(인터넷)로 나가는 포트가 방화벽에 막혀있지 않은지 체크하세요.

 


7. 마무리 및 태그 🏷️

서버 가동률 99.9%는 거창한 도구가 만드는 것이 아닙니다. 이런 작은 알림 시스템 하나가 모여 견고한 서비스를 만듭니다.

반응형