
서비스를 운영하다 보면 장애 알림을 다양한 방식으로 받게 된다.
- Slack 알림
- 이메일
- 모니터링 시스템(Alerting)
하지만 실제 운영 환경에서는 알림이 오는데도 대응이 늦어지는 상황이 종종 발생한다.
이번 글에서는 Slack 장애 알림을 전화로 전달하는 Teams Call Bot 시스템을 구축한 경험을 정리해보려고 한다.
1. Slack 알림을 놓쳐서 장애 대응이 늦어졌다
우리 시스템에서도 장애 알림은 대부분 Slack 채널을 통해 전달되고 있었다.
Slack은 협업 도구로 매우 편리하지만, 운영 관점에서는 한 가지 문제가 있었다.
중요한 알림이 묻힐 수 있다는 점이다.
운영 채널에는 다음과 같은 메시지들이 계속 올라온다.
- 배포 알림
- 모니터링 로그
- 시스템 상태 메시지
- 일반 대화
이렇게 메시지가 많아지면 정작 중요한 장애 알림이 묻히는 경우가 생긴다.
특히 다음과 같은 상황에서 문제가 발생했다.

- 야간 시간 (잠 자는 시간..)
야간 호스트센터 대응 문제
우리 환경에는 야간 대응을 담당하는 호스트센터가 있었다.
이상적으로라면 아래와 같은 흐름을 원했지만
이 과정이 생각보다 오래 걸리는 경우가 있었다. 왜냐하면 호스트 센터의 분들은 실제 운영자가 아니기 때문에
우리 서버만 보는 게 아니라서 인지가 늦었고, 심지어 우리가 인지하고 대응까지 완료했을 때 연락오는 경우도 있었다.!
문제의 핵심
문제는 이것이었다.
알림은 보내고 있지만 사람이 즉시 인지하지 못한다.
장애 대응에서 중요한 것은 알림을 보내는 것이 아니라
사람이 즉시 인지하는 것
그래서 이런 생각이 들었다.

“Slack 알림을 전화로 알려주면 어떨까?”
2. 그래서 전화하는 봇을 만들었다
아이디어는 단순했다.
Slack에서 특정 장애 메시지가 발생하면 👉 담당자에게 자동으로 전화 그리고 전화에서 장애 내용을 음성으로 읽어준다.
예를 들어 Slack에 다음 메시지가 올라오면

콜봇이 자동으로 전화하여 아래의 슬랙 문구를 읽어서 안내하는 방식이다.
"API 서버에서 장애가 발생했습니다. Error Rate가 증가했습니다."
이렇게 하면 Slack 메시지를 놓치더라도 전화로 바로 인지할 수 있다.
3. 왜 Teams를 선택했을까
전화 알림 시스템을 만들 때 가장 먼저 고민한 것은 어떤 플랫폼을 사용할 것인가였다.
몇 가지 선택지가 있었다.
- Slack Call
- 일반 전화 API (Twilio 등)
- Microsoft Teams
최종적으로 Microsoft Teams 기반으로 구현하기로 했다.
1️⃣ 사내 커뮤니케이션 환경
우리 조직에서는 이미 대부분의 협업이 Microsoft Teams 중심으로 이루어지고 있었다.
- 사내 채팅
- 화상 회의
- 사용자 계정 관리
따라서 새로운 전화 인프라를 도입하기보다 기존 협업 플랫폼을 활용하는 것이 자연스러웠다.
2️⃣ Microsoft Graph API 지원
Teams는 Microsoft Graph API를 통해 다양한 자동화를 지원한다. 특히 다음과 같은 기능을 제공한다.
- 사용자에게 전화 걸기
- 봇 기반 통화 처리
- 통화 세션 제어
- 미디어 스트림 처리
즉 콜봇(Call Bot)을 구현할 수 있는 공식 API가 제공된다.
3️⃣ 별도의 전화 인프라 불필요
일반 전화 API를 사용할 경우
- 전화번호 관리
- 통화 비용
- 별도 인프라 운영
등을 고려해야 한다.
하지만 Teams를 사용하면 👉 회사 계정 기반으로 바로 통화 가능 따라서 시스템 복잡도가 훨씬 낮았다.
4. 전체 아키텍처
구현한 시스템 구조는 다음과 같다.
Slack Alert 1️⃣ Slack 이벤트 발생
↓
Node.js Event Server 2️⃣ Node 서버에서 이벤트 수신
↓
Azure Text To Speech 3️⃣ 메시지를 Azure TTS로 음성 변환
↓
Audio File 생성
↓
Microsoft Graph API 4️⃣ Graph API로 Teams 전화 생성
↓
Teams Call Bot 5️⃣ 통화 연결 후 음성 재생
↓
사용자에게 전화
사용 기술
| Slack Events API | Slack 메시지 수신 |
| Node.js | 이벤트 처리 서버 |
| Azure TTS | 텍스트 음성 변환 |
| Microsoft Graph API | Teams 전화 생성 |
| Teams Bot | 통화 세션 관리 |
5. Graph API 삽질기
이 프로젝트에서 가장 어려웠던 부분은 Microsoft Graph API로 Teams 전화를 생성하는 과정이었다.
Use the Microsoft Graph API - Microsoft Graph
Learn how to register your app and get authentication tokens for a user or service before you make requests to the Microsoft Graph API.
learn.microsoft.com
솔직히 말하면 문서가 꽤 어렵다.

