AWS Lambda와 Serverless

zunzero·2022년 12월 1일
0

AWS

목록 보기
2/7

개요

리포팅 자동화 업무를 진행하게 되었다.
업무의 전체적인 개요는, 어떤 창에(누군가 만들어놓은) 엑셀 파일을 업로드하면 특정 구글 스프레드시트에 반영이 되고, 해당 스프레드시트를 타겟으로 하는 피봇 테이블을 캡쳐해서 슬랙 창으로 자동으로 업로드 되도록 하는 것이다.
엑셀파일을 업로드하고, 업로드된 파일의 내용을 객체로 빼내는 것까지는 팀장님이 작업을 해두셨다.
이후에 스프레드시트에 업로드하고 피봇 테이블을 캡쳐해서 슬랙창으로 자동으로 보고하는 업무를 내가 맡게 됐다.

Puppeteer

Puppeteer는 Chrome/Chromium을 제어하는 고급 API를 제공하는 노드 라이브러리라고 본인을 소개한다.
간략히 말하자면 Chrome/Chromium을 조종할 수 있는 것이다.
창에 대한 캡쳐를 하거나 PDF를 만들 수도 있고, 정보를 크롤링 할 수도 있다.

나는 크롬창에 html 파일을 띄워서 해당 페이지에 원하는 부분을 스크린샷 해야했기 때문에 puppeteer를 사용했다.

Serverless

우리는 AWS Lambda나 Azure의 Functions, Google의 Cloud Functions를 사용해서 서버리스 환경을 구상할 수 있다.
하지만 이것을 직접 활용해서 서버리스 환경을 구상하는 것은 생각보다 복잡하다.
그래서 Serverless Framework가 등장한다.
serverless framework 는 serverless 환경을 배포하고 운영하기 위한 도구이다.

serverless framework를 npm을 통해 설치하고, serverless.yml 파일을 작성해서 sls deploy 명령어만 입력하면 간단하게 AWS Lambda에 내 함수를 등록할 수 있다.
AWS Lambda가 지정한 url을 통해 API를 호출할 수 있고, API를 호출하면 내가 작성한 함수가 실행되는 것이다.

내가 작성한 소스코드를 올릴 수는 없다.
(회사...에서 사용 중인 코드이기 때문에ㅜㅜ)
하지만 구글링을 통해 검색해보면 매우 간단하다는 것을 알 수 있다!!

용량 초과

우선 나는 아래의 링크에 나온 예시를 참고해서 소스코드를 작성했다.
https://www.serverless.com/examples/aws-node-puppeteer

AWS Lambda에 deploy 하지 않고, 로컬에서 테스트할 때에는 모든게 잘 동작했다.
chrome창도 headless로 동작해서 스크린샷도 잘 되었다.
그래서 아무 문제 없겠거니 하고 sls deploy를 통해 AWS Lambda에 업로드하려했으나 문제가 발생했다.

AWS Lambda에 업로드할 수 있는 파일의 용량에 제한이 있는 것이었다.

An error occurred: LambdaFunction - Unzipped size must be smaller than 262144000 bytes

이런 에러 문구가 떴다.
약 250MB이다.
내가 사용하는 람다 함수에서 땡겨쓰는 모듈들이 용량이 큰 모양이다.
그리고 앞서 내가 참고했다는 serverless 에시도 좀 구식이다.
serverless-plugin-chrome이라는 것을 사용하는데 이게 용량도 많이 잡아먹는 것 같다.

뭐 이래저래 package.json에서 쓰지 않는 것들은 다 빼보는데도 용량 초과가 발생했다.

layer

그에 대한 해결책으로 layer를 발견헀다.
layer가 처음 나온 의도는 아마, 여러 람다 함수에서 공통으로 사용되는 부분을 따로 뺄 수 있게 하는 것이었을 것이다.

위의 사진을 보자.
3개의 람다함수에서 공통으로 사용하는 모듈을 따로 빼서 관리한다.
그리고 3개의 람다함수(공통 모듈을 떼어낸)를 AWS 업로드하면 용량이 분명 줄어든다.

공통 모듈을 재업로드하는 비효율적인 현상을 방지하기 위해 발생한 layer이겠지만, 우리는 조금 다르게 활용했다.
1개의 람다함수이지만, 용량을 크게 차지하는 모듈들을 layer로 빼두었다.
모듈과 함수를 따로 AWS Lambda에 등록하니 다행히도 용량 문제가 발생하지 않고 잘 배포되었다. ㅎㅎ

font 문제도 발생했는데, 영어가 아닌 한중일 문자의 경우 글자가 뜨지 않고 네모칸으로 뜨는 경우가 빈번히 발생한다.
https://github.com/alixaxel/chrome-aws-lambda

우리는 구식의, 현재에는 전혀 사용되지 않는 serverless-plugin-chrome은 버리고 위의 링크에서 소개하는 chrome-aws-lambda를 사용하였고, 폰트 문제는 해당 깃헙에서 소개하는 방식대로 layer로 등록해 사용했다.

Docker

팀장님께선 layer로 등록하는게 원래의 의도에 맞는지 의구심이 드셨는지, 용량 제한 문제가 해결되기는 했다만 불안하다며 Docker를 사용해 다시 배포하셨다.
(나 퇴근하고 1시간 정도..? ㅋㅋ)
Docker를 사용하면 AWS Lambda에 등록할 수 있는 용량이 늘어난다.
최대 10GB의 커테이너 이미지까지 배포할 수 있게 된다.
굉장하다!!!!
나는 Docker를 잘 몰라서... Docker에 대해 공부해봐야겠다고 생각이 들었다.

기타

최근 테스트 디비를 덤프떠서 내 로컬 디비로 옮기는 작업을 진행했었는데, MySQL 버전 문제로 오류가 발생했다.
나는 뭐.. 어째저째 80% 정도 해결했는데, 팀 동료분은 Docker를 띄워서 해결하셨다고 했다.
흠... 그래서 Docker가 뭔지 궁금해졌다.
대충은 알지만 진짜 대충 안다.
hello world 정도? ㅋㅋ
근데 지금 Docker 공부할 때가 아닌지라.. ㅋㅋ 언젠가 기회가 오겠징 히히

profile
나만 읽을 수 있는 블로그

0개의 댓글