글
AWS Lambda 에서의 웹크롤링 고찰
50메가바이트로 한참동안 고생했던 웹크롤러입니다...
금일 안에 작성예정...
아 Aㅏ Ah.. 회사내에서 보직이동에 뭐에..
요즘 쿠버네티스 꿀잼에 빠졌습니다.
AWS ECS (DockerSwarm) vs K8S 비교하며, 뭔가 요새 조금 더 레벨업 하는 분위기가 나네요.
하는게 아니라, 이거 깜빡하고 있었습니다.. (근 2달가까이 작성도 안하고 내비둔 내 작은 일기 ㄷㄷㄷ...)
람다는 서버리스, 즉 Server Configurationless 정도로, 호스팅 환경 설정을 최소화시킨 상태로, 내가 원하는 어플리케이션 코드를 실행시켜줍니다. 그래서 Function as a Service, FaaS 라는 카테고리로 취급됩니다.
이런 함수형 서비스들은 특히, 용량에 따른 제약사항을 많이 받습니다.
docs.aws.amazon.com/ko_kr/lambda/latest/dg/gettingstarted-limits.html
특히 배포패키지 크기, 하나의 어플리케이션을 압축했을 때, 그 패키지 용량 제한이 50MB라는 점이, 이번 주제, 람다 웹 크롤러이자 Lambdium (Lambda + Chrome + Selenium)이 됩니다.
답은 간단합니다. 원하는 언어의 람디움을 가져다가 사용하면 됩니다. (응?)
아니.. 사실 이걸 람다 레이어로 다 해보려고 했는데, 의존성 순서 다 깨지고.. 동작 안하더라구요... 라는 뒷담화가 있어서.... 트러블슈팅도 귀찮기도 했고...
그래서, 용량 제한 람다에 대해, 셀레늄부터 시작해, 웹브라우저 드라이버, 그리고 람다까지 오게되며 탄생된 람디움에 대해서 알아보는 시간을 가져보도록 하죠.
(1) 셀레늄 (Selenium)
셀레늄을 검색하면, 대개 한가지의 공통 단어가 나옵니다. 바로 웹 크롤러죠. 셀레늄은, 웹 브라우저 테스팅 도구 등 여러 무림의 고수들이 설명을 잘 해주시고 계시나, 클라우드 개발자인 제 입장에서의 셀레늄은, 인터넷 익스플로러, 크롬, 파폭, 오페라와 같이, 어플리케이션 런타임 중 웹 브라우저를 실행시키기 위한 도구입니다. 한장의 그림으로 설명되니, 먼저 크롬으로 들어가보죠.
(2) 크롬
수많은 웹 브라우저 중, 하나입니다. 구글이 만들고, 자바스크립트 엔진은 V8 입니다. 노드js의 심장부이죠. 라이브러리를 다운받을 때, Chromium이라는 녀석이 나오게 되는데, 크롬 + 셀레늄의 합성어입니다. 2개의 기능을 하나로 합쳐놓은 것이죠. 셀레늄은 웹 브라우저를 실행시킬 때, 크롬을 쓸지, 익스를 쓸지, 파폭을 쓸지 등을 결정해야 하며, 이 때 원하는 브라우저 바이너리 파일도 있어야 합니다. 따라서, 어플리케이션 > 셀레늄 > 브라우저는 다음 그림과 같은 의존성을 가집니다.
이런 웹 브라우저는 다음과 같은 의존성을 가지게 되겠죠.
(1) 파이썬, js 등 스크립트 언어는 웹 브라우저와 동작하기 위해, 셀레늄에 액션 코드를 주입합니다.
(2) 셀레늄은 명령이 내려진, 어플리케이션의 코드를 수행하고자, 브라우저를 탑재합니다.
(3) 셀레늄은 탑재한 브라우저를 오픈시켜, 어플리케이션의 명령 코드를 수행합니다.
따라서, 어플리케이션이 브라우저와 대화할 수 있는 중간 레이어 셀레늄을, 웹 드라이버라고 칭하는 것입니다.
마치 컴퓨터와 프린터가 직접 대화를 못하니, 프린터 드라이버를 설치해 대화하는 것 처럼, 어플리케이션이 이기종인 브라우저와 직접 대화를 못해 중간 매개체인, 웹 드라이버가 있는 것처럼 말이죠.
근데 우리 그거 아세요? 우리의 테마는 람다라는 것.. (아 aㅏ ah)
람다 호스팅 환경은 이 셀레늄 웹 크롤러 자동화를 수행하는데 지옥입니다.
용량의 문제입니다. 람다 함수 패키지의 최대 크기는 50메가임을 위에서도 말했는데, 제가 그냥 람디움을 받으라는 이유가 여기서 증명됩니다..
headless-chromium. 즉, 셀레늄을 구동시키기 위한 크롬브라우저, gui나 기타 부가기능들을 다 제외한 저 크롬브라우저의 바이너리파일만 하더라도 100메가 가까이 육박합니다. 그러나 세상에는 용자가 많다보니, 이것에 대해 필요 라이브러리만 정확히 디펜던시를 모아 상기처럼 만든 것이, 바로 Lambda + Chromium = Lambdium 이 된 것입니다. (네. 혼종입니다.)
해당 패키지를 정확히 zip 아카이빙하면, 약 49.5 메가정도로, 아슬아슬하게 턱걸이로 걸치고, 약 수백키로바이트 정도의 웹 크롤링 자동화 코드를 작성할 여유가 생깁니다.
그래서 람디움 안의 모든 라이브러리 디펜던시가 교묘하게 엮여있고, 그걸 굳이 또 뜯어보기 귀찮았기에.. 람디움을 그냥 쓰라는 결론에 이른 것이죠.
아마도 클라우드 개발자 앙몬드가 람다 용량 문제로 겪은 첫번쨰 이슈이지 않았을까 합니다.
그러고보니 조금 늦은감이 있지만, 쿠버네티스 재미에 빠져있습니다. 쿠버네티스와 파이썬, 그리고 람다까지 잘 글을 다독이며, 훗날 이 작은 기억들을 잊지 않게 일기를 조금 자주 써야겠습니다 :)
'IT > AWS Lambda & Resources Trouble Shooting' 카테고리의 다른 글
키네시스 샤드 input event driven 인/디코딩 데이터 정제 람다함수 (0) | 2020.10.16 |
---|---|
AWS System Manager / SSM을 이용한, 머신 컨트롤링 스크립트 (0) | 2020.10.14 |
AWS 람다 SAM 배포 75GB 용량 이슈 (0) | 2020.05.21 |
AWS Fan-out 람다를 이용한 Security Group 제어 (0) | 2020.05.21 |
AWS 태그 네이밍 람다 스크립트 트러블슈팅 일지 (0) | 2020.05.19 |