[AWS] Lambda에서 Timeout 걸릴 때 해결 가능한 방법 알아보기
안녕하세요
이번 시간에는 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)
[AWS] Lambda에서 Slack 이벤트 Payload를 JSON 형태로 사용하기
안녕하세요 이번 시간에는 AWS Lambda에서 Slack 이벤트 Payload를 JSON 형태로 사용해 보는 실습을 진행하겠습니다. Flask에서는 request.form.get("payload")로 바로 JSON 형태로 추출이 가능했지만 Lambda에 Flask
eveningdev.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)
[AWS] Lambda 비동기화(@Slack)
# 작성하는 이유 - 동기화되어 작업중인 Slack worker를 Queue를 이용하여 비동기화 하여 서비스의 안정성을 높이고자 합니다. - AWS 리소스를 관리하는 방안으로 Slack을 이용하여 커맨드를 전달하고
velog.io
xgro님이 작성하고 소개해주신 Slash Command에 대한 해결 방법인 Lambda 비동기화 방식에서는 응답 값인 200 코드를 3초 안에 바로 반환하고 이벤트는 SQS로 전달하여 처리하는 방법입니다. 이 경우 이벤트가 SQS에서 순서대로 처리되고 200 코드를 리턴값으로 반환하기 때문에 Slack Slash Command에서는 Error를 반환하지 않습니다. 이 방법은 Slack 쪽에서의 Timeout에 대한 해결 방법이기 때문에 로직을 처리하는 시간이 길어져 Lambda에서 Timeout이 발생한 경우는 해결되지 않습니다. SQS를 계속 늘려가며 로직을 분할하면 해결은 가능하겠지만 상당히 복잡해질 수 있습니다.
이번 시간에는 AWS Lambda 단에서 Timeout 걸릴 때 해결하는 방법에 대해 간단하게 알아봤습니다.
감사합니다.