FastAPI와 Slack API를 활용한 실시간 Slack 알림 시스템 구축
FastAPI와 Slack으로 알림 봇을 만든 이유
최근 회사 프로젝트에서 특정 이벤트가 발생했을 때 실시간으로 알림을 받을 수 있는 시스템이 필요했습니다. 기존 이메일 알림은 반응이 느렸고, Slack을 많이 사용하는 우리 팀 특성상 Slack 알림 봇이 더 적합하다고 판단했습니다.
이 글에서는 Slack API를 활용해 알림 메시지를 보내는 기능을 구현하고, FastAPI에서 해당 기능을 백그라운드 작업으로 처리하는 과정을 정리해 보았습니다.
구현 방법
1. Slack 앱 생성 및 설정
Slack API를 사용하기 위해서는 Slack 앱을 만들어야 합니다.
여기를 눌러 우측 상단에 Your apps를 눌러주세요.
Create New App 선택
From scratch 선택
원하는 App Name 을 입력한 뒤, 사용할 워크스페이스를 선택하고 Create App 버튼을 눌러 앱을 생성
2. Scope 권한 설정
OAuth & Permissions 선택
Bot Token Scopes에서 chat:write 추가
3. Slack Bot 생성
App Home 클릭 후, Edit 클릭
Display Name, Default username 설정
Message Tab 활성화
4. App-Level Token 발급
Settings -> Basic Information 선택 후, Generate Token and Scopes 선택
Token 이름 설정한 후, 다음과 같이 권한 추가하고 Generate 버튼을 클릭
Token 확인
5. Socket Mode 활성화
Settings에 Socket Mode를 누른 뒤, Enable Socket Mode 활성화
6. APP 승인 요청
Settings에 Install App 선택후, Install to 새 워크스페이스 선택
허용 선택
7. Token 준비
Slack으로 알림을 보내기 위해서는 아래의 세 가지 토큰이 필요합니다.
- SLACK_SIGNING_SECRET
- SLACK_BOT_TOKEN
- SLACK_APP_TOKEN
SLACK_SIGNING_SECRET 확인 방법
SLACK_BOT_TOKEN 확인 방법
SLACK_APP_TOKEN 확인 방법
Code
Slack 알림 전송 모듈
import os
from slack_bolt import App
# 토큰 설정
SLACK_SIGNING_SECRET = os.environ.get('SLACK_SIGNING_SECRET')
SLACK_BOT_TOKEN = os.environ.get('SLACK_BOT_TOKEN')
SLACK_APP_TOKEN = os.environ.get('SLACK_APP_TOKEN')
SLACK_CHANNEL_ID = os.environ.get('SLACK_CHANNEL_ID') # 알림 받을 Channel 이름
app = App(
token=SLACK_BOT_TOKEN,
signing_secret=SLACK_SIGNING_SECRET
)
def send_notification_to_slack(message: str, channel: str = None):
try:
target_channel = channel or SLACK_CHANNEL_ID
app.client.chat_postMessage(
channel=target_channel,
text=message
)
print(f"Slack 메시지 전송 완료: {message}")
except Exception as e:
print(f"Slack 메시지 전송 실패: {e}")
if __name__ == "__main__":
send_notification_to_slack("Test Message가 전송되었습니다!")
FastAPI Code
# Slack 알림을 백그라운드로 처리
from fastapi import BackgroundTasks
slack_message = f"🚨 출석 위반이 탐지되었습니다! 🚨"
BackgroundTasks.add_task(send_notification_to_slack, slack_message)
최종 결과
아래와 같이 Slack에 알림이 잘 전송된 것을 확인할 수 있습니다.