AWS Lambda는 이벤트 기반의 서버리스 컴퓨팅 플랫폼이다. 제한된 CPU, 메모리, 수행 시간을 갖지만 사용한 만큼만 비용을 지불하고 요청량에 맞게 인스턴스가 실행되어 빠르게 확장 및 축소할 수 있다. 그래서 Lambda의 한도와 한계를 이해하고 다룰 수 있다면, 다양한 서비스의 시나리오를 구현하면서도 인프라와 비용 걱정을 크게 줄일 수 있다. 빠른 출시를 결심했거나 토이 프로젝트를 진행할 경우라면 서버리스 플랫폼 사용이 큰 도움이 될 것이다.
이 책은 Lambda를 비롯해 AWS가 제공하는 여러 서버리스 플랫폼을 활용한다. 5가지 서비스 예제를 통해 그 예제 안에서 활용하는 서버리스 플랫폼을 소개하고 직접 실습한다. 이해를 돕기 위해 각 장은 예제에 대한 서비스 소개 및 설계와 구현, 로컬 테스트 환경 구축 및 테스트, 서버리스 스택 배포와 모니터링, 상용 확장을 위해 고민해야 하는 요소와 서버리스 서비스의 한계와 한도, 트래픽 규모를 가정하고 이때 발생하는 비용을 계산한다. 저자의 노하우가 듬뿍 담긴 이 책으로 웹 서비스 개발을 준비해 보자.
Contents
지은이 소개
서문
베타 리더 추천사
1장 준비하기
1-1 AWS 서버리스
___1-1-1 기존의 서버 개발
___1-1-2 서버리스 기반의 서비스 개발
1-2 개발 환경 구축
___1-2-1 AWS 계정 설정
___1-2-2 AWS CLI 설치
___1-2-3 Node.js
___1-2-4 nvm
___1-2-5 타입스크립트
___1-2-6 Visual Studio Code
___1-2-7 direnv
___1-2-8 Docker
___1-2-9 리눅스용 윈도우 하위 시스템(WSL)
1-3 Severless Framework 소개
___1-3-1 간단한 선언 예시
___1-3-2 도구 익히기
2장 Hello API
2-1 Hello API 자바스크립트 구현
2-2 Hello API 타입스크립트 구현
___2-2-1 템플릿으로 시작
___2-2-2 타입스크립트 적용
___2-2-3 웹팩 적용
___2-2-4 source-map 적용
___2-2-5 serverless.ts 사용
2-3 상용 서비스 고려
___2-3-1 서비스 한도
___2-3-2 API Gateway의 한도
___2-3-3 API Gateway 통합 Lambda의 한도
___2-3-4 CloudWatch Logs의 한도
___2-3-5 운영 전략
2-4 모니터링
___2-4-1 Lambda의 로그 확인
___2-4-2 API Gateway의 로그 확인
___2-4-3 Lambda의 지표
___2-4-4 Lambda의 호출 지표
___2-4-5 Lambda의 성능 지표
___2-4-6 Lambda의 동시성 지표
___2-4-7 Lambda의 동시성
___2-4-8 Lambda의 지표 확인
___2-4-9 API Gateway의 지표 확인
___2-4-10 CloudWatch 대시보드 구성
___2-4-11 CloudWatch 경보 설정
2-5 비용 계산
___2-5-1 API Gateway 비용
___2-5-2 Lambda 비용
___2-5-3 Lambda와 EC2의 가격 비교
___2-5-4 Lambda의 메모리와 CPU의 관계
___2-5-5 CloudWatch 비용 계산
___2-5-6 경보 이메일 전송 비용
___2-5-7 Hello API 비용 계산
2-6 정리
3장 사진 최적화 서비스
3-1 서비스 소개 및 설계
3-2 Lambda에서 외부 프로세스 실행 준비
3-3 첫 번째 시스템 구현
___3-3-1 S3와 CloudFront 인프라 준비
___3-3-2 awscli 도구로 인프라 설정
___3-3-3 CloudFormation으로 인프라 선언
___3-3-4 Serverless Framework에 인프라 선언 통합
___3-3-5 S3 Bucket에 파일 업로드
___3-3-6 중복 업로드 막기
3-4 두 번째 시스템 구현: Public, Private, Bucket 분리
3-5 세 번째 시스템 구현: S3 이벤트로 최적화 수행
3-6 상용 서비스 고려
3-7 모니터링
3-8 비용 계산
___3-8-1 S3 비용
___3-8-2 CloudFront 비용
___3-8-3 서비스 비용 계산
___3-8-4 비용 줄이기
3-9 정리
4장 블로그 서비스
4-1 서비스 소개 및 설계
4-2 기본 API 구현
___4-2-1 models.ts 구현
___4-2-2 handler.ts 구현
___4-2-3 storage.ts 구현
4-3 DynamoDB 연동
___4-3-1 자원 선언
___4-3-2 AWS-SDK 라이브러리 추가
___4-3-3 글에 대한 CRUD 구현
___4-3-4 글 목록 구현
___4-3-5 로컬 환경 준비
___4-3-6 Serverless offline
___4-3-7 로컬 DynamoDB 준비
___4-3-8 로컬 테스트
___4-3-9 배포 및 테스트
___4-3-10 정리
4-4 MySQL 연동
___4-4-1 자원 선언
___4-4-2 방화벽 설정
___4-4-3 MySQL 라이브러리 추가
___4-4-4 글에 대한 CRUD 구현
___4-4-5 로컬 테스트
___4-4-6 배포
___4-4-7 MySQL 테이블 작성
___4-4-8 테스트
___4-4-9 정리
4-5 SQLite 연동
___4-5-1 자원 선언
___4-5-2 VPC 설정
___4-5-3 SQLite 라이브러리 추가
___4-5-4 Better SQLite3 준비
___4-5-5 SQLite 기반 쿼리 함수 구현
___4-5-6 잠금 함수 구현
___4-5-7 CRUD 함수 구현
___4-5-8 로컬 S3 준비
___4-5-9 로컬 Redis 준비
___4-5-10 로컬 테스트
___4-5-11 배포
___4-5-12 느린 응답 시간
___4-5-13 응용
___4-5-14 정리
4-6 저장소 비교
___4-6-1 응답 지연 시간
___4-6-2 비용
___4-6-3 유지 보수
___4-6-4 유리한 시나리오
4-7 프런트엔드 연동
___4-7-1 create-react-app
___4-7-2 웹 페이지 설계
___4-7-3 컴포넌트 기본
___4-7-4 서버 API 연동
___4-7-5 컴포넌트 구현
___4-7-6 프록시 서버
___4-7-7 개발 서버 시작
___4-7-8 주소 기반 라우트
___4-7-9 빌드
___4-7-10 로컬 테스트
___4-7-11 서버 주소 문제 해결
___4-7-12 정리
4-8 S3와 CloudFront를 사용해 배포
___4-8-1 서버 API 주소 설정
___4-8-2 CORS 문제 해결
___4-8-3 배포
4-9 CloudFront의 다중 오리진 사용
___4-9-1 서버 API 주소 설정
___4-9-2 배포
___4-9-3 동작 이해
___4-9-4 장점과 단점
4-10 API Gateway에서 웹 페이지 제공
___4-10-1 서버리스 스택 설정
___4-10-2 서버 API 주소 설정
___4-10-3 배포
___4-10-4 도메인 연결
4-11 REST API 사용
___4-11-1 서버리스 스택 변경
___4-11-2 코드 변경
___4-11-3 로컬 테스트
___4-11-4 X-Ray 추가
___4-11-5 X-Ray 지표 분석
___4-11-6 정리
4-12 인증 구현
___4-12-1 Lambda 인증
___4-12-2 함수 구현
___4-12-3 서버리스 스택 변경
___4-12-4 빌드 오류 수정
___4-12-5 CloudFront 수정
___4-12-6 프런트엔드 작업
___4-12-7 테스트
___4-12-8 정리
4-13 상용 서비스 고려
___4-13-1 DynamoDB
___4-13-2 MySQL
___4-13-3 SQLite
___4-13-4 API 요청 횟수 제한
___4-13-5 인증
___4-13-6 CloudFront와 S3
4-14 모니터링
___4-14-1 DynamoDB 모니터링
___4-14-2 MySQL 모니터링
___4-14-3 Redis 모니터링
___4-14-4 인증 실패율
4-15 비용 계산
___4-15-1 시나리오
___4-15-2 시스템 구성
___4-15-3 CloudFront와 S3 오리진 사용
___4-15-4 API Gateway에서 웹 페이지 제공
___4-15-5 API Gateway의 API 요청 처리 비용
___4-15-6 Lambda 권한 부여자 실행 비용
___4-15-7 통합된 Lambda 실행 비용
___4-15-8 DynamoDB 비용
___4-15-9 MySQL 비용
___4-15-10 SQLite 데이터베이스를 위한 S3 비용
___4-15-11 비용 정리
___4-15-12 비용 줄이기
4-16 정리
5장 추천 서비스
5-1 시나리오
___5-1-1 Word2vec
___5-1-2 기반 데이터
5-2 개발 환경 구축
___5-2-1 파이썬 환경 구축
___5-2-2 AWS ECR 로그인
___5-2-3 SAM CLI 설치
5-3 시스템 설계
5-4 학습 구현
___5-4-1 의존 라이브러리 설치
___5-4-2 이벤트 다운로드
___5-4-3 학습
___5-4-4 S3 Bucket 준비
___5-4-5 배포
5-5 추천 API 구현
___5-5-1 추천 구현
___5-5-2 SAM 프로젝트 작성
___5-5-3 로컬 테스트
___5-5-4 배포
___5-5-5 수행 시간 확인
___5-5-6 ECR 리포지토리 관리
5-6 서비스 API 구현
___5-6-1 추적 쿠키 발급 API
___5-6-2 좋아요 횟수 조회 API
___5-6-3 좋아요 API
___5-6-4 VPC에서 SQS 연결
___5-6-5 서버리스 스택 구성
___5-6-6 로컬 테스트
___5-6-7 배포
5-7 웹 페이지 구현
___5-7-1 추적 쿠키 사용
___5-7-2 좋아요 노출
___5-7-3 좋아요 버튼
___5-7-4 추천 목록
___5-7-5 프록시 서버 구성
___5-7-6 로컬 테스트
5-8 CDN 배포
5-9 상용 서비스 고려
___5-9-1 SQS 이벤트 채널
___5-9-2 추천 Lambda의 수행 시간
___5-9-3 AVX2 지원
___5-9-4 모델 파일의 크기
5-10 모니터링
___5-10-1 SQS 모니터링
___5-10-2 ECR 모니터링
___5-10-3 PrivateLink 모니터링
5-11 비용 계산
___5-11-1 시나리오
___5-11-2 고정 비용
___5-11-3 API 비용
___5-11-4 비용 일람
___5-11-5 비용 줄이기
___5-12 정리
6장 채팅
6-1 WebSocket API
6-2 에코
___6-2-1 로컬 테스트
___6-2-2 배포
___6-2-3 라우트 선택 표현식 활용
6-3 채팅 전파
___6-3-1 연결 ID 관리
___6-3-2 메시지 전파
___6-3-3 서버리스 스택 선언
___6-3-4 로컬 테스트
___6-3-5 배포
6-4 주제-구독-전파
___6-4-1 테이블 설계
___6-4-2 DynamoDB 테이블 선언
___6-4-3 DynamoDB 연동 구현
___6-4-4 연결 맺음과 끊음의 처리
___6-4-5 메시지 전파 처리
___6-4-6 사용자 및 주제 생성 API
___6-4-7 함수 등록
___6-4-8 로컬 테스트
___6-4-9 배포
6-5 인증
___6-5-1 Lambda 권한 부여자 구현
___6-5-2 이벤트 처리 함수 수정
___6-5-3 서버리스 스택 수정
___6-5-4 WebSocket API 로깅
6-6 사용자 지정 도메인
6-7 상용 서비스 고려
___6-7-1 채팅 서비스
___6-7-2 이벤트 채널
___6-7-3 WebSocket API의 한계
___6-7-4 글로벌 서비스 고려
6-8 모니터링
___6-8-1 WebSocket API 지표
6-9 비용 계산
___6-9-1 시나리오
___6-9-2 WebSocket 비용
___6-9-3 DynamoDB 비용
___6-9-4 Lambda 비용
___6-9-5 비용 일람
___6-9-6 비용 줄이기
6-10 정리
7장 게임 서버
7-1 온라인 뱀 게임
7-2 VPC
___7-2-1 VPC 인프라 선언
___7-2-2 Redis 인스턴스 선언
___7-2-3 서버리스 스택 선언
___7-2-4 연결성 분석기
7-3 게임 서버 구현
___7-3-1 메시지 정의
___7-3-2 WebSocket 처리 함수 구현
___7-3-3 사용자 지정 도메인 연결
7-4 매칭 구현
___7-4-1 매칭 요청 처리 구현
___7-4-2 매칭 로직 구현
___7-4-3 매칭 수행 및 처리 연장
7-5 게임 구현
___7-5-1 WebSocket 이벤트 전달 구현
___7-5-2 게임 플레이어 구현
___7-5-3 게임 로직 구현
7-6 테스트와 배포
___7-6-1 로컬 테스트
___7-6-2 배포
7-7 웹 클라이언트 구현
___7-7-1 프로젝트 시작
___7-7-2 메시지와 모델 선언
___7-7-3 WebSocket 연결
___7-7-4 컴포넌트 구현
___7-7-5 스타일링
___7-7-6 효율적인 다시 그리기
___7-7-7 로컬 테스트
___7-7-8 웹 클라이언트 배포
7-8 상용 서비스 고려
___7-8-1 VPC의 제약 조건
___7-8-2 WebSocket API의 제약 조건
___7-8-3 Lambda의 수행 시간 제약 조건
___7-8-4 Lambda의 동시 실행 제약 조건
___7-8-5 Redis 유형 검토
___7-8-6 응답 지연 시간 개선
___7-8-7 매칭 개선
7-9 모니터링
___7-9-1 WebSocket API 지표
___7-9-2 Lambda 지표
___7-9-3 Redis 지표
7-10 비용 계산
___7-10-1 시나리오
___7-10-2 VPC 비용
___7-10-3 WebSocket API 비용
___7-10-4 Lambda 비용
___7-10-5 비용 일람
___7-10-6 비용 줄이기
7-11 정리
부록 A 도메인 구입
A-1 Route53에서 도메인 구입
A-2 타사 도메인 연결
A-3 도메인 레코드 세트 추가
A-4 인증서 발급
부록 B 구글 OAuth 구성
B-1 프로젝트 생성
B-2 동의 화면 구성
B-3 클라이언트 ID 생성
Author
최재영
개발자들이 도메인 개발에만 집중할 수 있도록 그 외의 다른 모든 부분을 자동화하는데 관심이 많다. 특히 서비스 개발 초반에 빌드-배포-모니터링 운영 비용을 크게 낮출 수 있는 서버리스의 매력에 푹 빠져 있다. 틈틈이 서버리스 서버 개발자에 도전하고 있다. 블루홀 스튜디오에서 게임 개발자로 경력을 시작한 이후 웹 서비스, 추천 백엔드, 빌링을 거쳐 다시 웹 서비스 업무를 수행하고 있다. 여러 도메인의 백엔드를 개발하며 얻은 경험을 토대로 기존의 백엔드 시스템을 서버리스 기반으로 옮기는 연습을 하기도 한다. 다양한 토이 프로젝트를 AWS Lambda 기반으로 올려 비용을 최적화하는 것을 즐기며 가끔 만나는 지인들에게 서버리스 플랫폼 사용을 권유하는 활동을 한다.
개발자들이 도메인 개발에만 집중할 수 있도록 그 외의 다른 모든 부분을 자동화하는데 관심이 많다. 특히 서비스 개발 초반에 빌드-배포-모니터링 운영 비용을 크게 낮출 수 있는 서버리스의 매력에 푹 빠져 있다. 틈틈이 서버리스 서버 개발자에 도전하고 있다. 블루홀 스튜디오에서 게임 개발자로 경력을 시작한 이후 웹 서비스, 추천 백엔드, 빌링을 거쳐 다시 웹 서비스 업무를 수행하고 있다. 여러 도메인의 백엔드를 개발하며 얻은 경험을 토대로 기존의 백엔드 시스템을 서버리스 기반으로 옮기는 연습을 하기도 한다. 다양한 토이 프로젝트를 AWS Lambda 기반으로 올려 비용을 최적화하는 것을 즐기며 가끔 만나는 지인들에게 서버리스 플랫폼 사용을 권유하는 활동을 한다.