Dev

Slack 프록시 서버 – slackboard 소개

May 1, 2018

Slack 프록시 서버 – slackboard 소개

슬랙(Slack)을 자주 사용하다 보면 여러가지 연동을 하게 됩니다. 서버나 특정 상태에 따라 슬랙에 메시지를 보내는데요. 연동도 쉬워서 사용 할수록 더 많은 연동을 하게 됩니다.

이번에 소개하려는 slackboard는 슬랙에 메시지를 전송할때 아쉬운 부분을 해결해주는 기능을 가지고 있습니다. slackboard의 주요기능은 다음과 같습니다.

  • 커맨드 라인에서 쉽게 메시지 전송
  • 쉘 스크립트가 비정상적으로 종료됬을때 슬랙 메시지 전송
  • 태그 이름만으로 미리 지정한 채널이름, 사용자 이름, 이모지 설정
  • QPS 제어 기능

이중 slackboard를 꼭 써야하는 이유중 하나는 마지막의 QPS 제어 기능입니다. 일반적으로 사용하는 슬랙의 Incoming webhooks의 경우 초당 1건의 메시지로 제한되어 있어서 1초에 메시지를 여러개 전송하면 일부 메시지가 유실될 수 있는데 slackboard의 QPS 제어 기능을 이용하면 메시지가 유실되지 않게 분산해서 전송합니다.

유튜브 영상으로도 촬영 했으니 참고하세요.

그외 장점 및 사용헤 대해서도 하나씩 알아 보기 전에 설치 방법을 알아 보겠습니다.

서버 설치

slackboard는 프록시 서버를 설치해야 하는데요. golang으로 작성되어 있어 사전에 go 언어를 빌드 할 수 있도록 준비해야합니다. go 언어가 설치 됬다면 아래 명령어로 slackboard 를 설치합니다.

$ go get -u github.com/cubicdaiya/slackboard/...

프록시 서버 설정을 위해 환경설정 파일(config.toml)을 생성하고 수정합니다.

[core]
port = "60000"
slack_url = "https://hooks.slack.com/services/XXX/YYY"
qps = 1
max_delay_duration = 5

[log]
access_log = "stdout"
error_log = "stderr"
level = "error"

[[tags]]
tag = "dalguji"
channel = "#general"
username = "seapy"
icon_emoji = ":smile:"
parse = "full"

[[tags]]
tag = "fail"
channel = "#dalguji"
username = "seapy"
icon_emoji = ":warning:"
parse = "full"

slack_url에는 본인의 슬랙 설정에서 얻은 Incoming webhooks 주소를 입력합니다.

[[tag]] 로 시작하는 섹션은 태그를 지정하는 것으로 해당 태그 이름으로 요청이 들어오면 미리 지정된 채널이름, 사용자 이름, 사용자 이모지, 파싱모드를 적용하는것입니다. 태그를 지정해두면 메시지를 보낼때마다 채널과 사용자 이름등을 전달하지 않아도 됩니다.

서버 시작 및 기본 예제 테스트

slackboard 서버 시작 명령어는 다음과 같습니다. 간단하죠

$ slackboard -c config.toml &

실제 운영시에는 systemd 같은 서비스에 등록해두고 사용하면 좋습니다.

테스트 메시지를 보내기 위해 아래 명령어를 사용합니다.

$ echo 'Hi dalguji coding' | slackboard-cli -t dalguji -s localhost:60000

echo 명령어를 이용해 stdout 으로 메시지를 전송했고 slackboard-cli 명령어는 stdout으로 받은 메시지를 dalguji 태그와 함께 localhost:60000 서버로 전송합니다.

메시지를 전송하기만 하는 클라이언트 입장에서는 슬랙의 Incoming webhooks 주소를 이용해 curl 로 보낼수도 있지만 slackboard 설치하고 서버 주소만 알면 간단하게 전송 할 수 있게됩니다.

커맨드가 정상적으로 종료되지 않을 경우 알림

제가 slackboard를 사용하는 이유중 하나인 명령어가 비정상적으로 종료 되었을때 슬랙으로 에러 메시지를 알려주는 기능을 살펴 보겠습니다.

아래 명령어를 실행하면 some-command라는 명령어를 알 수 없다고 하면서 에러가 발생할겁니다.

$ slackboard-log -s localhost:60000 -t fail -- some-command

하지만 에러가 발생하면 localhost:60000 서버의 fail 태그로 어떤 이유로 명령어가 실패 했는지 전송하고 프록시 서버는 이를 슬랙으로 전송합니다.

저는 주로 쉘 스크립트를 정기적으로 실행하는데 실패하면 알림을 받고 싶을때 사용하는데요. 우선 아래와 같은 쉘 스크립트 파일(dalguji.sh)을 하나 만들어 둡니다.

#!/bin/sh
echo "dalguji script"

에러가 발생하지 않을 정상 스크립트 입니다. 이 스크립트가 정상 실행되는지 보겠습니다.

$ slackboard-log -s localhost:60000 -t fail -- dalguji.sh

정상 실행될때는 슬랙에 메시지도 안오고 그냥 echo 만 실행됩니다. 스크립트를 조금 변경해서 에러가 발생하도록 해보겠습니다.

#!/bin/sh
eeeeecho dalguji script

$ slackboard-log -s localhost:60000 -t fail -- dalguji.sh

다시 실행해보면 에러가 발생하고 에러 내역이 슬랙에 표시됩니다.

이러한 작업은 쉘 스크립트만으로도 할 수 있겠지만 이를 구현하려면 내가 만든 쉘 스크립트나 명령어를 감싸서 실패를 체크하고 슬랙으로 전송하는 스크립트를 직접 만들어야 됩니다. 하지만 slackboard는 간단한 설치와 설정으로 쉽게 사용할 수 있습니다.

성공했을때도 보내고… 실패 했을때도 보내고 싶다면?

마지막으로 쉘 스크립트가 성공이나 실패 했을때 모두 결과를 slack으로 전송하고 싶다면 아래와 같은 방법을 사용합니다.

$ dalguji.sh 2>&1 | slackboard-cli -s localhost:60000 -c dalguji

스크립트 실행중 발생한 stderr 출력을 stdout으로 리다이렉트 하고 해당 메시지를 슬랙으로 전송하는 방법입니다.

참고자료

게시글의 아마존, iTunes 링크들을 통해 구매를 하시면 제휴(Affiliate) 프로그램에 의해 저에게 일정 금액이 적립될 수 있습니다. ^_____^