AWS Lambda로 간단한 서버리스 API를 구성하다가 오늘 문제점을 만났다.
문제의 API는 간단한 캐싱 데이터를 가져가는 API인데,
갑자기 Response를 받기까지 시간이 너무 길어졌고,
이 데이터를 받아가는 클라이언트에서 에러를 캐치하여 슬랙으로 장애 알림이 왔다.
굉장히 의문이었다. 오래 걸리거나 복잡한 코드가 아니었고, 종속성면에서도 꽤나 가벼운 코드였다.
지표를 보니 함수 실행 성공률이 떨어지고 있었고, 실패율은 올라가고 있었다.
클라이언트에서 주기적으로 API를 호출하는 구조였는데,
함수 실행이 딜레이 되어 요청이 쌓여만 가서 위 이미지와 같은 지표를 그렸다.
초록색이 높은곳에 차트를 그리고 있다면 람다 함수 실행이 오래 걸렸다는 이야기다.
그러다가 AWS 공식 문서를 보고 해답을 찾았다.
람다 실행에는 동시성이란 개념이 있는데,
AWS 계정에 포함된 람다는 분당 최대 1000번 호출이 가능하다. (리전별 상이)
즉, 내 AWS 계정에 람다가 몇 개가 있던지, 한개의 람다 함수가 1000번 호출된다면 다른 람다 함수는 실행되지 않는다.
여기서 람다의 실행 구조를 알 필요가 있다.
람다는 사용자가 작성한 코드를 인스턴스에 이벤트로 전달하여 실행되는 서버리스 컴퓨팅 서비스다.
즉, 사용자가 서버를 구성하거나 신경 쓰지 않고 코드를 실행할 수 있다.
사용자 입장에서야 서버리스지만 이를 실제로 실행하는 AWS 입장에서는 인스턴스(서버)에서 실행하는 코드다.
이 인스턴스의 제한이 기본적으로 계정 및 리전당 횟수 제한이 있었던 것.
해결방법
1. 일단 실행되는 코드를 리팩토링하여 최적화를 진행했다.
그리고 관심사를 나눠 2가지 작업을 진행하던 API를 각각 2개의 람다로 분리했다.
2가지 작업을 동시에 진행하다 보니 다른 람다와 동시성 문제가 생겨 쓰로틀링이 심하게 걸렸었고,
분리 후 지표는 위 이미지와 같다. (대장애를 겪고 안정적으로 다시 돌아온 모습..)
2. 예약된 동시성 설정
앞서 언급했듯 계정당 1000개의 동시성 제한이 있는데, 이 람다에만 1000개 중 350개의 동시성 횟수를 설정했다.
이렇게 설정하게 되면 이 람다는 동시성에 대해 보다 안정적으로 처리가 가능하다.
ps: 예약된 동시성 설정방법
AWS 콘솔에서 람다를 열고 구성 -> 동시성 -> 우측 상단에 편집
이 동시성 예약이 0이 되면 람다 함수가 실행되지 않으니 잘 설정하자.
% 그 외 해결법
프로비저닝 된 동시성 구성이란 항목이 있는데,
이 기능은 1000대의 동시성 횟수 제한 이외에 별도에 이 함수만을 위한 인스턴스에 코드를 실행하여 안정성을 보장한다.
람다 함수에서 새 버전을 발행하여 해당 버전에 프로비저닝으로 동시성을 설정하면
기존에 언급한 동시성 걱정 없이 람다 함수를 실행할 수 있다.
그렇지만 편한 만큼 돈을 지불해야 한다.
코드량이 많아지면 월별 요금이 크게 올라감을 확인했으니
비용 폭탄을 맞고 싶지 않다면 조심해야 한다.
참고문서 :
'IT 정보' 카테고리의 다른 글
AWS]ECS Fargate X86에서 ARM으로 (0) | 2023.05.09 |
---|---|
Spring boot에서 ControllerAdvice를 이용하여 Exception handling하기 (0) | 2023.03.21 |
AWS LightSail 소개 및 적용기 (1) | 2022.11.30 |
RDS,MySQL] slow query 알림 봇 만들기 (0) | 2022.11.10 |
터미널 명령어 단축어 지정하기 (1) | 2022.11.02 |
댓글