본문 바로가기

# Development/Flask

[Flask] Slack Bot 으로 서비스 장애 알림 받기

Slack Bot으로 서비스 장애 알림 받기

에러 핸들링을 할 때 예측이 불가능한 에러는 회사 내 채널(이메일, 슬랙)에 공지해 주어야 한다. 에러 케이스를 확인하고 관리하는 측면에서 Slack이 편할 것 같아 시스템에 장애가 발생할 경우 Slack으로 알림이 오도록 Slack Bot을 만들었다.


Slack App 만들기

https://api.slack.com/app 에서 Slack App을 생성 할 수 있다.

 

1) Create New App

 

2) From scratch 선택

 

3) App 이름 입력, App을 사용할 워크스페이스 선택

 

4) Scopes 설정

사이드바 [OAuth & Permissions]을 클릭하고 스크롤을 아래로 내리면 Scopes 섹션을 찾을 수 있다.  [Add an OAuth Scope] 버튼을 클릭하여 앱 구성을 위해 필요한 scope을 등록한다.

 

 

 

 https://api.slack.com/methods 에서 API method 별 필요한 scope을 확인 할 수 있다.

 

 

 

 5) App 사용을 위한 OAuth Token 발급 

Install App to Workspace을 클릭한다.

 

Slack API 호출 시 필요한 Token 정보

 

Slack  API를 호출할 때 위에 생성된 토큰 문자열을 복사해서 사용한다.

 

 

Slack App 채널에 추가하기

Slack에 들어가면 다음과 같이 '앱'에 내가 방금 생성한 Slack_TEST 앱을 확인 할 수 있다.

 

 

마우스 오른쪽 버튼 창에서 앱 세부정보 보기를 클릭하면 원하는 채널에 Slack_TEST를 추가할 수 있다.

 

 

Python에서 Slack API 호출하기

python에서 Slack API를 사용하기 위해 slack_sdk 설치

$ pip install slack_sdk

 

Slack App 모듈로 사용하기

# /module/slack_api.py

from slack_sdk import WebClient

class SlackAPI:
    """
    슬랙 API
    """
    def __init__(self, token, channel):
        """
        슬랙 클라이언트 인스턴스 생성
        """
        self.client = WebClient(token)
        
        self.channel_id = self.get_channel_id(channel, 'private_channel')
        
    def get_channel_id(self, channel_name, types):
        """
        슬랙 채널ID 조회
        """
        
        # conversations_list() 메서드 호출
        result = self.client.conversations_list(types=types)
        
        # 채널 정보 딕셔너리 리스트
        channels = result.data['channels']
        
        # 동일한 채널명 필터
        channel = list(filter(lambda x: x.get("name") == channel_name, channels))[0]

        # 채널ID 파싱
        channel_id = channel["id"]
        return channel_id


    # WARNING: api_url, description, error type 필수
    def post_error_message(self, api_url, description, error, note):
        """
        슬랙 에러 로깅 채널에 메세지 전송
        """

        description = '' if description == None else description
        note = '' if note == None else note

        # api_url: error가 발생한 API rul
        # error: error와 error type 포함
        text = "*" + api_url + "* :  " + description + "\n" \
                 + str(error)+ "\n"\
                 + str(note)
		
        # chat_postMessage() 메서드 호출
        result = self.client.chat_postMessage(
            channel= self.channel_id,
            text = text,
        )
        return result
# /module/token.py

token = "<<Slack API Token>>"

 

특정 채널에 메세지 보내기

from app.module.slack_api import *
from app.module.token import *

slack = SlackAPI(token, "<<channel_name>>")
slack.post_error_message(api_url, description, error, note)

 

 

<참고>

- https://wooiljeong.github.io/python/slack-bot/