[AWS SAM] Slack API 슬랙 봇 서버리스로 마이그레이션 도전기 (1)
!!튜토리얼 아닙니다!!
기존에는 슬랙 봇 서버를 EC2 인스턴스로 띄워서 사용하였는데, 이제 서버리스로 옮기려고 한다.
그런데 그냥 하면 재미가 없으니, 서버리스 인프라 구축 툴인 AWS SAM을 사용하려고 한다.
왜 AWS SAM인가?
우선 외부 세미나에서 SAM에 관한 강연을 들은 바 있기도 했고, 물론 Serverless Framework도 좋다고 들었지만 많이 들어본 SAM으로 시작했다.
CloudFormation 문법을 모르는 상태에서 시작하려니 쉽진 않았다. ㅠ
내가 최종적으로 구현할 환경은 다음과 같다.
핵심은 Lambda Authorizer인데, Custom Authorizer를 둠으로써 Slack API로부터 오는 요청의 토큰을 Validate 할 예정이다.
인증된 요청은 핸들러로 넘겨지며, 핸들러는 External Resource, 즉 우리 메인 웹 서버로 요청을 주고받으며 반환값을 클라이언트에게 넘겨준다.
우선 template.yaml에 TestFunction을 등록했다.
POST /test로 보내면 lambda 함수가 실행된다.
권한 설정같은걸 다 SAM이 대신해줘서 저거만 해두면 API Gateway까지 설정된다는게 참 편하긴 하다.
(SAM의 추상화)
일단 아주 간단한 형태로 람다 핸들러를 작성했다.
이걸 왜 하냐 : 일단 슬랙 API로부터 오는 요청이 lambda_handler의 event로 넘어올 때 어떤 구조를 가지는지 확인하기 위함이었다.
sam build && sam local start-api
sam local start-api를 통해 내가 만든 함수를 도커를 이용해서 로컬로 띄워볼 수 있다.
클라우드에 직접 띄워가며 테스트하기엔 부담이 되므로 아주 좋은 기능이라고 말할 수 있겠다.
Slack API에서 직접 내 로컬로 요청을 보내야 하기 때문에 ngrok을 통해 퍼블릭 주소를 설정하였다.
print(event) 를 실행하였기 때문에 우측(sam 실행한 터미널)에 저런식으로 json이 넘어온 것을 확인할 수 있다.
그래서 제이슨뷰어로 요청을 분석한다.
'X-Slack-Signature' 가 핵심이다. 해당 시그니처 값과 signing-secret을 통해 validation을 진행 가능하다.
이미 사용하던 슬랙 봇 서버가 있으므로 API 하나를 해당 ngrok 주소로 바꿔서 보내본다.
'body'의 text에 같이 들어가는 메세지가 담겨있는걸 볼 수 있다. (아마 인코딩 문제로 저렇게 보이는 것 같다)
그럼 이제 구현을 하면 된다.
솔직히 말하면 아직 SAM이 너무 좋다 이런건 못느끼겠다.
GUI 사용하면 뚝딱 만들 수 있는걸 왜 오류를 만들어가며 사서 고생하고 있는지.. 모르겠지만,
람다 함수가 수십, 수백개로 늘어난다면 SAM으로 관리하는 것이 굉장히 편리할 것이라고 생각해서 배우고있다.
처음에 HttpApi를 쓰고 싶었다. (가격이 저렴하고 빠르다고 한다)
근데 HttpApi는 Authorizer 설정이 어려운 것 같더라.
도큐멘트 보면서 설정하기 위해 이것저것 추가해봤는데 결국 시원찮았고, 결정적으로 AWS콘솔에도 Authorizer 생성 버튼 자체가 없더라.
이런거 설정하라는 도큐멘트 보고 deploy까지 성공하긴 했었는데, 콘솔에 안보여서 그냥 포기하고 RestAPI로 구현했다.
그래가지고 일단 내부 함수 구현은 안했지만 요청 흐름이 진행되도록 설정까진 마쳤다.
내부 구현은 다음에 하도록 하겠다.
느낀점..
SAM에 관한 자료가 너무 없다.
중간에 Step Function, State Machine을 공부해봤다. 결국 내 구조에 필요가 없는 것 같아서 하다 말았지만.. 컨셉 자체가 굉장히 유용하기도 하고 이후에 자주 쓰이게 되지 않을까 싶다.
개인적으로 Eric Johnson 님의 강의 영상이 도움이 많이 되었다. (비교적 최근 자료이기도 하다)
SAM deep dive 강의 있으면 추천해주시면 감사하겠습니다..!!
열심히 배우고 구현 마치고 소스 공개 하겠습니다.