본문 바로가기

Etc/개발 경험 공유

Node.js API 서버에서 Python 코드 분리 하기 (Lambda 도입기)

728x90
반응형

안녕하세요 스타트업에서 Backend 개발자로 일을 하고 있는 김성민입니다.

오늘은 이전 글에 이어 Node.js를 사용하는 API 서버에서 Python코드를 AWS Lambda를 사용하여 분리했던 경험을 공유하고자 합니다.

들어가며

이전 글에서 말했듯 제가 재직 중인 회사에서는 Node API 서버에서 Python 코드를 호출하여 각종 대회에 채점 결과를 보여주고 있습니다.

그렇기 때문에 API 서버에서 사용하는 자원보다 더 많은 자원을 사용하게 되는 경우가 있어 AWS 요금이 트래픽 양 대비 높은 금액을 지출하고 있습니다.

기존 방식

따라서 Python코드를 API 서버와 분리하여 AWS 요금을 줄이고자 Serverless 중 하나인 Lambda를 도입하여 분리하였습니다.

왜 Lambda를 사용하였는가?

AWS에는 Lambda를 제외하고도 Fargate라는 서버리스 컴퓨팅 엔진이 있습니다.
그럼에도 불구하고 Fargate가 아닌 Lambda를 선택하게 된 이유는 다음과 같습니다.

1. 채점의 경우 사용자의 submission이 발생 했을 때에만 호출한다.
2. 항상 값을 받을 수 있도록 대기상태에 있을 필요가 없다.
3. 단순히 제출물과 답안지를 비교하여 점수를 계산하는데에만 필요하다.

즉, 매번 필요한 경우가 아닌 사용자가 제출을 했을 때에만 필요했기 때문에 요청 시에만 코드를 실행할 수 있는 Lambda를 선택하게 되었습니다.

Lambda의 고질적인 문제인 250MB의 문제는 어떻게 해결 하였는가?

Lambda를 사용해보신 분들은 아시겠지만 Lambda는 많은 제약 조건이 있습니다.
그중 가장 큰 제약 조건은 코드 용량의 크기가 최대 250MB를 초과하면 안 되는 문제입니다.

 

여기서 말하는 코드 양의 크기 제한이란 실행하는 코드(.py)가 아닌 코드에서 사용하는 library를 포함한 크기입니다.

해당 문제는 Lambda Layers가 지원하면서 해결될 줄 알았지만 현재도 250MB 제약은 여전히 존재합니다.

 

그렇기 때문에 Pandas와 Numpy을 기본적으로 사용하기 때문에 해당 문제는 가장 크게 느껴졌고 250MB로 맞춘다고 해도 대회 별로 추가되는 산식이 있을 경우 빠르게 대응하기 어렵다는 문제가 있었습니다.

 

해당 문제를 해결하기 위해서 팀원들과 많은 고민을 하였고 그 과정에 있어서 많은 스터디가 필요하였습니다.
그 결과 2가지의 방법에 대해 고민을 하였고, 2가지 방법 모두 테스트를 진행하였습니다.

1. 각 함수를 나눠서 만든 다음 함수에서 함수를 호출 하는 형태로 구현
    - 유지보수 및 이슈 대응이 어려움
    - 중복된 코드가 만들어질 가능성이 있음
2. Docker을 사용하여 ECR에 Docker Image를 올려 배포(최대 10GB까지 가능)
    - 팀원들의 Docker 스터디 필요
    - 버그 발생 시 Docker Image를 다시 Build하여 배포 해야함

 

테스트를 하면서 1번 방법에 고질적은 문제들이 보이기 시작하였고 Docker에 대해 스터디만 진행한다면 유지보수가 가능한 2번 방법이 최고의 선택이라고 판단하게 되었고, Docker을 사용하여 채점이 정상적으로 진행되는지 Test서버에 올라가 테스트를 진행하고 있습니다!

결론

Docker을 사용하여 Lambda을 사용하는 경우 Base이미지를 Amazon에서 제공하는 이미지(Amazon Linux 기반)를 사용하거나 Linux 기본 이미지를 사용하여 만들고 Lambda Runtime Interface Client 이미지를 추가하여 Dockerfile을 만들어야 Lambda에서 사용이 가능합니다.

해당 과정은 AWS Document을 보면 설명이 잘되어 있어서 Docker를 사용할 수 있다면 누구나 쉽게 Docker 이미지를 사용하여 Lambda에 배포를 할 수 있습니다.

728x90
반응형