슬랙에서 이용 가능한 봇을 만들게 된 경위를 적어봤습니다.

시작하며

버즈니는 올 해 초부터 사내 커뮤니케이션 툴로 슬랙(Slack)을 적용하게 되었습니다. 초기에는 봇으로 휴봇을 이용하려고 했으나 회사의 메인 DNA는 파이썬이기에 파이썬으로 작성된 플러그인을 돌릴 수 있는 봇이 필요했고, 마땅한 대안이 없어서 결국 직접 작성하게 되었습니다. 해당 코드는 Github/hongmoa 에 올려두었으며, 이슈나 PR은 언제든 환영입니다.

작업배경

이메일과의 전쟁

얼마전까지 버즈니에서는 대부분의 업무와 모니터링 알림을 이메일로 처리하고 있었습니다. 처음엔 이메일로도 충분하다고 생각했지만 관리해야하는 십 수개의 크롤러, 다양한 프로세스에서 뱉어내는 알람들을 처리하기에 이메일은 다소 부담스러운 면이 있었습니다. 즉시 확인하는 과정이 다소 번거롭고, 이메일로 주고받고 있는 중요한 업무들과 다소 사소한 모니터링 알림들이 뒤섞이면서 메일을 읽고 분류하는데 상당한 노력을 쏟아야 했기 때문이죠.

슬랙: 쉽게 통합가능한 메신저

처음 슬랙을 도입하고 환호했던 점은 거의 모든 기기에서 사용가능한 사내 커뮤니케이션 툴을 무료로 사용할 수 있다는 것 이었습니다. 파일을 주고 받고, 업무를 공유할 수 있는 도구만으로도 충분히 매력적이었지만 클릭 몇번으로 수 십개의 어플리케이션에 대한 통합이 가능한 점은 뿌리치기 힘든 유혹이었습니다. 한 예로, 현재 버즈니에서는 모든 소스코드를 bitbucket와 github 에서 버전관리를 하고 있습니다. 주요 프로젝트들에 대해서는 커밋내용에 대해서 지속적인 숙지가 필요한데 슬랙의 bitbucket 통합기능을 이용하면 누군가 PR을 하거나 주요 브랜치에 push를 할 때 즉시 특정 채널에서 알림을 받을 수 있습니다. 이것을 이용해 해당 커밋에 대해 간단한 코드리뷰도 진행할 수 있죠. 또 모니터링 방열판도 쉽게 구성이 가능했습니다. webhook 이나 bot API를 이용하면 관리대상인 데몬프로세스들이 죽거나 오류가 발생했을때 Slack을 통해 해당 내용을 즉시 받을 수 있습니다. 뿐만 아니라, 다양한 언어로 작성된 클라이언트와 슬랙에서 제공하는 API를 통해 몇줄의 코드만으로 위에서 언급한 모든 기능을 구현할 수 있다는 점도 큰 장점이죠. 모니터링

휴봇

처음 슬랙 봇으로 사용하려고 했던 휴봇은 github 의 대표문화중 하나로서, github는 chatops 라는 직책이 있을 정도로 채팅봇인 휴봇을 적극적으로 사용하는 것으로 유명합니다. 버즈니도 처음엔 휴봇을 이용하여 간단한 몇가지 기능을 처리하고 있었는데요, 휴봇은 coffee 스크립트로 플러그인을 쉽게 만들어 붙일 수 있도록 되어 있지만, 팀원들은 익숙한 언어인 파이썬으로 쉽게 플러그인을 만들 수 있는 봇이 있었으면 하는 바람이 있었습니다. 랜덤하게 점심팀을 만들어준다거나, 자주쓰는 명령어를 메모할 수 있게 한다거나, 특정 브랜치의 소스코드를 바로 테스트서버에 배치해볼 수 있다거나 했으면 좋겠다는 요구들이 있었고 어느 한가한 토요일 오후 노트북을 들고 가까운 카페에서 몇시간 동안 열심히 작업해서 파이썬으로 동작하며, 파이썬 코드로 플러그인을 붙일 수 있는 슬랙 봇을 만들게 되었습니다.

네이밍

