안녕하세요
이번 시간에는 AWS Lambda에서 Slack 이벤트 Payload를 JSON 형태로 사용해 보는 실습을 진행하겠습니다.
Flask에서는 request.form.get("payload")로 바로 JSON 형태로 추출이 가능했지만 Lambda에 Flask를 올릴 것은 아니기 때문에 Payload를 로그 찍어보며 어떻게 JSON 형태로 변환하면 좋을지 고민해 보다가 이런 방법도 있는 것 같아서 소개해드리려고 합니다.
1. Slack 이벤트의 Payload 구성 살펴보기
서버리스 환경에서 Event Subscriptions나 Interactivity & Shortcuts 설정을 진행했다면 Slack에서 발생하는 이벤트는 Lambda 모니터링 CloudWatch에 로그로 찍히게 됩니다.
Lambda 모니터링 탭에서 CloudWatch Logs 보기를 통해 로그를 바로 확인 가능한데 이벤트를 발생시킨 후 새로고침하여 가장 상단에 위치한 최신 로그를 확인해 보면 이벤트가 정상적으로 JSON 형태로 찍히는 것을 확인할 수 있습니다.
1. 이벤트 요청 본문 확인하기
이렇게 Event에서 body 부분을 통해 어떤 이벤트인지 확인해주어야 하는데 가장 마지막 행을 확인해보면 base64 형태로 인코딩 되어 있는 것을 확인할 수 있습니다. 따라서 Event의 Body 부분을 추출하여 base64 디코딩을 진행합니다.
import base64
# base64 디코딩
decoded_bytes = base64.b64decode(event['body'])
print(decoded_bytes)
다음과 같이 Lambda에서 base64를 import 합니다. 파이썬 내장 라이브러리이기 때문에 따로 라이브러리를 추가해주지 않아도 됩니다.
2. 이벤트 요청 본문 base64 디코딩하기
base64 디코딩을 진행한 후 보시면 일부 영어 문자는 보이나 일부 문자가 제대로 보이지 않는 것을 확인할 수 있습니다. 심지어 가장 앞쪽에 b`payload= 로 되어 있기 때문에 바이트열을 문자열로 변환해야 하며 JSON 형태로 변환하기도 어렵습니다.
3. 바이트열을 문자열로 디코딩하기
# 바이트열을 문자열로 디코딩
decoded_string = decoded_bytes.decode('utf-8')
print(decoded_string)
바이트 열을 문자열로 변환하며 형태가 깔끔해졌으나 {}와 같은 특수 문자열이 디코딩되지 않았고 형태가 문자열인 모습입니다.
4. URL 디코딩 및 payload= 제거하기
from urllib.parse import unquote
# 불필요한 문자열 payload= 제거
payload_start = decoded_string.find('payload=') + len('payload=')
payload_encoded = decoded_string[payload_start:]
print(payload_encoded)
# URL 디코딩
decoded_json = unquote(payload_encoded)
print(decoded_json)
불필요한 문자열인 payload= 를 먼저 지워준 후 URL 디코딩을 통해 특수 문자를 인지 가능한 형태로 디코딩합니다. urllib 역시 파이썬 내장 라이브러리이기 때문에 따로 추가해 줄 필요 없습니다. 로그를 보시면 딱 필요한 형태로 바뀐 것을 확인할 수 있습니다.
5. JSON 형태로 변환하기
import json
payload = json.loads(decoded_json)
print(payload)
현재 해당 로그에서 타입이 문자열이기 때문에 JSON 형태로 변환을 해주어야 합니다. json은 파이썬에서 내장으로 제공하고 있지 않아 라이브러리를 추가해주어야 하는데 아래 게시글을 확인한 후 Lambda에 추가해 주시면 됩니다.
[AWS] AWS Lambda에 대해 알아보고 Python 외부 모듈 적용하기 (tistory.com)
해당 설정을 마치고 다시 CloudWatch 로그를 확인하면 다음과 같이 JSON 형태로 깔끔하게 정렬되어 보이는 것을 확인할 수 있습니다. 이제 해당 Payload를 통해 사용자에게 반환할 로직을 구성하면 됩니다.
이렇게 Payload를 사용 가능한 형태로 바꿔 사용자가 요청하면 해당 요청에 맞는 응답을 제공하는 로직을 구성하였습니다.
이번 시간에는 AWS Lambda에서 Slack 이벤트 Payload를 JSON 형태로 사용해보는 실습을 진행해봤습니다.
서버에서 구성하는 것과 다르게 CloudWatch를 사용하여 로그를 찍어봐야 하기 때문에 생각보다 번거로운 부분이 있었으나 다음과 같이 이벤트 페이로드를 JSON 형태로 사용하면 AWS 서버리스 환경에서 챗봇을 유용하게 사용할 수 있습니다.
감사합니다.
'Cloud > Amazon Cloud' 카테고리의 다른 글
[AWS] EC2에서 라이브러리를 S3에 저장하여 S3 업로드로 Lambda에 적용하기 (0) | 2023.11.30 |
---|---|
[AWS] Lambda에서 Timeout 걸릴 때 해결 가능한 방법 알아보기 (0) | 2023.11.30 |
[AWS] Lambda를 이용한 Serverless 형태의 Slack 챗봇 사용하기 - 1 (0) | 2023.11.30 |
[AWS] AJAX와 서버리스를 활용한 정적 웹 호스팅 동적으로 전환하기(API Gateway, Lambda, S3) (0) | 2023.07.27 |
[AWS] AWS WorkSpaces: 클라우드 기반 가상 데스크톱의 혁신적인 작업 환경 구성하기 (0) | 2023.07.07 |
클라우드, 개발, 자격증, 취업 정보 등 IT 정보 공간
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!