메이크 백엔드 신규 입사자 교육을 위한 레포지토리입니다.
+---- Front-end ----+ +--------+ +-- Auto Scaling Group (Blue)--+ +------+
| +-------+ | | Fire | | +-- EC2 --+ +-- EC2 --+ | | S3 +<---+
| | APP + +<-->+ Base | +--->+ | Docker | | Docker | +<---+ +---+--+ |
| +-------+ | | Auth | +---------+ +-------------+ | | +---------+ +---------+ | | | |
| +------+ | +--------+ | Route | | Application | | +------------------------------+ | +----+---+ |
| | MAKE | | +--------->+ 53 +--->+ Load +---+ +<--+ Code | |
| +------+ | | MAKE | (DNS) | | Balancer | | +-- Auto Scaling Group(Green)--+ | | Deploy +<--+
| +---------+ | | +---------+ +-------------+ | | +-- EC2 --+ +-- EC2 --+ | | +--------+ |
| | Block | | | +--->+ | Docker | | Docker | +<---+ Deploy! |
| | Editor | +---->+ | +---------+ +---------+ | +--make.functions-++
| | (WEB) | | | Sales +-------------------+----------+ | Git Actions +
| +---------+ | | +---------+ ^ +------------------+
| +-----------+ | | | API | +--------+ +--- RDS1 ---+ +--- RDS2 -+-+
| | Education | | +--->+ Gateway +<--->+ Lambda +<--->+ PostgreSQL | | PostgreSQL |
| +-----------+ | +---------+ +---+----+ +------------+ +------------+
| +-------+ | Deploy! |
| | Admin | | +---+- sales.functions --+
| +-------+ | | Git Actions |
+-------------------+ +------------------------+
💡 본 미션을 진행하기전 IAM 계정을 발급받았는지 확인해주세요.
본사의 서비스는 AWS의 클라우드 인프라를 활용하여 구축하고 있습니다.
MAKE의 서버아키텍처를 직접 만들어볼까요?
Mission 1 아키텍처
+---------+ +-------------+ +----------+ +---EC2----+
| Route | | Application | | Target | | |
| 53 +--->+ Load +--->+ groups +--->+ App |
| (DNS) | | Balancer | | | | |
+---------+ +-------------+ +----------+ +----------+
[닉네임].make-api.co/hello 로 get 요청을 보내면 "Hello World"로 응답하는 간단한 서버 api를 만들어 봅시다.
최종적으로 위의 Mission 1 아키텍처가 완성됩니다.
- 서버 API를 개발합니다.
- 서버는 NestJS 또는 원하시는 프레임워크를 사용해도 무방합니다.
- NestJS를 처음 사용하는 경우
- 공식문서를 참고합니다.
- 또는, 카일의 NestJS 강의 섹션 3까지 수강 후에 다음 단계를 진행합니다.
- NestJS를 처음 사용하는 경우
/hello GET
요청을 보내면 "Hello World"로 응답하는 API를 개발합니다.healthy GET
요청을 보내면 200 상태 코드로 응답하는 Health check를 위한 API를 개발합니다.
- 서버는 NestJS 또는 원하시는 프레임워크를 사용해도 무방합니다.
- EC2 인스턴스를 생성하고 서버를 배포합니다.
- EC2 인스턴스 이미지는 Ubuntu Server 20.04 LTS를 사용합니다.
- 인스턴스 유형은 t2.nano를 사용합니다.
- VPC와 서브넷은 각각 make-server::vpc와 make-server::public-subnet을 사용합니다.
- 보안 그룹은 직접 생성해서 사용합니다.
- 그 외 기타 설정은 기본값을 사용하되 필요에 따라 변경할 수 있습니다.
- 인스턴스 내부 셋팅은 "밑바닥부터 우분투 서버 셋팅하기"를 참고합니다.
- [닉네임].make-api.co 의 형태로 서브도메인을 구성합니다. (ex: danny.make-api.co)
- *.make-api.co 도메인에 이미 SSL 인증은 적용되어 있습니다.
- 대상그룹에서 위에서 배포한 EC2 인스턴스를 대상으로 등록합니다.
- 로드밸런서에서 대상그룹으로 라우팅하도록 설정합니다.
- 로드밸랜서를 사용해서 HTTP 요청을 HTTPS로 리디렉션 하도록 리스너 규칙을 설정합니다.
- NestJs (TypeScript)
- EC2
- Route53 (DNS)
- AWS Certificate Manager
- Elastic Load Balancing (ALB)
본사의 서비스는 무중단 배포 자동화와, CPU 사용량에 따른 오토스케일링이 적용되어 있습니다.
원활환 서비스 제공을 위한 환경조성이 목적인데요. 직접 이 환경을 구성해봅시다.
Missoin 2-1 아키텍처
+-----------+
+--------------> | S3 bucket |
| +-----------+
| |
| v
+--------+ +----------------+ +-----------------+ +--------EC2--------+
| GitHub | ----> | GitHub Actions | ----> | AWS Code Deploy | ----> | Code Deploy Agent |
+--------+ +----------------+ +-----------------+ +-------------------+
Github Actions와 AWS CodeDeploy를 사용하여 자동 배포를 환경을 구축합니다.
- Code Deploy 배포 그룹 설정
- Code Deploy에서 onboarding 애플리케이션을 사용합니다.
CodeDeploy > Application > onboarding
- 서비스 역할은 make-server-codeDeploy-role을 사용합니다.
- 배포 유형은 현재 위치를 사용합니다.
- 환경 구성은 Missoin 1에서 작업한 EC2 인스턴스를 사용합니다.
- 그 외 설정은 기본값을 사용합니다.
- Code Deploy에서 onboarding 애플리케이션을 사용합니다.
- Github Action Config
- S3 bucket은 make-server-ci-cd 를 사용합니다.
- 소스 파일을 배포할 S3의 위치는
s3://make-server-ci-cd/onboarding/
입니다.
- Code Deploy Agent 설치
- aws configure 설정은 본인의 IAM 계정을 사용합니다. (권한 요청해주세요.)
- Code Deploy 설정 완료
- appspec.yml 파일을 작성해 주세요.
Missoin 2-2 아키텍처
+-- Auto Scaling Group (Blue)--+ +------+
| +-- EC2 --+ +-- EC2 --+ | | S3 +<---+
+ | | | | + <---+ +---+--+ |
| +---------+ +---------+ | | | |
+------------------------------+ | +----+---+ |
+<--+ Code | |
+-- Auto Scaling Group (Green)-+ | | Deploy +<--+
| +-- EC2 --+ +-- EC2 --+ | | +--------+ |
+ | | | | + <---+ |
| +---------+ +---------+ | +-----------------++
+------------------------------+ | Git Actions +
+------------------+
CPU 사용량이 70프로 이상 유지될 경우 오토스케일링을 시작합니다.
AWS CodeDeploy와 오토스케일링을 사용하여 무중단 블루/그린 배포를 환경을 구축합니다.
- 오토 스케일링 그룹 생성
- Mission 1에서 만든 EC2 인스턴스로 AMI 이미지를 생성합니다.
- 시작 템플릿을 생성합니다.
- 오토 스케일링 그룹의 네트워크 설정은 Missoin 1과 동일합니다.
- 그룹 크기 설정은 최대 용량은 2, 원하는 용량, 최소 용량을 1로 설정합니다.
- 동적 크기 조정 정책을 평균 CPU 사용률 70으로 설정합니다.
- Code Deploy 배포 그룹 설정 변경
- 배포 유형을 블루/그린 으로 수정 합니다.
- 환경 구성은 Amazon EC2 Auto Scaling 그룹 자동 복사를 선택하고 위에서 생성한 오토 스케일링 그룹을 선택합니다.
- 배포 설정에서 원본 인스턴스 종료 시간은 5분으로 설정합니다.
- 로드 밸런서는 Mission 1에서 설정한 값을 사용합니다.
- 그 외 설정은 기본값을 사용합니다.
- Target groups
- EC2 AMI, 시작 템플릿
- Auto Scaling
- CodeDeploy
-
카일의 NestJS 강의
섹션 4 - 1강
요구사항에 해당하는 프로젝트 개발합니다.- DB 또는 ORM은 자유롭게 선택해도 무방합니다.
- 필요시에
섹션 4
~섹션 6
수강합니다. - 프론트엔드 코드는 해당 강의 공지사항을 확인해주세요.
-
Typescript
-
NestJS 기본 지식, 웹 레이어 패턴들, DB 기본
CEO Monday는 개발팀의 고충을 알기 위해 직접 웹사이트를 만들었지만, 사람들이 방문하는지 알 수 없었습니다.
그래서 자신의 사이트에 누군가가 접속을 하면 DB에 기록되는 API가 필요하다고 생각하고 이를 신입 개발자에게 맡기기로 합니다.
- nodejs 기반의 serverless framework 템플릿을 구성하고 기본 환경을 배포합니다.
- 텝플릿은 aws node js 템플릿을 사용하며, ts로 변경하여 사용해도 됩니다.
- 서비스 명은 back-onboarding-[닉네임]으로 지정합니다.
- 레포지토리를 따로 마련하여 'develop', 'master' 브랜치를 구성하고, gitflow를 준수합니다.
- 오프라인에서 해당 서비스를 실행해보고 정상동작이 될 경우 deploy 합니다.
/connect GET
요청이 들어올 경우 Request 정보를 저장하는 API를 구축합니다.- 템플릿 초기 설정시 만들어진 핸들러를 참고하여 해당 API를 구축해봅니다.
- AWS 콘솔은 VPC, Subnet, EIP 등의 생성을 위해서만 사용하고, 서버리스에 관한 세부 설정은 코드에서 처리하도록 합니다.
- 환경 변수는
.env
,.env.dev
,.env.prod
로 분할하여 구성하며, 절대 레포지토리에 업로드 하지 않습니다. - DB는 sales DB의 onboarding-[닉네임]을 사용합니다.
- DB 스키마의 형태는 자유롭게 설정합니다.
- GitActions 를 이용하여 CD를 구축합니다.
.env
파일을 CD 스크립트로 구성합니다.- 환경 변수들은 secrets를 이용하여 저장합니다.
- develop 은 dev 스테이지에 master 는 prod 스테이지에 올라가도록 합니다.
"오늘 하실건가요?" "뭘요?" 오늘도 Jack은 '금알못(금요일을 알차게 보내는 건 못참지)'을 기억하지 못했습니다.
이쁨을 받고 싶었던 신입개발자는 저번 미션을 기반으로 '금알못'알림이를 만들려고 합니다.
금알못은 매주 금요일 오후 7시에 시작하는 사내 모임입니다. 슬랙으로 10분전에 알림을 주도록 해봅시다.
- 매주 금요일 KST 오후 6시 50분에 슬랙에 알림이 가는 스케쥴러를 구현합니다.
- AWS 콘솔은 배포가 되었는지 확인하는 용도로 사용하고, 세부 설정은 코드상에서 해결하도록 합니다.
- 슬랙 알림의 형태는 자유롭게 설정합니다.
- 기존에 진행했던 레포지토리에 이어서 핸들러를 구현합니다.
- 같은 레포에 구성하되 환경변수는 핸들러에 따라 구분하여 배포하도록 설정합니다.
- serverless Framework
- AWS Lambda
- 금😎 알못