제가 서버리스 배포 시, 용량 제한으로 겪었던 어려움에 관한 내용입니다.
어느 날, 평소처럼 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 로 하신 이유가 있으신가요 ?