새 프로젝트에서 가장 어려운 작업이 바로 이름을 짓는 것인데요, Buzzguy, BuzzBot, PylackBot 등 다양한 이름을 가지고 씨름하던차에 마침 회사에서 브랜드 마케팅 팀에서 새로운 캐릭터를 만들게 되었는데 바로 홍모아 였습니다. 모든 사람들이 친숙한 회사 캐릭터를 사용하니 휴봇을 사용할 때보다 봇을 사용함에 있어서 훨씬 친근감이 생기는 듯해서 좋았습니다. 개발자들이 다 남자여서 칙칙한 채널에 활기를 불어 넣어 줄 수 있으리라 기대도 약간 하고 있구요.

홍모아 소개

쉽게 쓸만한 파이썬 슬랙 봇이 없어서 직접 만든 만큼, 다른 팀들은 삽질을 하지 않아도 되도록 홍모아를 오픈소스로 공개하기로 했습니다. 홍모아의 목적은 크게 2가지로 첫째는 파이썬으로 플러그인을 작성할 수 있는 슬랫 봇 둘째는 한영전환이 필요없는 명령시스템 입니다. 홍모아를 팀에서 이용하시려는 분들을 위해 간단히 구조와 사용방법을 설명해드리겠습니다. 원래는 hubot처럼 wsgi 를 통해 heroku에 바로 배치할 수 있도록 구성하였으나 wsgi는 다소 무겁다고 판단해서 현재의 단순한 모습이 되었습니다.

구조

├── README.md
├── __init__.py
├── apps
│   ├── __init__.py
│   ├── decorators.py
│   ├── redis_brain.py
│   └── helper.py
├── requirements.txt
├── robot.py
└── settings.py

홍모아의 기본구조는 Hubot과 Django에서 영감을 받아 만들어졌으며 크게 메인루프와 데코레이터, 플러그인으로 구성되어 있습니다. 메인루프는 robot.py 에 해당하며 데코레이터는 apps.decorators 에 해당합니다. 플러그인은 각 데코레이터를 통해 dispatch 되며 gevent를 통해 비동기로 작동합니다.

실행방법

먼저 Slack 에서 Configure Integration - Bot Integration 을 설정해주고 토큰을 얻습니다. 이렇게 얻은 토큰을 settings.py 에 SLACK_TOKEN 변수 값으로 설정해주고 robot.py 를 실행하면 채널에 로그인 된 홍모아를 보실 수 있습니다.

앱 등록

apps 아래에 원하는 앱을 만들고 settings.py 에 등록만 해주면 바로 앱을 이용할 수 있습니다. 앱의 도움말 기능은 docstring 으로 처리됩니다. 예를 들어 아래와 같은 앱의 경우,

@on_command(['ㅈㅅㅌ', '점심팀', 'lunch'])

def run(robot, channel, tokens):
    '''오늘의 점심 팀을 알려드립니다. 예) !ㅈㅅㅌ 3 로지,샐리'''
    ...
    ...
    return result

앱에 대한 도움말을 요청하면 오늘의 점심 팀을 알려드립니다. 예) !ㅈㅅㅌ 3 로지,샐리 가 채널에 출력되게 됩니다.

브레인

처음엔 상태를 유지하거나 할 일이 없는 간단한 앱들을 만들었지만 점차 이전상태를 유지해야하는 복잡한 로직들도 요구되었습니다.

그 결과 홍모아도 휴봇의 Redis brain 플러그인과 같이 Redis를 통해 상태를 유지할 수 있는 Brain 앱을 기본적으로 제공하고 있습니다.

@on_command(['ㅈㅅㅌ', '점심팀', 'lunch'])

def run(robot, channel, tokens):
    '''오늘의 점심 팀을 알려드립니다. 예) !ㅈㅅㅌ 3 로지,샐리'''
    ...
    ...
    return result

정리하며

기존의 봇은 일부 파워유저들만이 만들 수 있는 전유물 이었습니다.

슬랙을 통해 누구든지 몇줄의 코드로 자신만의 봇을 만들 수 있게 되면서, 슬랙을 단순히 커뮤니케이션 도구가 아니라 모니터링 툴, 관리도구로 이용될 수 있게 되었습니다.

슬랙을 도입한 후 뭔가 더 생산적인 곳에 사용할 수 없을까를 고민하는 팀들에게 저희 홍모아 봇이 도움이 되길 바라며 글을 정리하겠습니다.