안녕하세요
이번 시간에는 Slack API 요청 시 AWS Lambda 단에서 Timeout 걸릴 때 해결하는 방법을 간단하게 포스팅하려고 합니다.
1. 문제점
Lambda CloudWatch Logs를 확인해 보면 3초 이상 걸리는 로직이나 쿼리에 대해 다음과 같이 Lambda Timeout 에러가 발생하는 것을 확인할 수 있습니다. 이 경우 기본적으로 2가지 해결 방법을 제안해 볼 수 있습니다.
현재 Slack API를 사용하는 챗봇 서비스의 구성도를 보면 Slack으로 메세지를 던지면 API Gateway를 통해 Lambda에 이벤트가 발생하는데 Lambda에서는 이벤트의 본문이 Base64 형태로 인코딩 되어 출력됩니다. 이때 코드에서 로직을 처리하고 사용자에게 다시 반환하는 시간이 기본 값인 3초를 넘어버리면 Lambda에서는 Timeout Error가 발생하고 해당 이벤트는 처리되지 않습니다.
이벤트 본문이 Base64 형태로 출력되는 것은 하단의 게시글을 통해 확인 가능합니다.
[AWS] Lambda에서 Slack 이벤트 Payload를 JSON 형태로 사용하기 (tistory.com)
2. 해결 방법
1. Lambda Timeout 시간 늘리기
Lambda의 구성탭에서 일반 구성을 확인하면 기본적으로 Lambda에 제한 시간이 3초로 설정되어 있는 것을 확인할 수 있습니다. 이 경우 로직이나 쿼리의 성능이 굉장히 좋거나 가벼운 코드가 아닌 이상 대부분의 경우에 3초를 초과하는 경우가 생깁니다. 편집에서 제한 시간을 로직이나 쿼리가 충분히 처리될 수 있는 시간으로 설정한 후 저장합니다.
제가 구성한 서비스의 경우 요청부터 응답까지 리소스에 따라 5초까지 소요되기 때문에 기본 값인 3초로 설정하면 Timeout에 걸리게 되는데 Timeout 시간을 늘리면 다음과 같이 Lambda Timeout에 걸렸던 로직이 처리되어 Slack으로 반환된 것을 확인할 수 있습니다.
2. 로직 및 쿼리 성능 개선하기
이 방법의 경우 코드를 효율적으로 작성하여 시간 복잡도를 줄이거나 쿼리 튜닝을 통해 SQL 성능을 높이는 방법입니다. 이 해결 방법의 경우 엔지니어의 역량에 따라 개선할 수 있는 정도의 차이가 크기 때문에 가능하면 이 방법이 좋지만 실제 서비스가 아닌 테스트 용도라면 1번 방법으로 충분할 것입니다.
3. 비동기로 처리하기
[AWS] Lambda 비동기화(@Slack) (velog.io)
xgro님이 작성하고 소개해주신 Slash Command에 대한 해결 방법인 Lambda 비동기화 방식에서는 응답 값인 200 코드를 3초 안에 바로 반환하고 이벤트는 SQS로 전달하여 처리하는 방법입니다. 이 경우 이벤트가 SQS에서 순서대로 처리되고 200 코드를 리턴값으로 반환하기 때문에 Slack Slash Command에서는 Error를 반환하지 않습니다. 이 방법은 Slack 쪽에서의 Timeout에 대한 해결 방법이기 때문에 로직을 처리하는 시간이 길어져 Lambda에서 Timeout이 발생한 경우는 해결되지 않습니다. SQS를 계속 늘려가며 로직을 분할하면 해결은 가능하겠지만 상당히 복잡해질 수 있습니다.
이번 시간에는 AWS Lambda 단에서 Timeout 걸릴 때 해결하는 방법에 대해 간단하게 알아봤습니다.
감사합니다.
'Cloud > Amazon Cloud' 카테고리의 다른 글
[AWS] Lambda를 이용한 Serverless 형태의 Slack 챗봇 사용하기 - 2 (0) | 2023.11.30 |
---|---|
[AWS] EC2에서 라이브러리를 S3에 저장하여 S3 업로드로 Lambda에 적용하기 (0) | 2023.11.30 |
[AWS] Lambda에서 Slack 이벤트 Payload를 JSON 형태로 사용하기 (0) | 2023.11.30 |
[AWS] Lambda를 이용한 Serverless 형태의 Slack 챗봇 사용하기 - 1 (0) | 2023.11.30 |
[AWS] AJAX와 서버리스를 활용한 정적 웹 호스팅 동적으로 전환하기(API Gateway, Lambda, S3) (0) | 2023.07.27 |
클라우드, 개발, 자격증, 취업 정보 등 IT 정보 공간
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!