동기

slack 알림에 '책 제작 신청하기'와 같은 버튼을 포함해서 사용자와 상호작용하고자 한다. 이를 위해서는 정보를 주고 받을 Request URL이 필요하기 때문에 AWS 서비스를 이용해서 REST API를 구축하고자 한다.

과정

다음 블로그 참고

[Slack API] Interactive Components with CURL, Python(AWS Lambda) - post message

  1. Slack 메시지 형식에 버튼을 만들어서 메시지를 보내보자.

    Slack의 interactive message를 이용하기 위해 먼저 앱의 OAuth & Permissions에서 Bot Token Scopes를 다음과 같이 변경한다. (변경 후 app reinstall 필요) Interactivity & Shortcuts에서 Interactivity를 On한다. (일단 Request URL 부분은 비워둔다.)

    Untitled

    그 다음 Slack Block Kit Builder에서 내가 원하는 메시지 형식을 만들고, 파이썬 코드에 붙여넣어 테스트 메시지를 보낸다. (참고로 Block Kit Builder로 만든 코드에 있는 true, false는 파이썬에 맞게 True, False로 바꿔줘야함.)

    Untitled

    import requests
    import json
    
    BOT_TOKEN = 'xoxb-*************-*************-************************'
    
    def post_message(token, channel_id, text):
        url = "<https://slack.com/api/chat.postMessage>"
        headers = {
            "Content-type": "application/json; charset=utf-8",
            "Authorization": "Bearer " + token
        }
        data = {
            "channel": channel_id,
            "blocks": [
                    {
                        "type": "section",
                        "text": {
                            "type": "mrkdwn",
                            "text": "This is a mrkdwn section block :ghost: *this is bold*, and ~this is crossed out~, and <https://google.com|this is a link>"
                        }
                    },
                    {
                        "type": "image",
                        "image_url": "<https://img4.daumcdn.net/thumb/R658x0.q70/?fname=https://t1.daumcdn.net/news/202105/25/notepet/20210525061014357ivhj.jpg>",
                        "alt_text": "고양이"
                    },
                    {
                        "type": "actions",
                        "elements": [
                            {
                                "type": "button",
                                "text": {
                                    "type": "plain_text",
                                    "text": "Click Me",
                                    "emoji": True
                                },
                                "value": "click_me_123",
                                "action_id": "actionId-0"
                            }
                        ]
                    }
                ]
        }
    
        response = requests.post(url, headers=headers, data=json.dumps(data))
        print(response)
        if response.json().get('ok'):
            print('메시지를 성공적으로 보냈습니다.\\n')
        else:
            print('메시지를 성공적으로 보내지 못했습니다. 오류메시지 : ' + str(response.json()))
    
    if __name__ == "__main__":
        post_message(BOT_TOKEN, '#봇-테스트')
    

    Untitled

    메시지는 잘 왔지만 버튼을 클릭하면 그림과 같은 경고가 뜬다. 앞서 앱의 Interactivity를 설정할 때 Request URL을 설정해 주지 않았기 때문에 당연한 결과이다.

  2. 버튼을 클릭하면 Slack이 Request URL로 HTTP POST 요청을 보낸다. 이번에는 AWS Lambda와 API Gateway로 REST API를 구축해서 Request URL을 설정하고 Slack에서 보낸 요청을 처리해 보도록 하자.

    전체적인 동작 개요

    전체적인 동작 개요

    먼저 Lambda 함수를 생성해주자. 이름은 response-from-slack으로 했다. (lambda_function에 print(json.dumps(event) 추가)

    Untitled

    Untitled

    이번에는 AWS의 API Gateway > API 유형 선택 : REST API를 구축을 누르고 API를 생성한다.

    Untitled

    작업 > 리소스 생성으로 새 하위 리소스를 생성한다. 그후 작업 > 메소드 생성으로 POST 메소드 설정 (통합유형 : Lambda 함수)

    Untitled

    Untitled

    통합 요청 > 매핑 템플릿에서 API Gateway가 Lambda에게 전달할 값의 형식을 정의한다. (Slack api - Handling interaction payloads) (API Gateway 매핑 템플릿)

    Untitled

    저장하고 작업 > API 배포하면 URL이 생성된다.

    Untitled

    Untitled

    이제 Slack의 Request URL에 'URL+/리소스 이름'을 넣는다. 앞서 리소스 이름을 button-click이라고 지었으므로 다음과 같이 넣고 Save Changes으로 저장.

    Untitled

    1번에서 보냈던 메시지의 버튼을 다시 눌러보면 경고가 뜨지 않는다. Lambda가 실제로 잘 실행되었는지 보기 위해 AWS CloudWatch 콘솔에서 response-from-slack의 로그를 보면 json 데이터가 잘 들어온 것을 볼 수 있다!

    Untitled

    Untitled

아쉬운 점 및 해결방안

이제 다음에는 lambda_function의 코드를 수정해서 버튼을 눌렀을 때 내가 원하는 동작을 수행하도록 만들면 될 것 같다.

관련 활동 바로가기

  1. 웹페이지 알림 카카오톡으로 보내기 [2021-07-12]
  2. Slack을 이용해 웹페이지 알림 보내기 [2021-07-23~2021-07-24]
  3. Selenium을 이용해 동적인 웹크롤러 만들기 [2021-08-08]
  4. Slack interactive message를 위한 AWS로 REST API 구축 [2021-08-12]
  5. AWS Lambda에 원하는 동작 구현 [2021-08-15~2021-08-16] 👈 NEXT
  6. 알림 프로젝트 코드 서버에 올려서 자동 실행 [2021-08-17~2021-08-19]