[ 사이드 프로젝트 ] Lambda를 이용한 Slack Bot 만들기

AWS Lambda 와 Slack API 를 이용하여 sms 인증 봇을 만들어 보자.

왜 만들게 되었나?

부서 내에서 테스트를 위한 계정을 공유하는데, 최근들어 새로운 기기에 로그인할 때는 sms 를 이용한 2fa 인증이 필수가 되었다.
부서에서 테스트 계정 인증을 위해 테스트 usim 이 설치된 테스트폰을 가지고 있었는데, 테스트 계정에 로그인을 할 때마다 테스트폰을 가지고 있는 사람에게 2fa 인증 번호를 물어봐야 했고, 또 담당자가 자리에 없을 때에는 로그인 하지 못하는 불편한 상황이 생겼다. ( 사실 테스트폰 담당자가 나였는데, 팀원들이 매번 물어 보는게 귀찮았다 😭 )
해당 업무를 자동화 할 순 없을까 고민하다 이번 기회에 slack bot 을 만들어 보기로 하였다.

구조 설계하기

먼저 필요한 준비물을 생각해 보자.

  1. 인증용 sms 번호를 가지고 있는 테스트폰
  2. 문자가 왔을 때 특정 http request 로 전송해 줄 수 있는 앱
  3. http request 로 문자의 내용을 전송받아 원하는 형태로 텍스트 가공을 해주는 서버
  4. web hook 으로 http request 를 받으면 slack channel 에 뿌려줄 수 있는 slack bot

이미 인증용 usim 과 테스트 폰은 가지고 있었으니, 2,3,4 번 준비물만 준비하면 된다.
문자가 왔을 때 http reqeust 로 포워딩 해주는 앱은 분명히 있을 것 같아 찾아보니, 원스토어에 “문자자동전달” 이라는 앱이 있어서 해당 앱을 이용하기로 했다.
가끔씩만 호출되는 인증문자의 특성을 생각했을때, 텍스트 가공용 서버는 AWS Lambda 가 찰떡이였다.

따라서 최종 구조는 아래의 그림과 같다. structure-diagram

Slack API 를 이용하여 Slack bot 만들기

Slack Bot 은 Slack API 웹페이지에서 만들 수 있고, Slack Bot 에 대한 한글 설명은 여기서 볼 수 있다.
Slack API 사이트에 들어가 Your Apps -> Create an App 을 누르면 새 앱을 만들 수 있다.
bot 의 이름은 적당히 설정해 주고, 새로운 app 을 만들어 설치할 workspace 를 설정하면 된다.

create-app

생성이 완료되면, Basic Information 에서 Bot 의 설정을 할 수 있는데, 여기서 Incoming Web Hook 을 설정해주면, Bot 으로 메세지를 전달 해 줄 수 있는 url을 얻을 수 있다.

configure

해당 url 을 테스트 할 수 있는 curl 명령어도 나와 있으니, 생성 후 바로 테스트를 해볼 수 있다.

curl-test테스트 해볼 수 있는 curl 명령어

test-resulthello world!

문자 포워딩 앱 설치하기

Slack 봇이 생성되었으니 문자를 http request 로 전송해줄 수 있는 앱을 설정하여야 한다.
해당 기능을 하는 앱은 여러 가지가 있겠지만, 나는 one store 에 있는 ( play store 에는 없는 듯 하다 ) “문자자동전달” 을 이용하기로 했다.
해당 엡에는 문자를 “조건 - 특정 문자열 포함 여부” 을 만족하는 문자의 내용을 여러 방식 - 문자 / http request / slack app / 잔디 .. etc 를 이용하여 포워딩 할 수 있어 선택하였다.

해당 앱을 실행하면, “문자 전달” 탭을 이용하여 문자 포워딩 룰을 만들 수 있다. app-main

새로운 설정을 추가하면, 문자를 포워딩할 출력 대상인 “전달 번호” 와 문자를 전달할 기준인 “검출 기준” 을 설정해야 하는데, 먼저 전달 번호에서는 restapi 주소 입력을 선택한다.
slack webhook 을 선택하지 않는 이유는 web hook 으로 바로 쏘아 버리면 내가 출력 형식을 정하지 못하고 앱에서 쏘는 raw text 가 바로 슬랙창에 출력되어 버리기 때문에 중간에 텍스트 처리를 위해 lambda 를 넣을 것이기 때문이다.

