AWS 람다 용량 관리

AWS 람다는 작은 코드 조각을 실행시켜주는 함수다. 별다른 서버 설정이 거의 필요 없고 웹 대시보드에 코드만 올리면 바로 실행되어 결과를 확인할 수 있는 AWS 서비스이다. 그동안 이미지 리사이징처럼 단일 목적을 위해서 람다를 사용했는데 이번에는 웹 어플리케이션을 올려봤다. 아무래도 코드와 외부 패키지 갯수가 늘어나다 보니 비교적 용량이 크고 나중가서는 람다가 실행할수 있는 용량 제한에 걸리게 되었다.

람다에는 코드 용량 제한이 있다.

찾아보니 람다 서비스의 용량 정책이 있었다.

  • 3MB: 웹 에디터에서 편집가능
  • 50MB: 압축파일

자세한 리밋은 여기서 확인할 수 있다.

노드 어플리케이션은 작성한 소스코드 뿐만아니라 NPM 저장소에서 다운로드한 코드도 있어야 동작한다. 바로 node_modules 폴더에 있는 파일들이다. 프로젝트 초반에는 용량이 많지 않지만 패키지를 하나 둘 설치하다보면 눈덩이처럼 늘어난다. 혹자는 이걸 블랙혹보다 무겁다는 유머스러운 비유를 하기도 한다.

블랙홀보다 무거운 노드 모듈
블랙홀보다 무거운 노드 모듈

배포할 땐 코드만 포함하자

node_modules 폴더를 좀 살펴보면 서버 운영에 불필요한 파일도 있다. 가령 readme.md 같은 마크다운 파일이나 타입스크립트 코드(실제로는 빌드된 자바스크립트 코드를 사용한다), package.json 등이 있다. 각각 단독 프로젝트의 저장소이기 때문에 내가 사용하는 코드뿐만 아니라 설치한 패키지 프로젝트와 관련된 코드가 모두 포함되어 있다.

게다가 노드가 패키지를 관리하는 방식을 보면 더욱 그렇다. A와 B가 C패키지를 사용하면 NPM은 C를 하나만 다운로드 하지 않는다. 각각 하위 폴더에 A/C, B/C 패키지를 설치한다. 이러한 이유로 NPM으로 패키지를 설치하게되면 생각보다 패키지 총 용량이 기하급수적으로 늘어나게 되는 것이다.

이러한 문제를 해결하기 위해 node_modules 폴더 안에 불필요한 파일을 제거해서 용량을 줄이는 방법을 사용할 수 있다. node-prune 이 대표적이다. 배포할 때 node-prune으로 서버 운영시 불필요한 파일을 제거했더니 약 8MB 정도 감량했다

배포할 땐 사용하는 패키지만 포함하자

node_modules 에는 내가 설치하지 않았던 모르는 패키지도 있었다. 예를 들어 이미지 처리에 사용하는 sharp는 내가 설치하지 않았는데 next.js 패키지를 설치하면서 딸려온 것이다. 용량도 꽤 차지하는데 서버를 실행하는데는 불필요하다. 비슷한 이유로 배포에 필요하지 않은 패키지가 여전히 존재하는데 용량이 큰 것들만 찾아 봤다(명령어 출처: https://tsh.io/blog/reduce-node-modules-for-better-performance/).

du -sh ./node_modules/* | sort -nr | grep '\dM.*'

sharp뿐만 아니라 @babel, @ampproject, caniuse-lite 등 사용하지 않는 패키지들이 꽤 큰 용량을 차지했다. 배포시 이러한 패키지 폴더를 지우고 나니 약 13MB 정도 감량했다.

여전히 용량이 증가할 여지는 남아있다. 50MB 제한인데 30MB를 사용하고 있기 때문에 코드 용량을 계속 주시할 필요가 있다. 이것은 운영 부담이 적은 서버리스를 사용한 기회비용이라고 생각해야겠다.