애플리케이션을 개발하면서 발생한 Lambda 비용 최적화 문제와 해결 과정을 정리해보았습니다.
1. 문제의 발생
서비스 개발도중 AWS Lambda와 API Gateway를 이용해 REST API를 배포할 일이 있었습니다.
Python 3.10 환경에서 동작하며, 웹사이트의 url을 입력으로 받으면 크롤링으로 단어를 추출하고, 토큰화 등 전처리 과정을 거쳐서 응답하는 프로그램이다.
로컬환경에서 테스트 했을 때는 실행에 3초 정도가 소요되어, UX에 크게 문제를 주지 않을 것이라 생각했습니다.
그런데... production 환경에서 실행 시간이 10~20초 정도 걸리고, 심지어 특정 URL에 대해서는 Timeout이 나는 문제가 발생했습니다. Timeout이 발생했다는 것은 Lambda의 기본 제한 시간인 29000ms를 넘었다는 의미입니다.
2. 문제의 원인
일단 원인 자체는 간단했습니다. lambda의 메모리 기본값은 128MB로, 로컬 환경에 비해서 부족했던 것입니다. (해당 프로그램 실행 시간에는 메모리보다는, CPU 성능이 직접적으로 영향을 주지만, lambda에서는 CPU 성능도 메모리에 비례해서 상승합니다.)
*2. 임시방편(번외)
정확하게 필요한 메모리를 측정하기 전에 일단 production 환경에서 Timeout이 나지 않도록 제한 시간을 늘렸습니다. 기본 lambda 웹 콘솔에서는 29000ms로 제한되어 있지만 Service Quotas에서 최대 할당량 값을 계정 수준에서 증가 요청하면 즉시 할당량을 상승 시킬 수 있습니다.
3. 문제의 해결
3-1. 메모리를 늘려가며 수동 테스트
Lambda는 함수가 실행된 시간과 할당된 메모리에 비례해서 비용을 지불하게 됩니다. 직접 웹 콘솔에서 수동으로 메모리를 늘려가며 청구 기간을 비교해보았습니다.
예상대로 메모리에 반비례해서 청구 기간은 줄어드는 모습입니다. 무조건 메모리를 높이면 UX에는 도움이 되겠지만, 비용면에서 비효율적일 수도 있습니다.
실제로 위 측정 결과에서도 128에서 512로 메모리가 4배 늘어났지만, 청구 기간은 1/4배보다는 긴 것을 확인할 수 있습니다.
3-2. aws-lambda-power-tuning으로 최적화
lambda 최적화를 위해 AWS 공식 Docs에서는 아래와 같은 방법을 제시하고 있습니다.
기능에 적합한 메모리 구성을 찾으려면 오픈 소스 AWS Lambda Power Tuning 도구를 사용하는 것이 좋습니다. 이 도구는 AWS Step Functions를 사용하여 서로 다른 메모리 할당에서 Lambda 함수의 여러 동시 버전을 실행하고 성능을 측정합니다. 입력 함수는 AWS 계정에서 실행되어 라이브 HTTP 호출 및 SDK 상호 작용을 수행하고 라이브 프로덕션 시나리오에서 예상 성능을 측정합니다. 또한 이 도구를 사용하도록 CI/CD 프로세스를 구현하여 배포한 새 기능의 성능을 자동으로 측정할 수 있습니다.
Lambda를 메모리 별로 실행하고, 자동으로 최적화된 메모리 값을 그래프와 함께 제한해주는 오픈소스 툴 입니다.
과정
1. 아래 페이지로 들어가 Deploy를 클릭합니다.
2. 하단에 IAM 역할 생성에 동의하기를 체크하고 배포해줍니다.
3. Step Function으로 들어와 배포한 상태머신을 선택합니다.
4. 우측 상단에 실행 시작을 클릭하고, 아래 형식으로 JSON을 입력합니다.
{
"lambdaARN": "측정할 lambda의 ARN",
"powerValues": [
128,
256,
512,
1024,
2048
],
"num": 10,
"payload": {
// 본인 lambda 코드에 맞춰서 수정
},
"parallelInvocation": true,
"strategy": "cost"
}
여기서 payload는 lambda에 입력되는 테스트 이벤트를 JSON 형식으로 입력할 수 있습니다.
결과
실행 결과 탭에서 최적화된 메모리 size를 알 수 있고, 좌측 상태 출력에 visualization에 웹사이트 주소에서 아래와 같이 측정 값을 그래프로 확인할 수 있습니다.
해당 프로그램은 512MB로 메모리를 설정했을 때, 4초 정도 실행 시간이 소요되고 비용 최적화가 된다는 것을 확인할 수 있었습니다. aws-lambda-power-tuning를 사용하여 예산과 UX에 맞는 효율적인 의사 결정을 하는데 도움을 받을 수 있었습니다.
참고 자료
- https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/configuration-memory.html