사용 기술
Slack API
Slack API를 사용하여 간단한 명령어, 예를 들어 /간식구매요청
과 같은 것들을 처리합니다. 이는 사용자가 Slack을 통해 쉽게 요청을 할 수 있게 해줍니다.
AWS Lambda
AWS Lambda는 이러한 Slack 명령어에 대한 반응을 처리하는 서버의 역할을 합니다. 우리는 많은 종류의 요청을 처리할 필요가 없기 때문에, 간단하고 효율적인 AWS Lambda를 선택했습니다.
AWS API Gateway
AWS ApiGateway는 Lambda와 연결되어, 사용자의 요청을 Lambda로 전달하는 역할을 합니다. 이를 통해 사용자의 요청을 쉽게 처리할 수 있습니다.
추가적으로, 구글 스프레드 시트를 조작하거나 웹에서 정보를 수집하기 위해 파이썬의 gspread 패키지와 bs4라는 도구를 사용했습니다.
자동화 하게 된 계기
기존 업무 프로세스는 그림과 같습니다.
위 워크플로의 단점은 요청자가 많아지면, 이를 모두 처리하기가 어려워집니다. 이 문제를 해결하기 위해 자동화 시스템을 도입하기로 결정했습니다.
간식 구매요청 자동화 아키텍쳐
사용자가 "/간식구매요청" 명령어를 입력하면, Slack API가 이를 감지하고 설정된 API 주소로 요청을 보냅니다. 이 주소는 API Gateway에 설정되어 있으며, Gateway는 이 요청을 받아 Lambda 함수를 실행시킵니다.
Lambda 함수는 요청을 처리하고 결과를 Slack으로 다시 보냅니다.
간식 구매요청 자동화 과정에서 만난 문제
- API Gateway로 사용자가 요청한
/간식구매요청
에 해당하는 커맨드값을 가져오는 과정에서, 요청 데이터를 제대로 처리하지 못하는 문제가 발생.
문제 파악
Slack Slash Command 공식문서를 살펴보니 다음과 같은 내용이 있었습니다.
token=gIkuvaNzQIHg97ATvDxqgjtO
&team_id=T0001
&team_domain=example
&enterprise_id=E0001
&enterprise_name=Globular%20Construct%20Inc
&channel_id=C2147483705
&channel_name=test
&user_id=U2147483697
&user_name=Steve
&command=/weather
&text=94070
&response_url=https://hooks.slack.com/commands/1234/5678
&trigger_id=13345224609.738474920.8088930838d88f008e0
&api_app_id=A123456
This data will be sent with a Content-type
header set as application/x-www-form-urlencoded
.
/간식구매요청 명령어로 요청을 보내면 해당 요청을 처리하는 URL로 위와 같은 x-www-form-urlencoded형식의 form data형식이 보내지게 됩니다.
이 데이터 형식을 API Gateway에서 Lambda로 처리할 때, 매핑 템플릿 이라는 걸 설정해줘야 합니다
_매핑 템플릿_이란 Velocity Template Language(VTL)로 표현된 스크립트로, JSONPath를 사용하여 페이로드에 적용됩니다.
매핑 템플릿을 설정해주게 되면 원하는 데이터를
def lambda_handler(event,context):
#TODO implement
option = event['text']
command = event['command']
response_url = event['response_url']
위와 같은 식으로 사용할 수 있습니다.
- Slack Command의 짧은 응답 시간제한으로 인한 "operation_timeout"이 발생하는 문제
위 그림은 기존에 구현했던 워크플로우 입니다. 문제점은 슬랙에서는 요청을 보낸 후 3초 이내에 응답을 보내주지 않으면 에러를 반환하게 됩니다. https://api.slack.com/interactivity/slash-commands#:~:text=This%20confirmation%20must,ignore%20the%20request
operation_timeout이 반환되지만 실제 응답은 정상적으로 처리되었기에, 사용자 입장에서 혼란이 생길 수 있다 판단에 해당 문제를 해결하고자 했습니다.
위와 같이, API Gateway 요청이 들어오면 1번 함수에서 실제 작업이 진행될 2번 람다 함수를 실행 시킵니다. 그 후 바로 slack으로 응답을 반환시켜 해당 문제를 해결 했습니다.
실제로는 아래 그림과 같이 동작합니다
간단한 자동화 과정이지만, 이번 작업한 내용을 토대로 추후에 새로운 기능들을 계속해서 추가하고 기존 기능을 고도화 하는등의 작업을 진행하며 Slack Command를 활용한 ChatOps를 만들어보려 합니다.
'프로그래밍 > 파이썬' 카테고리의 다른 글
HTML 텍스트 처리과정에서 발생하는 공백발생문제해결 (1) | 2023.12.15 |
---|