Serverless 배포 용량 줄이기

오병진·2022년 7월 7일
1

제가 서버리스 배포 시, 용량 제한으로 겪었던 어려움에 관한 내용입니다.

어느 날, 평소처럼 sls deploy를 입력했지만 처음보는 에러가 발생했습니다.

Unzipped size must be smaller than 262144000 bytes

다음과 같은 에러로, 250 mega byte 까지 배포할 수 있다는 소리인거죠

제 파일 구조 상, node_modules/**가 포함되어 있어, 이로 인하여 굉장히 많은 용량을 차지한거죠.

하지만 코드가 작동하기 위해선 node_moduels가 있어야했고, 그로 인한 방법을 찾아보았습니다.

layer in serverless.yml

일반적으로 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에서 pathlayer로 잡은 이유는 제 파일 구조 상인데요.

다음과 같이 제 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를 추천하더라고요.
물론 공식적인 플러그인을 사용해야한다 말이 많지만, 네.. 구린건 못참죠

직접 zip해서 layer 지정하기!

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 파일을 올리는 방법입니다.

물론 이제 자세한 방법들은 위에 있을테니
제가 겪은 이슈만 정리하자면..

.prisma 왜 zip에 포함 안돼...(window)

.으로 시작되는 폴더들은 윈도우 기본 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 numberlatest로 변경
좋았다

이러면 알아서 가장 마지막 버전으로 설정됩니다.

마무리하면서

에휴 인생
이걸로 내 2주를 날리다니

아니 왜 하..

네!

https://github.com/Smart-Highschool-Ace/Olio2_API
제가 작업했던 레포니 참고하던지 스타 눌러주던지

profile
지나가는 사람입니다. 마저 지나갈게요 :D

1개의 댓글

comment-user-thumbnail
2023년 12월 27일

node 버전을 14 로 하신 이유가 있으신가요 ?

답글 달기