제가 서버리스 배포 시, 용량 제한으로 겪었던 어려움에 관한 내용입니다.
어느 날, 평소처럼 sls deploy를 입력했지만 처음보는 에러가 발생했습니다.
Unzipped size must be smaller than 262144000 bytes
다음과 같은 에러로, 250 mega byte 까지 배포할 수 있다는 소리인거죠
제 파일 구조 상, node_modules/**가 포함되어 있어, 이로 인하여 굉장히 많은 용량을 차지한거죠.
하지만 코드가 작동하기 위해선 node_moduels가 있어야했고, 그로 인한 방법을 찾아보았습니다.
일반적으로 sls 상에서 layer를 구성하는 방법은 굉장히 간단합니다.
layers:
nodeModules:
path: layer
compatibleRuntimes:
- nodejs14.x
functinos:
main:
handler: handler.main
layers:
- {Ref: NodeModulesLambdaLayer}
package:
patterns:
- "!node_modules/**"
serverless.yml
layers.{your layer name}의 구조며, 제가 넣은 nodeModules에 각자의 레이어 이름을 넣어주시면 됩니다.
또한 functions.layers에 구문은 어떤 레이어를 참조할 것이냐며, 레이어이름(첫글자 대문자로) + LambdaLayer를 따르시면 됩니다.(공식문서 참조)
또한 layers에서 path를 layer로 잡은 이유는 제 파일 구조 상인데요.

다음과 같이 제 layer에 넣을 파일들이 layer 경로에 잡혀있어서 그렇습니다.
path값을 참조 한 뒤, nodeJs runtime이면 nodejs 폴더의 파일들을 조회하기에
다음과 같은 구조를 띄게 되었습니다.
그리고 루트의 node_modules는 조회하면 안되기에, package.patterns에 !node_modules/**를 넣어 본 함수에 포함 안되도록 하였고요.
아쉽게도 위의 사례는 serverless-plugin-typescript를 사용하지않는 사람들에게 해당되는 사항이고요.
저처럼 node_modules만 따로 레이어에 넣을려는 사람에게는 포함되지않는 사항이란 것!
물론 이제 자신이 layer에 넣을 코드들이 serverless-plugin-typoescript에 들어가서 같이 컴파일이 된다면 괜찮습니다.
관련 이슈
https://github.com/serverless/serverless/issues/9873
https://github.com/serverless/serverless-plugin-typescript/issues/240#issuecomment-1073489341
그러기에 많은 사람이 serverless-esbuild를 추천하더라고요.
물론 공식적인 플러그인을 사용해야한다 말이 많지만, 네.. 구린건 못참죠
https://daddyprogrammer.org/post/14099/aws-lambda-layer-slim-lambda/
https://seoyeonhwng.medium.com/aws-lambda-%EB%B0%B0%ED%8F%AC-%ED%8C%A8%ED%82%A4%EC%A7%95-4dd4f3da69b3
다음 링크들을 보시면 알겠지만 대충 aws 들어가서 layer에 직접 zip 파일을 올리는 방법입니다.
물론 이제 자세한 방법들은 위에 있을테니
제가 겪은 이슈만 정리하자면..
.으로 시작되는 폴더들은 윈도우 기본 zip으로 압축하기에서 무시된다고 하네요..
.bin제외하고요
그래서 제가 선택한 방법은 zip cli를 설치하였습니다.
https://lee-mandu.tistory.com/530
대충 설치하고
cd layer
zip -9vr filename.zip ./nodejs
나온 zip 파일을 aws에 올리고 layer 지정하면 끗
functions:
main:
layers:
- arn:aws:lambda:ap-northeast-2:022357019924:layer:nodeModules:{version number}
이렇게 하면 되지만, 직접 version number를 올리긴 귀찮기 때문에!
plugin 소환
plugins:
- serverless-latest-layer-version
바로 layers 뒤의 version number를 latest로 변경
좋았다
이러면 알아서 가장 마지막 버전으로 설정됩니다.
에휴 인생
이걸로 내 2주를 날리다니
아니 왜 하..
네!
https://github.com/Smart-Highschool-Ace/Olio2_API
제가 작업했던 레포니 참고하던지 스타 눌러주던지
node 버전을 14 로 하신 이유가 있으신가요 ?