이 글에서는 AWS Api Gateway와 Lambda를 사용하여 Slack에 Interactive Message를 post하고 버튼을 클릭했을 때 요청을 처리하는 간단한 예제를 만들어 본다.
먼저 Slack API를 사용하기 위해 Slack API에 접속해서 로그인을 한 후 Your apps
로 들어가 새 APP을 생성한다.
Interactive Components
를 만들 예정이니 한 번 들어가 본다.
Interactivity를 On
하면 Request URL
칸이 나온다.
일단 Request URL
은 비워두고 나중에 채워 넣기로 하자.
다음으로 OAuth & Permissions 탭으로 들어가서 Scopes에 Bot Token Scopes를 다음과 같이 추가해 준다.
Install to Workspace
를 해주면 아래처럼 Bot User OAuth Token
이 발급 된다.
발급 받은 토큰으로 아래 명령어를 이용해서 간단하게 테스트 해보면 메시지가 잘 나오는 것을 알 수 있다.
$ curl -d '{"channel": "deploy-dev", "text":"test"}' \
-H "Content-type: application/json" \
-H "Authorization: Bearer <xoxb-로 시작하는 Bot User OAuth Token>" \
-X POST https://slack.com/api/chat.postMessage
{"ok":true,"channel":"C01M8S3ML82","ts":"1616565495.003900","message":{"bot_id":"B01S8MB35QB","type":"message","text":"test","user":"U01SM3S1VUH","ts":"1616565495.003900","team":"T01FNCJFLFM","bot_profile":{"id":"B01S8MB35QB","deleted":false,"name":"interactive-message","updated":1616565292,"app_id":"A01S1M3TWHL","icons":{"image_36":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_36.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/service_72.png"},"team_id":"T01FNCJFLFM"}},"warning":"missing_charset","response_metadata":{"warnings":["missing_charset"]}}%
Python 코드로 작성하면 다음과 같이 작성할 수 있다.
이 글에서는 AWS Lambda를 기준으로 코드를 작성했다.
# Import WebClient from Python SDK (github.com/slackapi/python-slack-sdk)
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
def lambda_handler(event, context):
client = WebClient(token='xoxb-로 시작하는 Bot User OAuth Token')
try:
result = client.chat_postMessage(
channel="deploy-dev",
text="test"
)
print(result)
except SlackApiError as e:
print(f"Error posting message: {e}")
이제 버튼을 이용해서 상호작용 할 수 있는 메시지를 만들어 보자.
Slack Block Kit Builder로 들어가면 메시지 템플릿을 쉽게 만들 수 있다.
마음에 드는 템플릿을 고르고 blocks의 값 부분을 복사해서 파이썬 코드에 다음과 같이 붙여넣어 준다. 여기서 true, false 값은 파이썬에 맞게 True, False로 바꿔줘야한다.
# Import WebClient from Python SDK (github.com/slackapi/python-slack-sdk)
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
def lambda_handler(event, context):
client = WebClient(token='xoxb-로 시작하는 Bot User OAuth Token')
try:
result = client.chat_postMessage(
channel="deploy-dev",
blocks=[
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "You have a new request:\n*<fakeLink.toEmployeeProfile.com|Fred Enriquez - New device request>*"
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Type:*\nComputer (laptop)"
},
{
"type": "mrkdwn",
"text": "*When:*\nSubmitted Aut 10"
},
{
"type": "mrkdwn",
"text": "*Last Update:*\nMar 10, 2015 (3 years, 5 months)"
},
{
"type": "mrkdwn",
"text": "*Reason:*\nAll vowel keys aren't working."
},
{
"type": "mrkdwn",
"text": "*Specs:*\n\"Cheetah Pro 15\" - Fast, really fast\""
}
]
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": {
"type": "plain_text",
"emoji": True,
"text": "Approve"
},
"style": "primary",
"value": "click_me_123"
},
{
"type": "button",
"text": {
"type": "plain_text",
"emoji": True,
"text": "Deny"
},
"style": "danger",
"value": "click_me_123"
}
]
}
]
)
print(result)
except SlackApiError as e:
print(f"Error posting message: {e}")
코드를 실행해보면 slack에 메시지가 성공적으로 post 된 것을 볼 수 있다.
하지만 Approve
나 Deny
버튼을 누르면 interactivity URL을 설정하라고 나온다.
이 때 필요한 것이 위에서 비워둔 Request URL
이다. 버튼을 클릭하면 Slack이 Request URL
로 HTTP POST 요청을 보낸다.
다음 글에서 API Gateway로 REST API를 구축해서 이 Request URL
을 채워넣고 Slack에서 보낸 요청을 처리해 보도록 하자.
많은 도움됐습니다: )