전화 생성 API
Teams Call Bot은 다음 API로 통화를 생성한다.
POST /communications/calls
요청 예시는 다음과 같다.
{
"callbackUri": "https://example.com/callback",
"targets": [
{
"identity": {
"user": {
"id": "USER_ID"
}
}
}
],
"requestedModalities": [
"audio"
]
}
권한 설정이 생각보다 복잡하다
Graph API를 사용하려면 다음 권한이 필요했다.
Calls.Initiate
Calls.AccessMedia
Calls.JoinGroupCall
그리고 다음 과정을 거쳐야 한다.
Azure App Registration → Bot 등록 → Teams 권한 승인 → 관리자 동의(Admin Consent)
이 과정을 모두 완료해야 정상적으로 동작한다.
음성 재생 처리
전화 연결 후에는 아래와 같은 과정을 거쳐야 한다.
1️⃣ 음성 파일 로드
2️⃣ 음성 스트림 생성
3️⃣ 통화 세션으로 전달
최종적으로 구현한 구조는 다음과 같다.
6. 실제 운영 결과
이 시스템을 운영 환경에 적용한 이후 다음과 같은 변화가 있었다.
| 장애 인지 시간 | 수 분 → 수 초 |
| Slack 알림 의존도 | 감소 |
| 야간 대응 | 즉시 가능 |
특히 효과가 컸던 부분은 야간 장애 대응이었다. Slack 메시지를 놓치는 경우가 있었지만 전화가 오면 반드시 인지하게 된다.
(왜냐하면, 전화를 안받게 되면 담당자들을 라운드 로빈으로 돌아가면서 받을 때까지 전화를 했기 때문..)
마무리
이번 프로젝트를 통해 느낀 점은 하나였다.
장애 대응에서 중요한 것은
알림을 보내는 것이 아니라 사람이 인지하게 만드는 것이다.
Slack 알림은 유용하지만 놓칠 가능성이 있다. 하지만 전화는 거의 놓치지 않는다.
그래서 지금은 장애가 발생하면
👉 Slack 메시지가 올라오고
👉 동시에 Teams 전화가 온다.
덕분에 장애 인지 속도를 크게 줄일 수 있었다.
다음 글에서는 Microsoft Graph API로 Teams Call Bot을 실제 코드로 구현하는 방법 을 정리해볼 예정이다.
'Project' 카테고리의 다른 글
| [Project] 여행 일정 관리 플랫폼 - 마실가실 (0) | 2023.09.17 |
|---|---|
| [Project] 악세서리 온라인 쇼핑몰 - hrhz(하루한줌) (0) | 2023.09.16 |