AWS의 Serverless 서비스들을 활용하여
단 하나의 서버도 없이 데이터를 수집하고 분석한다.
사용하는 AWS 서비스
- AWS Lambda
- Amazon S3
- Amazon Athena
- AWS Glue
- Amazon CloudWatch
- Amazon QuickSight
AWS의 Serverless 서비스들을 활용하여
단 하나의 서버도 없이 데이터를 수집하고 분석한다.
사용하는 AWS 서비스
- AWS Lambda
- Amazon S3
- Amazon Athena
- AWS Glue
- Amazon CloudWatch
- Amazon QuickSight
2018년 11월 26일 COEX에서 진행된 HTML5 Conference 발표 자료입니다. 실제 현장에서 발표한 자료와는 다소 차이가 있을 수 있습니다.
본 발표는 AWS S3, SPA, VueJS 등을 통해 구축한 Serverless 환경을 소개합니다. 발표는 한종원님이 진행해주셨습니다.
어느 해커쏜에 참여한 백엔드 개발자들을 위한 교육자료
쉽게 만든다고 했는데도, 많이 어려웠나봅니다.
제 욕심이 과했던 것 같아요. 담번엔 좀 더 쉽게 !
- 독자 : 백엔드 개발자를 희망하는 사람 (취준생, 이직 희망자), 5년차 이하
- 주요 내용 : 백엔드 개발을 할 때 일어나는 일들(개발팀의 일)
- 비상업적 목적으로 인용은 가능합니다. (출처 명기 필수)
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례Jeongsang Baek
대부분의 중소 모바일 게임 업체는 앱을 잘 만들기에도 시간이 모자라 출시일을 잘 맞추기 급급한 상황이다. 그러다 보니 운영을 위한 툴은 소홀히 개발하는 경우가 대부분이고 운영 캠페인은 날림으로 개발하거나 그때 그때 개발자가 필요한 부분만 개발하기 일쑤다. 그러다보니 마케터는 결국 늘 개발자 눈치만 살피게 된다. 필자는 블루윈드에서 이러한 문제를 절감했고 '모바일 게임 개발사가 앱 개발에만 집중할 수 있게 해주고 싶다'는 IGAworks의 철학에 공감하여 라이브 오퍼레이션 프로젝트를 시작하게 되었다.
라이브 오퍼레이션의 개발 중점과제는 5가지였다. 첫번째, 다수의 개발사가 하나의 큰 클라우드 시스템을 사용하도록 multi-tenant 인프라를 구축해야 한다. 두번째, TCO(Total cost of ownership)를 최소화해야 한다. 세번째, 앱의 핵심유저를 실시간으로 그룹화하여 타게팅 캠페인을 할 수 있어야 한다. 네번째, 캠페인의 성과를 마케터에게 실시간으로 피드백해야 한다. 다섯째, 3개월 안에 정식 서비스가 되어야 한다는 점이었다. (왜 우리에게 주어지는 시간은 늘 3개월인가) 그리고 당연하지만 이 서비스를 혼자 개발해야 했다.
이 다섯가지 이슈를 해결하기 위하여 AWS 클라우드 상에 생산성과 성능이 검증된 node.js 와 mongodb를 이용하여 서비스 백엔드를 구성하였고, multi-tenant를 구성하기 위한 여러가지 고민과 그 해결책을 직접 구현하였다. 필자는 node.js와 mongodb를 사용해 본 경험이 충분하다 생각했지만 대규모 정식 서비스를 진행하며 많은 함정에 빠졌고 결국 해결했다.
이 발표를 통해 청강자는 node.js와 mongodb를 이용하여 multi-tenant 인프라를 구축해야 할 때 고려해야 할 설계 방식과 기술적인 고민, 그것에 대한 현실적인 해법을 얻을 수 있다.
9. 웹크롤러 개발
•인기있는 링크를 추출하는 크롤러 개발
•포털에서 인기있는 링크
•Youtube 에서 현재 가장 인기 있는 콘텐츠의 링크
•블로그에서 인기있는 콘텐츠 링크
•RSS 에서 새로 등록된 링크
•등등등 매우 유연한 링크 추출기
•추출한 링크를 봇 계정을 활용하여 서비스에 포스팅
10. 크롤러가 필요한데…
•기존 DB 구조가 변경되어도 영향이 없으면 좋겠다
•기존 DB 성능에 영향이 없으면 좋겠다.
•기존 코드에 영향을 안주는 MSA 였으면 좋겠다.
•Deploy, test 가 너무 늦지 않게 바로 반영되면 좋겠다.
•밥먹을 돈도 빠듯한데 저렴하면 좋겠다.
11. 당시 Architecture
•MSA 를 추구
•Rest API, Auth, Batch, Resource 등등
•Main DB는 RDB: Postgresql
•배포 및 관리는 Elastic Beanstalk
•Dev, Staging, Production 개발환경 완비!
•작은 스타트업이지만..
23. •이미 crawler batch 서버를 거의다 개발한 상태
•개발한 코드를 그대로 쓸 수 있어야 했음
•Lambda가 Python3을 지원 안했다가 갑자기 함
•크롤링 은 상시 하는 것이 아니고 주기적으로 함
•Cron 처럼 event 발생 기능
•Crawling 실패시 이유와 적절한 alarm 기능
•block 당한건지, page가 깨진건지 원인을 알아야함
•비용을 줄이기 위해서 sleep 등 할 수 없음
•링크를 추출하는 목적만 추구하도록 유연한 개발
25. 다시 보는 요구사항…
•기존 DB 구조가 변경되어도 영향이 없으면 좋겠다
•기존 DB 성능에 영향이 없으면 좋겠다.
•기존 코드에 영향을 안주는 MSA 였으면 좋겠다.
•Deploy, test 가 너무 늦지 않게 바로 반영되면 좋겠다.
•밥먹을 돈도 빠듯한데 저렴하면 좋겠다.
26. DynamoDB 추가
•상수에 가까운 응답시간을 보장하여 Lambda와 궁합이 좋음
•기존 ORM 에 영향 받지 않고 동적인 schema
•기존 RDB 성능에 관여하지 않음
•프로비저닝된 처리량으로 과금하는 독특한 정책
•현재는 “온디맨드 용량 모드 요금” 추가
•약간의 비용이 추가되지만 사용하기에 따라 저렴함
28. DynamoDB 문제
•프로비저닝된 처리량으로 과금하는 독특한 정책
•Dynamodb Pricing
•Write 가 갑자기 급격히 많아져서 warning 발생
•그렇다고 Write Unit 을 올리기는 아까움
•그렇다고 매번 auto scaling 하는것은 매우 번거로움
•어떻게하면 delay 해서 write 할까?
•Sleep
•SQS Delay
30. Lambda Deploy
•수많은 Serverless Framework가 있었음
•Python Framework(2017기준)
•Zappa ★5K
•Apex ★6K
•aws/chalice(찰리스) ★3K
•Serverless ★20K (Node.js를 몰라서..)
•각각 특징이 있기 때문에 상황에 따라 선택
•Zappa가 Django를 바로 붙일 수 있다고 해서 Zappa 선택
38. 변경된 구조의 장점
•링크를 추출하는 crawling 로직만 집중 할 수 있어서 lambda
function이 간결해짐
•Architecture 2의 경우 SNS, SQS, Lambda 디버깅 하기 어
려웠지만, batch에서 관리하여 디버깅이 용이
•배치에서 sleep 등을 얼마든지 쓸 수 있어서 dynamodb cap.
맞추기 용이
47. 정리
•개발했던 서비스의 구조는 MSA
•각각의 모듈을 EB를 통해 관리, 비효율적인 모듈 존재
•링크를 추출하는 크롤링 기능 구현 필요
•요금, DB영향도, decoupling 을 고려한 크롤러 구현
•요구사항이 복잡해짐에 따라 크롤링 하는 모든 부분을
serverless 구조로 할 수 없었음
•Serverless is fancy
•그러나 충분한 POC가 필요하고 Serverless 에 맞는 설계도 필
수
•기다리면 AWS에서 답을 주기도 함…