AWS Lambda로 Slack message bot 만들기

슬랙의 유용한 기능 중 하나가 WebHook을 통해 다양한 기능을 확장할 수 있다는 건데요. 저는 회사 인근 밥집을 랜덤으로 3곳 추천해주는 eat-bot을 만들어 #밥집, #점심, #저녁 등의 키워드를 채팅방에 입력하면 eat-bot이 메뉴를 추천하도록 하는 message bot을 제작해 보았습니다!

준비물

  • AWS 계정
  • Slack 계정

1. Slack Incoming WebHooks 추가

제일 먼저, 슬랙에 Incoming WebHooks를 추가합니다. 어떤 채널에 메세지를 보낼것인지 선택합니다. Channel이 아니라 DM에도 추가 가능합니다. 채널은 수정가능합니다. 일단저는 #eat채널에 webhook을 등록하였습니다. 이어서 봇의 이름과 이미지를 설정합니다.

여기서 제일 중요한건 webhook url입니다. 이 url로 지정된 양식의 json 값을 보내주면, 그 값을 예쁜 채팅 메세지로 뿌려주게됩니다.

2. AWS Lambda 함수 생성하기

AWS Lambda(https://aws.amazon.com/ko/lambda/)의 함수를 하나 먼저 생성합니다.

생성한 함수 설정페이지에 들어가면, 선택했던 언어로 코드를 입력할 수 있는 부분이 있습니다. 초기에는 200의 statusCode를 리턴하는 간단한 코드로 되어있습니다.

3. Lambda Code 추가

먼저 회사 인근 맛집을 listup 해둔 json 파일을 lambda에 추가합니다.

data.json (실제 데이터는 훨씬 많지만 해당 글에는 2개만 추가했습니다)

[
{
"title": "낭풍",
"menu": "김치찌개, 김치찜, 계란말이",
"description": "한국인이라면 주기적으로 먹어줘야 한다는 메뉴. 김치찌개!",
"url": "http://naver.me/xjfghCu7"
},
{
"title": "최대포",
"menu": "곤드레 나물 정식",
"description": "★곤데렐라★ 반찬보다 밥이더 맛있는 곤드레나물밥. 고기집인데 고기는 아무도 먹지 않는다",
"url": ""
}
]

data.json파일에서 random으로 3개의 data를 가져와서 slack incoming webhook url에 post 요청을 보내는 코드입니다.

lambda_function.py
# -*- coding: utf-8 -*- 
import json, random
import httplib
from botocore.vendored import requests
def lambda_handler(event, context):
slack_url = "{YOUR_SLACK_INCOMING_WEBHOOK_URL}"

eat_list = getRandomDatas()
fields = []

for data in eat_list:
tmp_title = data['title']
if data['url'] != "":
tmp_title += "<{}>".format(data['url'])
fields.append({
"title":tmp_title,
"value":"{}\n{}\n".format(data['menu'], data['description']),
"short":False
})
title = "안녕. 나는 EAT-BOT이야. 메뉴를 추천해줄께!"
payloads = {
"attachments":[{
"pretext": title,
"color":"#0099A6",
"fields": fields
}]
}
response = requests.post(
slack_url, data=json.dumps(payloads),
headers={'Content-Type': 'application/json'}
)
if response.status_code != 200:
raise ValueError(
'Request to slack returned an error %s, the response is:\n%s'
% (response.status_code, response.text)
)
def getRandomDatas():
json_data=open('data.json').read()
datas = json.loads(json_data)
random.shuffle(datas)
tmp = random.sample(datas, 3)
return tmp

해당 lambda가 잘 동작하는지 확인하고 싶다면, 람다 설정페이지 우측 상단에 위치한 테스트 버튼을 눌러 원하는 채널에 원하는 모양으로 데이터가 전달되는지 확인해볼 수 있습니다

테스트를 했을때 메세지가 도착했나요? 이제 거의 다 만들었습니다! 이제 slack에 봇인척 하면서 테스트 버튼을 누르면 매번 메세지가 전달됩니다!

4. API GateWay 추가

Lambda는 그 자체로 어떠한 url 값을 갖지도 않습니다. 따라서 API GateWay라는 것을 사용해서 lamdba를 호출하는 url을 부여합니다.

람다 설정 페이지 상단에서 API 게이트웨이를 추가해줍니다. 이렇게 추가해준 API Gateway는 API 엔드포인트 를 갖는데요. 이제 드디어 해당 url을 통해 lambda의 함수를 수행할 수 있게 되었습니다!! lambda의 함수를 동작시키는 api url을 만든 겁니다:)

5. Slack OutGoing Webhooks 추가

마지막으로, 유저가 채널에서 특정 키워드를 입력하면 해당 api gateway endpoint를 호출하도록 하기 위해 Slack OutGoing Webhooks을 추가하면됩니다!

완성!

이제 채널에서 TriggerWord로 추가해둔 단어들을 입력하면 해당 api gateway endpoint를 호출하게 되었습니다!

6. Cloud Watch 추가(옵션)

Cloud Watch(https://aws.amazon.com/ko/cloudwatch/)는 일정한 주기마다 슬랙에 메세지를 자동으로 전송하도록 하고 싶은 경우 추가하면 됩니다.

제가 만든 eat-bot의 경우 월-금 12시 정오마다 메세지를 보내도록 하기 위해서 cloud watch를 추가했는데요. 간단한 cron식을 작성하기만 하면, cloud watch가 해당 lambda를 호출합니다.

누구나 lambda로 간단한 slack bot을 구현해서 재밌는 것들을 많이 구현 할 수 있습니다 :)