여기서 rest api 주소는 이후 만들 lambda 의 api gateway url 을 적어 주면 된다.

export-number

“검출 기준” 에서는 문자 내용에 특정 문자열이 들어있는지를 and / or 기준으로 선택할 수 있으며, 문자내용에서 검출을 원하는 문자열을 작성해 주면 된다. 나는 삼성계정 테스트용 이기 때문에 “삼성 계정” 을 or 조건으로 입력하였다. criteria

텍스트 포매팅 용 Lambda 설정하기

문자 앱에서 http request 로 쏘아준 문자의 내용을 원하는 형태로 포매팅 하여 slack bot 으로 쏘아 주기 위한 lambda 를 만들어 보자.
aws console 에서 lambda 로 들어간 뒤 create function 을 한다. 간단한 앱이기 때문에 python 으로 runtime 을 설정했다.

create-functio

이후 lambda 를 실행할 trigger 을 설정해 줘야 하는데, 나는 app 을 통해 문자를 http request 로 전송할 것이기 때문에, AWS API Gateway 를 trigger 으로 설정했다.

add-trigger

public-gatewayapp 에서 auth header 을 추가할 수 있는 기능이 없어 open 으로 설정하였다

urlapi gateway 설정에 들어가면 public url 을 알 수 있다

이제 기본적인 구성은 완료 되었다.
문자 앱에서 전송해 주는 http 요청의 포맷을 테스트 해 보고, 해당 문자열을 잘 처리하여 slack 에 쏴 주기만 하면 된다!

먼저 앱에서 전송해 주는 요청의 포맷부터 테스트 해 보자.

test-result테스트를 위하여 event 를 출력하는 함수를 만들었다

cloud-watchcloud watch 를 이용하여 lambda 의 로그를 볼 수 있다.

cloud watch 를 통해 출력된 event 의 포맷을 보면 아래와 같았다. 자세히 살펴보면 문자의 형태로 보이는 것이 없는데, 그 이유는 앱에서 문자를 base64 encoding 하여 올려주기 때문이다.
“isBase64Encoded” 가 true 인 것을 보면 알 수 있으며, 문자의 raw string 은 json 의 “body” field 에 있는 문자열을 base64 디코딩 하면 알 수 있다.
해당 문자열을 decode 하면 아래와 같은 텍스트를 얻을 수 있다. ( 개인정보는 가렸다.)

이제 진짜 거의 다 됐다!
decodeing 된 문자 정보에서 내가 원하는 정보만 꺼내 포매팅 하면 된다.
나는 account 인증 토큰이 숫자 6자리 이기 때문에, 문자를 split 하여 연속된 숫자 6자리이면 해당 내용을 포매팅 하여 출력 하기로 했다.
작성한 코드는 아래와 같다

완성!

이제 모든 준비가 완료되었다. 되는지 테스트만 해 보면 된다!
어카운트 인증요청 문자를 보내고, slack bot 이 channel 에 정상적으로 메세지를 전송하는지 살펴보자.

success잘 동작한다🙌

글을 마치며..

큰 기능을 하지는 않는 단순한 인증용 슬랙봇 이지만, 봇을 만들며 기술의 발전을 체감했다.
옛날이였으면 작은 서비스를 하기 위해서도 온프레미스로 서버를 24시간 띄워 놓아야 했겠지만, 지금은 단순한 클릭 몇번 만으로 scalable 한 서비스를 띄을 수 있다니!
게다가 가격도 저렴하다 - 인증문자는 자주 오지 않으니 lambda 비용은 거의 공짜와 다름없다

서비스 생태계가 점점 복잡해지며, 여러 상황에 알맞는 최신기술들이 많이 나오고 있다.
좋은 서비스들이 나오는 것은 좋지만, 너무 많은 서비스들에 의해 상황에 어떤 기술이 필요한지 알아보는 것도 점점 어려워 질 것 같다.
뒤쳐지지 않기 위해서 항상 새로운 기술에 관심을 가지고 공부해야 할 것 같다 👨‍💻

Discussion and feedback