Slack을 통해 업무를 보시는 분들을 위한 업무 자동화 도구 Slack API입니다.
Slack API를 이용하면 여러 채널을 개설하여 서버 관리 자동화 구현이 가능합니다.
여러분의 입맛대로 기능 구현을 할 수 있도록 슬랙 <-> 개인 서버로 요청 주고받는 방법에 대한 설명을 적겠습니다.
서버 -> 슬랙으로 메세지 보내기 (WebHook을 통해 슬랙 채널에 알림 보내기)
- 웹훅을 이용하면 '슬랙 채널에 알림 보내기'가 가능합니다.
- 슬랙 채널에 알림을 보내면 채널에 있는 모든 사용자가 해당 메세지를 읽을 수 있습니다.
https://popcorn-overflow.tistory.com/13
- Slack API를 직접적으로 사용하지 않더라도 Slack에서 WebHook 앱을 추가하는 것만으로도 구현할 수 있습니다.
- 물론 Slack API에서도 WebHook을 설정 가능합니다. (해당 게시물에선 기술하지 않음)
- 위의 주소에 자세히 적어두었으므로 이것이 궁금하다면 위 방법을 따라하시면 됩니다. (에러로그 뿐 아니라 다양한 메세지 전송 가능)
슬랙 -> 서버로 요청 보내기 (Slack API를 통해 요청 보내기)
- 슬랙이 프론트가 되어 슬랙 <-> 백엔드로 요청 응답을 주고받는 방법입니다.
- 해당 게시글에선 관련 자료가 많고 구현이 쉬운 플라스크를 이용합니다.
기존 서버와 독립적으로 슬랙 봇 서버를 이용하여, 슬랙 -> 플라스크 서버 -> 내가 원하는 서버로 요청을 전달합니다.
1. Slack API에서 Application 생성
Slack API 페이지 -> 우측 상단 Your Apps
초록색 Create New App 클릭
From scratch 선택
App Name 입력 및 앱을 사용할 워크스페이스를 선택합니다.
*이후 워크스페이스 변경 불가함에 주의합니다.
2. 워크스페이스에 앱 설치
좌측 Install App 선택 후 Install to Workspace를 해야 합니다.
현재 permission scope를 설정하지 않아 설치 불가능한 상태이므로, 권한을 설정해줍니다.
(파란색 permission scope 클릭)
하단으로 내리면 Scope 설정이 있습니다.
Bot Token Scope
- 해당 게시글에선 슬래쉬 커맨드와 멘션 기능을 활성화하기 위해 두개를 선택합니다.
User Token Scopes
- 해당 게시글에선 admin 권한을 선택합니다.
다시 돌아가서 Install App -> Install to Workspace를 선택하면 다음과 같은 메세지가 나옵니다:
(오류 메세지가 친절하진 않습니다)
아직 봇의 이름을 지정하지 않아서 그렇습니다.
좌측 App Home 클릭
여기서 App Display Name과 Default Username(임의)을 입력합니다.
입력이 된 걸 확인한 후 다시 Install App -> Install to Workspace -> Allow
그럼 이렇게 토큰 정보를 얻습니다.
슬랙에도 정상적으로 봇이 설치되었음을 확인합니다.
3. Event Subscription
좌측에서 Basic Information을 클릭후 Add features and functionality 드랍다운 펼치기
Event Subscriptions를 클릭합니다.
Enable Events를 On으로 바꾸고 Request URL에 Flask 서버의 URL을 입력할 것입니다.
슬랙 -> 서버로 연결이 되는지 확인하는 절차입니다.
POST method로 challenge 코드를 보내면, Request URL에 있는 서버에서 해당 challenge 코드를 다시 슬랙으로 응답해주면 됩니다.
현재 Flask 서버가 없습니다. 서버를 만들도록 하겠습니다.
4. Flask 서버 제작
파이참 -> 새 프로젝트 -> 좌측에서 Flask 선택
app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world(): # put application's code here
return 'Hello World!'
if __name__ == '__main__':
app.run()
처음 프로젝트를 생성하면 다음과 같이 되어있습니다.
빠르게 Event Subscription을 위한 코드를 작성합시다.
app.py
import json
from flask import Flask, request, make_response
app = Flask(__name__)
@app.route('/', methods=['POST'])
def hello_world():
slack_event = json.loads(request.data)
if "challenge" in slack_event:
return make_response(slack_event["challenge"], 200, {"content_type": "application/json"})
return make_response("There are no slack request events", 404, {"X-Slack-No-Retry": 1})
if __name__ == '__main__':
app.run()
1. 요청으로 오는 json을 slack_event로 받습니다.
2. json에 challenge가 있으면 challenge 내용을 json으로 담아 응답합니다.
5. Flask 서버 배포 (ngrok)
먼저 작성한 flask 서버를 실행합니다.
>> flask run -p 5002
그 후 ngork을 이용해 온라인에서 로컬로 접근할 수 있도록 주소를 받습니다.
터미널 열기 -> (없으면 ngrok 설치)
ngrok 설치 후 포트 5002에서 실행합니다.
(MAC OS의 경우 포트 5000번을 사용할 수 없기 때문에 5002번 사용)
>> ngork http 5002
Forwarding의 주소 (https://605f-223-194-67-122.ngrok-free.app) 를 Enable Events -> Request URL에 입력합니다.
Verfied가 된 것을 확인합니다.
현재 슬랙 Application 생성, 워크스페이스에 등록, Flask 서버와 슬랙의 연결 확인까지 마쳤습니다.
그럼 이제 Event 트리거 설정을 하겠습니다.
Event 트리거는 여러 종류가 있습니다.
Slash Command, App mention, Interactivity & Shortcut 등의 방법이 있습니다.
해당 게시글에선 슬래쉬 커맨드 방법을 설명하겠습니다.
6. 슬래쉬 커맨드 등록
좌측 Slash Commands -> Create New Command 클릭
원래 모든 것은 Hello World부터 시작합니다. 다음과 같이 작성합니다.
Request URL은 ngrok URL + /hello로 작성하겠습니다.
(ex: https://605f-223-194-67-122.ngrok-free.app/hello)
생성 후 /안녕 커맨드를 슬랙에서 사용해봅니다.
(당연히) 에러를 던집니다.
왜냐면 저희 플라스크 서버에서 /hello에 대한 컨트롤러가 없기 때문입니다.
@app.route('/hello', methods=['POST'])
def hello():
return make_response("안녕 친구야", 200, {"content_type": "application/json"})
컨트롤러를 만들고 flask 서버를 재실행 후 다시 명령어를 입력합니다.
제대로 응답이 옵니다.
현재까지 기본적은 슬랙 -> 서버 요청 방법에 대해 살펴보았습니다.
다음 가이드에선 슬랙에서 보내는 요청만 허가하도록 인증/인가 처리를 하겠습니다. (외부 요청 차단)
'Server' 카테고리의 다른 글
Github Actions: ssh-aciton IPv6 지원 (1) | 2024.03.17 |
---|---|
[Terraform] state locking을 위한 s3, ddb 설정하기 (0) | 2024.02.23 |
[서버] Github Actions: 다양한 명령 내리기 (0) | 2023.11.29 |
[Docker, AWS, Spring] docker-compose시 환경변수 전달하고 스프링부트 application.yaml에서 사용하기 (3) | 2023.10.06 |
[Slack API] 슬랙 API를 통한 요청 가이드 - 외부 요청 차단 (2) (0) | 2023.08.17 |