본문 바로가기
HANDS-ON PROJECTS/DEVOPS

[DEVOPS] Automated Slack Command by using AWS Lambda with Golang

by junthetechguy 2024. 6. 26.
 

TABLE OF CONTENTS

 

    1. How can I use Slack with AWS Lambda?

    Slack과 Lambda와 S3를 연계해서 Slack Command로 S3 image를 가져 오는 자동화를 구현해보자.

    Slack은 요즘 대다수의 기업에서 사용되는 메신저 서비스로 AWS와 굉장히 많이 호환이 되게 되는데 slack에서 /(slash) command와 thrid party service와 연결해서 수많은 솔루션을 구축할 수 있게 된다.

    가령, 실무에서 DataDoc의 Metric 정보를 slash command를 이용해서 최근 30분치의 데이터를 바로 볼 수 있도록 하는 solution 등을 구축하게 된다.

    아래는 오늘 진행하는 자동화 주제이다.

    Slack User가 /(keyword)를 입력하게 되면 Lambda에서는 이 keyword를 parsing해서 S3에서 image를 가져오게 되고 이 S3에서 전달한 image를 다시 Slack User에게 format에 맞춰서 response를 보내게 된다.

     

    아래는 여기서 사용될 서비스이다.

    진행 순서는 아래와 같다.

    Slack App 생성 후 이 Slack App에서 사용할 Bot Token 생성 → public S3를 만들어서 image upload → Lambda 코드 작성 및 배포 → slack에서 원하는 image가 제대로 나오는지 테스트 → 추가 기능 구현한다.

     

    2. Automating Slack Command

    일단 api.slack.com에 들어가서 내가 사용할 slack workspace를 customize하면서 app을 생성해주자.

    그 후 Bots이란 메뉴에 들어가서 이 app이 봇으로 동작을 할건데 어디 범위까지 허용할건지에 대한 Scope를 지정해주자. 이때는 Bot Token Scope를 이용해서 이 Bot Token이 어느 정도의 Scope까지 허용할건지를 결정해줘야 한다. 나는 여기서 Chat:write 정도만 scope를 지정해준다. 그 후 내 Channel에 app을 install하는 것을 선택해주게 되면 이제 Token이 발급이 되게 되는데 이 Token은 나의 Source code에서 적용한다.

     

    이후 S3에 접속을 해서 내 image에 접속할 수 있는 S3(S3는 언제나 Globaly unique한 이름을 가져야함)를 Public으로 만들어 준 후 이 bucket의 Bucket policy 부분에 Statement를 추가해서 S3:GetObject하는 부분을 내가 만든 S3 bucket resource만 해당되도록 설정해주자. 이제 image를 upload하게 되면 object url이 나오게 되는데 이 object url을 입력하면 바로 해당 이미지를 볼수 있게 된다.

     

    이제 소스코드를 작성해주자. serverless.yml에는 binary file을 handler로 잡고 있고,

    main.go에는 이 handler 함수를 동작시키게 된다. 그리고 이 handler는 post method 형태의 request로 들어온 body를 parshing하여(slack에서는 slash command로 들어온 keyword를 request body에 넣어주므로) image에 대한 key value를 뽑아낸 후 AWS session을 하나 뽑아낸 후 내가 받아뒀던 bot token을 넣어준 후 이 token을 이용해서 S3 버킷의 URL에서 가져온 이미지를 slack channel id로 메시지를 보내게 된다.

     

    주의점 : 본래 bot token을 입력하는 부분은 secret value이므로 hard coding되면 안되고 반드시 aws에 있는 parameter store 라는 secret value를 보관하는 곳에서 가져와야 하므로 그걸 위해서 aws session을 따로 만들어 줘야만 하는 것이다.

    serverless.yml 같은 부분은 public한 image를 가져오는 것이므로 iam role을 provider에 넣을 필요는 없고, slash command가 동작했을 때 post http method로 동작할 수 있도록 하는 부분을 넣어주자.

     

    또한 이 소스 코드에는 .jpg만 출력이 되도록 해있는데 이 부분 같은 경우도 좀 더 logic을 다양하게 구현하기 위해 확장자를 정상적으로 체크하는 부분도 만들어주는게 더 낫다고 한다.

     

    이후 go mod tidy를 해준 후 make deploy를 통해서 aws에 배포를 해주자. 배포가 완료되면 api gateway에 post method가 mapping된 endpoint url이 나오게 되므로 이 endpoint를 다시 slack api 홈페이지에서 slash Commands를 만드는 부분에 create new command를 눌러서 RequestURL을 post method가 mapping된 api gateway endpoint url을 지정해주면 된다. 이때 Slack Command는 /img로 해주도록 하자. 그리고 Usage Hint 부분은 parshing하는 부분에 들어갈 keyword를 적어주면 된다.

    이제 slack에 대한 설정이 모두 끝났다.

     

    이제 AWS lambda console로 들어가보면 api gateway와 lambda가 정상 실행적으로 생성된 것을 볼 수 있다.

     

    이제 slack에서 /img (keyword)를 입력하면 (keyword)를 parshing해서 S3에서 정상적으로 가져오는 것을 볼 수 있고 CloudWatch에서 해당 lambda의 log를 보면 log도 정상적으로 찍히게 되는 것을 볼 수 있다.

     

    실제로 회사에서 자주 AWS User를 만들때 이런 식으로 slack + lambda의 조합으로 자동화해서 간단하게 생성하게 된다.

     

    [Reference]

    1. https://tallyfy.com/slack-bot/

     

    How to Make a Slack Bot using Slack API (8 Simple Steps)

    Over the last few years, Slack has skyrocketed to become one of the most widely-used business platforms around. The company’s commitment to creating minimalist, yet useful software has won over business people worldwide. Slack has offered a number of way

    tallyfy.com

    2. https://medium.com/schibsted-engineering/slack-bot-with-serverless-framework-e96fcdbd83a0

     

    Slack bot with Serverless Framework

    The basics of Slack bots with Serverless and hooking it up to PagerDuty oncall schedules

    medium.com