├── .github ├── pull_request_template.md ├── auto_assign.yml └── pr-title-checker-config.json ├── .gitignore └── README.md /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## 업무 배경 2 | 3 | > 업무 이유, 목적, 이슈 등 업무의 배경을 간단하게 1줄 요약 합니다. 4 | 5 | - *** 6 | 7 | ## TO BE 8 | 9 | > 수정 or 추가, 개발 될 내용에 대해서 1줄로 간단히 작성합니다. 10 | 11 | - 12 | 13 | ## Link 14 | 15 | - Jira: 16 | -------------------------------------------------------------------------------- /.github/auto_assign.yml: -------------------------------------------------------------------------------- 1 | addReviewers: true 2 | 3 | addAssignees: author 4 | 5 | reviewers: 6 | - amamov 7 | - JungJinuk 8 | - moosongsong 9 | - Jiwook00 10 | 11 | skipKeywords: 12 | - wip 13 | 14 | numberOfReviewers: 0 15 | -------------------------------------------------------------------------------- /.github/pr-title-checker-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "LABEL": { 3 | "name": "title needs formatting", 4 | "color": "EEEEEE" 5 | }, 6 | "CHECKS": { 7 | "prefixes": ["hotfix/", "release/"], 8 | "regexp": "^\\([a-zA-Z]+\\-[0-9]+\\)", 9 | "ignoreLabels" : ["dont-check-title"] 10 | } 11 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # compiled output 2 | /dist 3 | /node_modules 4 | 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | pnpm-debug.log* 10 | yarn-debug.log* 11 | yarn-error.log* 12 | lerna-debug.log* 13 | 14 | # OS 15 | .DS_Store 16 | 17 | # Tests 18 | /coverage 19 | /.nyc_output 20 | 21 | # IDEs and editors 22 | /.idea 23 | .project 24 | .classpath 25 | .c9/ 26 | *.launch 27 | .settings/ 28 | *.sublime-workspace 29 | 30 | # IDE - VSCode 31 | .vscode/* 32 | !.vscode/settings.json 33 | !.vscode/tasks.json 34 | !.vscode/launch.json 35 | !.vscode/extensions.json 36 | 37 | yarn.lock 38 | package-lock.json 39 | 40 | .env 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🧑‍💻 MAKE ONBOARDING for BACKEND 2 | 3 | 메이크 백엔드 신규 입사자 교육을 위한 레포지토리입니다. 4 | 5 | ## 🗃 우리 서비스는? 6 | 7 | ``` 8 | 9 | +---- Front-end ----+ +--------+ +-- Auto Scaling Group (Blue)--+ +------+ 10 | | +-------+ | | Fire | | +-- EC2 --+ +-- EC2 --+ | | S3 +<---+ 11 | | | APP + +<-->+ Base | +--->+ | Docker | | Docker | +<---+ +---+--+ | 12 | | +-------+ | | Auth | +---------+ +-------------+ | | +---------+ +---------+ | | | | 13 | | +------+ | +--------+ | Route | | Application | | +------------------------------+ | +----+---+ | 14 | | | MAKE | | +--------->+ 53 +--->+ Load +---+ +<--+ Code | | 15 | | +------+ | | MAKE | (DNS) | | Balancer | | +-- Auto Scaling Group(Green)--+ | | Deploy +<--+ 16 | | +---------+ | | +---------+ +-------------+ | | +-- EC2 --+ +-- EC2 --+ | | +--------+ | 17 | | | Block | | | +--->+ | Docker | | Docker | +<---+ Deploy! | 18 | | | Editor | +---->+ | +---------+ +---------+ | +--make.functions-++ 19 | | | (WEB) | | | Sales +-------------------+----------+ | Git Actions + 20 | | +---------+ | | +---------+ ^ +------------------+ 21 | | +-----------+ | | | API | +--------+ +--- RDS1 ---+ +--- RDS2 -+-+ 22 | | | Education | | +--->+ Gateway +<--->+ Lambda +<--->+ PostgreSQL | | PostgreSQL | 23 | | +-----------+ | +---------+ +---+----+ +------------+ +------------+ 24 | | +-------+ | Deploy! | 25 | | | Admin | | +---+- sales.functions --+ 26 | | +-------+ | | Git Actions | 27 | +-------------------+ +------------------------+ 28 | 29 | ``` 30 | 31 | ``` 32 | 💡 본 미션을 진행하기전 IAM 계정을 발급받았는지 확인해주세요. 33 | ``` 34 | 35 | ## ⚽️ MAKE Mission 1 36 | 37 | ### _간단한 서버를 올려보자_ 38 | 39 | 본사의 서비스는 AWS의 클라우드 인프라를 활용하여 구축하고 있습니다.
40 | MAKE의 서버아키텍처를 직접 만들어볼까요?
41 | 42 | **Mission 1 아키텍처** 43 | 44 | ``` 45 | 46 | +---------+ +-------------+ +----------+ +---EC2----+ 47 | | Route | | Application | | Target | | | 48 | | 53 +--->+ Load +--->+ groups +--->+ App | 49 | | (DNS) | | Balancer | | | | | 50 | +---------+ +-------------+ +----------+ +----------+ 51 | 52 | ``` 53 | 54 | #### 📝 요구사항 55 | 56 | ``` 57 | [닉네임].make-api.co/hello 로 get 요청을 보내면 "Hello World"로 응답하는 간단한 서버 api를 만들어 봅시다. 58 | 최종적으로 위의 Mission 1 아키텍처가 완성됩니다. 59 | ``` 60 | 61 | 1. 서버 API를 개발합니다. 62 | 1. 서버는 NestJS 또는 원하시는 프레임워크를 사용해도 무방합니다. 63 | - NestJS를 처음 사용하는 경우 64 | - [공식문서](https://docs.nestjs.com/)를 참고합니다. 65 | - 또는, [카일의 NestJS 강의](https://inf.run/ZJmp) 섹션 3까지 수강 후에 다음 단계를 진행합니다. 66 | 2. `/hello GET` 요청을 보내면 "Hello World"로 응답하는 API를 개발합니다. 67 | 3. `healthy GET` 요청을 보내면 200 상태 코드로 응답하는 Health check를 위한 API를 개발합니다. 68 | 2. EC2 인스턴스를 생성하고 서버를 배포합니다. 69 | 1. EC2 인스턴스 이미지는 **Ubuntu Server 20.04 LTS**를 사용합니다. 70 | 2. 인스턴스 유형은 **t2.nano**를 사용합니다. 71 | 3. VPC와 서브넷은 각각 **make-server::vpc**와 **make-server::public-subnet**을 사용합니다. 72 | 4. 보안 그룹은 직접 생성해서 사용합니다. 73 | 5. 그 외 기타 설정은 기본값을 사용하되 필요에 따라 변경할 수 있습니다. 74 | 6. 인스턴스 내부 셋팅은 ["밑바닥부터 우분투 서버 셋팅하기"](https://www.notion.so/makecoding/b0fc320e9a4c4c01b0abc3fc7c662f52)를 참고합니다. 75 | 3. [닉네임].make-api.co 의 형태로 서브도메인을 구성합니다. (ex: danny.make-api.co) 76 | 1. **\*.make-api.co** 도메인에 이미 SSL 인증은 적용되어 있습니다. 77 | 2. 대상그룹에서 위에서 배포한 EC2 인스턴스를 대상으로 등록합니다. 78 | 3. 로드밸런서에서 대상그룹으로 라우팅하도록 설정합니다. 79 | 4. 로드밸랜서를 사용해서 HTTP 요청을 HTTPS로 리디렉션 하도록 리스너 규칙을 설정합니다. 80 | 81 | #### 🗝 미션 클리어를 위한 선수지식 82 | 83 | - NestJs (TypeScript) 84 | - EC2 85 | - Route53 (DNS) 86 | - AWS Certificate Manager 87 | - Elastic Load Balancing (ALB) 88 | 89 | ## 🏀️ MAKE Mission 2 90 | 91 | ### _무중단 배포와 오토스케일링을 위한 환경을 구성해보자_ 92 | 93 | 본사의 서비스는 무중단 배포 자동화와, CPU 사용량에 따른 오토스케일링이 적용되어 있습니다.
94 | 원활환 서비스 제공을 위한 환경조성이 목적인데요. 직접 이 환경을 구성해봅시다.
95 | 96 | ## Make Missoin 2-1 97 | 98 | **Missoin 2-1 아키텍처** 99 | 100 | ``` 101 | 102 | +-----------+ 103 | +--------------> | S3 bucket | 104 | | +-----------+ 105 | | | 106 | | v 107 | +--------+ +----------------+ +-----------------+ +--------EC2--------+ 108 | | GitHub | ----> | GitHub Actions | ----> | AWS Code Deploy | ----> | Code Deploy Agent | 109 | +--------+ +----------------+ +-----------------+ +-------------------+ 110 | 111 | ``` 112 | 113 | #### 📝 요구사항 114 | 115 | ``` 116 | Github Actions와 AWS CodeDeploy를 사용하여 자동 배포를 환경을 구축합니다. 117 | ``` 118 | 119 | 1. Code Deploy 배포 그룹 설정 120 | 1. Code Deploy에서 onboarding 애플리케이션을 사용합니다. `CodeDeploy > Application > onboarding` 121 | 2. 서비스 역할은 **make-server-codeDeploy-role**을 사용합니다. 122 | 3. 배포 유형은 현재 위치를 사용합니다. 123 | 4. 환경 구성은 **Missoin 1**에서 작업한 **EC2 인스턴스**를 사용합니다. 124 | 5. 그 외 설정은 기본값을 사용합니다. 125 | 2. Github Action Config 126 | 1. S3 bucket은 **make-server-ci-cd** 를 사용합니다. 127 | 2. 소스 파일을 배포할 S3의 위치는 `s3://make-server-ci-cd/onboarding/` 입니다. 128 | 3. Code Deploy Agent 설치 129 | 1. aws configure 설정은 본인의 IAM 계정을 사용합니다. (권한 요청해주세요.) 130 | 4. Code Deploy 설정 완료 131 | 1. appspec.yml 파일을 작성해 주세요. 132 | 133 | ## Make Missoin 2-2 134 | 135 | **Missoin 2-2 아키텍처** 136 | 137 | ``` 138 | 139 | +-- Auto Scaling Group (Blue)--+ +------+ 140 | | +-- EC2 --+ +-- EC2 --+ | | S3 +<---+ 141 | + | | | | + <---+ +---+--+ | 142 | | +---------+ +---------+ | | | | 143 | +------------------------------+ | +----+---+ | 144 | +<--+ Code | | 145 | +-- Auto Scaling Group (Green)-+ | | Deploy +<--+ 146 | | +-- EC2 --+ +-- EC2 --+ | | +--------+ | 147 | + | | | | + <---+ | 148 | | +---------+ +---------+ | +-----------------++ 149 | +------------------------------+ | Git Actions + 150 | +------------------+ 151 | 152 | ``` 153 | 154 | #### 📝 요구사항 155 | 156 | ``` 157 | CPU 사용량이 70프로 이상 유지될 경우 오토스케일링을 시작합니다. 158 | AWS CodeDeploy와 오토스케일링을 사용하여 무중단 블루/그린 배포를 환경을 구축합니다. 159 | ``` 160 | 161 | 1. 오토 스케일링 그룹 생성 162 | 1. **Mission 1**에서 만든 **EC2 인스턴스**로 AMI 이미지를 생성합니다. 163 | 2. 시작 템플릿을 생성합니다. 164 | 3. 오토 스케일링 그룹의 네트워크 설정은 **Missoin 1**과 동일합니다. 165 | 4. 그룹 크기 설정은 **최대 용량은 2**, **원하는 용량**, **최소 용량**을 **1**로 설정합니다. 166 | 5. 동적 크기 조정 정책을 **평균 CPU 사용률 70**으로 설정합니다. 167 | 2. Code Deploy 배포 그룹 설정 변경 168 | 1. 배포 유형을 **블루/그린** 으로 수정 합니다. 169 | 2. 환경 구성은 **Amazon EC2 Auto Scaling 그룹 자동 복사**를 선택하고 위에서 생성한 오토 스케일링 그룹을 선택합니다. 170 | 3. 배포 설정에서 원본 인스턴스 종료 시간은 **5분**으로 설정합니다. 171 | 4. 로드 밸런서는 **Mission 1**에서 설정한 값을 사용합니다. 172 | 5. 그 외 설정은 기본값을 사용합니다. 173 | 174 | #### 🗝 미션 클리어를 위한 선수지식 175 | 176 | - Target groups 177 | - EC2 AMI, 시작 템플릿 178 | - Auto Scaling 179 | - CodeDeploy 180 | 181 | ## ⚾ MAKE Mission 3 182 | 183 | ### _docker를 적용한 환경을 구성해보자_ 184 | 185 | #### 📝 요구사항 186 | 187 | #### 🗝 미션 클리어를 위한 선수지식 188 | 189 | ## 🏐 MAKE Mission 4 190 | 191 | ### _Nestjs로 딴딴한 백엔드 구현하기_ 192 | 193 | #### 📝 요구사항 194 | 195 | - [카일의 NestJS 강의](https://inf.run/ZJmp) `섹션 4 - 1강` 요구사항에 해당하는 프로젝트 개발합니다. 196 | 197 | - DB 또는 ORM은 자유롭게 선택해도 무방합니다. 198 | - 필요시에 `섹션 4` ~ `섹션 6` 수강합니다. 199 | - 프론트엔드 코드는 해당 강의 공지사항을 확인해주세요. 200 | 201 | #### 🗝 미션 클리어를 위한 선수지식 202 | 203 | - Typescript 204 | 205 | - NestJS 기본 지식, 웹 레이어 패턴들, DB 기본 206 | 207 | 208 | ## 🎱️ Bonus Mission 209 | 210 | ### 1. _Lambda에 API 서버를 올려보자_ 211 | 212 | #### 📝 요구사항 213 | 214 | ``` 215 | CEO Monday는 개발팀의 고충을 알기 위해 직접 웹사이트를 만들었지만, 사람들이 방문하는지 알 수 없었습니다. 216 | 그래서 자신의 사이트에 누군가가 접속을 하면 DB에 기록되는 API가 필요하다고 생각하고 이를 신입 개발자에게 맡기기로 합니다. 217 | ``` 218 | 219 | 1. nodejs 기반의 serverless framework 템플릿을 구성하고 기본 환경을 배포합니다. 220 | 1. 텝플릿은 aws node js 템플릿을 사용하며, ts로 변경하여 사용해도 됩니다. 221 | 2. 서비스 명은 back-onboarding-[닉네임]으로 지정합니다. 222 | 3. 레포지토리를 따로 마련하여 'develop', 'master' 브랜치를 구성하고, gitflow를 준수합니다. 223 | 4. 오프라인에서 해당 서비스를 실행해보고 정상동작이 될 경우 deploy 합니다. 224 | 2. `/connect GET` 요청이 들어올 경우 Request 정보를 저장하는 API를 구축합니다. 225 | 1. 템플릿 초기 설정시 만들어진 핸들러를 참고하여 해당 API를 구축해봅니다. 226 | 2. AWS 콘솔은 VPC, Subnet, EIP 등의 생성을 위해서만 사용하고, 서버리스에 관한 세부 설정은 코드에서 처리하도록 합니다. 227 | 3. 환경 변수는 `.env`, `.env.dev`, `.env.prod` 로 분할하여 구성하며, 절대 레포지토리에 업로드 하지 않습니다. 228 | 4. DB는 sales DB의 onboarding-[닉네임]을 사용합니다. 229 | 5. DB 스키마의 형태는 자유롭게 설정합니다. 230 | 3. GitActions 를 이용하여 CD를 구축합니다. 231 | 1. `.env`파일을 CD 스크립트로 구성합니다. 232 | 2. 환경 변수들은 secrets를 이용하여 저장합니다. 233 | 3. develop 은 dev 스테이지에 master 는 prod 스테이지에 올라가도록 합니다. 234 | 235 | ### 2. _Lambda에 스케줄러를 올려보자_ 236 | 237 | ``` 238 | "오늘 하실건가요?" "뭘요?" 오늘도 Jack은 '금알못(금요일을 알차게 보내는 건 못참지)'을 기억하지 못했습니다. 239 | 이쁨을 받고 싶었던 신입개발자는 저번 미션을 기반으로 '금알못'알림이를 만들려고 합니다. 240 | 금알못은 매주 금요일 오후 7시에 시작하는 사내 모임입니다. 슬랙으로 10분전에 알림을 주도록 해봅시다. 241 | ``` 242 | 243 | #### 📝 요구사항 244 | 245 | 1. 매주 금요일 KST 오후 6시 50분에 슬랙에 알림이 가는 스케쥴러를 구현합니다. 246 | 1. AWS 콘솔은 배포가 되었는지 확인하는 용도로 사용하고, 세부 설정은 코드상에서 해결하도록 합니다. 247 | 2. 슬랙 알림의 형태는 자유롭게 설정합니다. 248 | 2. 기존에 진행했던 레포지토리에 이어서 핸들러를 구현합니다. 249 | 1. 같은 레포에 구성하되 환경변수는 핸들러에 따라 구분하여 배포하도록 설정합니다. 250 | 251 | #### 🗝 미션 클리어를 위한 선수지식 252 | 253 | - serverless Framework 254 | - AWS Lambda 255 | - [금😎 알못](https://www.notion.so/makecoding/e33283456b704378884470c09404ca70) 256 | --------------------------------------------------------------------------------