Cloud & Infra WIKI - 100-hours-a-week/9-team-Devths-WIKI GitHub Wiki
โ๏ธ Cloud & Infrastructure Architecture
[์์ฑ ๊ท์น]
- Why & Trade-off: ๋ชจ๋ ๊ธฐ์ ์ ์์ฌ๊ฒฐ์ ์๋ [์ฃผ์ฅ - ๋ ผ๋ฆฌ - ๊ทผ๊ฑฐ]๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค.
- Context: "์ฐ๋ฆฌ ์๋น์ค์ ํธ๋ํฝ/ํน์ฑ์ ์ ์ด๊ฒ์ด ์ต์ ์ธ๊ฐ"๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
- History: ์ํคํ ์ฒ๊ฐ ๋ณํํ๋ ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ๊ธฐ๋กํ์ฌ, ์๋น์ค ์ฑ์ฅ์ ๋ฐ๋ฅธ ์ธํ๋ผ ํ์ฅ ๋ฅ๋ ฅ์ ๋ณด์ ๋๋ค.
1. ๋จ๊ณ๋ณ ์ค๊ณ ๋ฌธ์ (Assignment Details)
๊ณผ์ ์๊ตฌ์ฌํญ์ ๋ง์ถฐ ์์ฑ๋ ์์ธ ์ค๊ณ ๋ฌธ์๋ค์ ๋๋ค. (์ ๋ชฉ ํด๋ฆญ ์ ์์ธ ํ์ด์ง๋ก ์ด๋)
๐ [Step 1] Big Bang ๋ฐฉ์ ์์์ ๋ฐฐํฌ ์ค๊ณ
- ์ํฉ: ์ด๊ธฐ ๊ฐ๋ฐ ๋จ๊ณ, ๋ฐฐํฌ ์๋ํ ๋ถ์ฌ
- Pain Point: ๋ฐฐํฌ ์ 5๋ถ ๋ค์ดํ์ ๋ฐ์, ์ฌ๋์ด ์ง์ ๋ช ๋ น์ด ์ ๋ ฅํ๋ค ์ค์ ๋ฐ์ ๊ฐ๋ฅ์ฑ ๋์
- Why Manual?: ์ด๊ธฐ ์ธํ๋ผ ๊ตฌ์กฐ ๋จ์ํ ๋ฐ ๋น ๋ฅธ ๊ฐ๋ฐ ํ๊ฒฝ ์ธํ ์ ์ํจ
๐ [Step 2] CI(์ง์์ ํตํฉ) ํ์ดํ๋ผ์ธ ๊ตฌ์ถ ์ค๊ณ
- ๋์ ๋ฐฐ๊ฒฝ: ํ์ ์ธ์ ์ฆ๊ฐ๋ก ์ธํ ์ฝ๋ ์ถฉ๋ ๋ฐ ๋น๋ ์คํจ ๋น๋ฒ, ์ฝ๋ ํ์ง ์ ํ ์ฐ๋ ค
- ํด๊ฒฐ ๋ฐฉ์: GitHub Actions ๋์ , PR ์ ์๋ ๋น๋/ํ ์คํธ ๊ฐ์ ํ
๐ [Step 3] CD(์ง์์ ๋ฐฐํฌ) ํ์ดํ๋ผ์ธ ๊ตฌ์ถ ์ค๊ณ
- ๋์ ๋ฐฐ๊ฒฝ: ์ฆ์ ๋ฐฐํฌ ์๊ตฌ์ฌํญ, ์๋ ๋ฐฐํฌ ํผ๋ก๋ ์ฆ๊ฐ, ํด๋จผ ์๋ฌ ๋ฐฉ์ง
- ๋ฐฐํฌ ์ ๋ต: Rolling Update (๋๋ Blue/Green)
- ๊ธฐ๋ ํจ๊ณผ: ๋ฒํผ ํด๋ฆญ ํ ๋ฒ์ผ๋ก ๋ฐฐํฌ ์๋ฃ, ๋ฌธ์ ๋ฐ์ ์ ์ฆ์ ๋กค๋ฐฑ ๊ฐ๋ฅ
๐ [Step 4] Docker ์ปจํ ์ด๋ํ ๋ฐฐํฌ
- ๋์ ๋ฐฐ๊ฒฝ: ํ๊ฒฝ ๋ถ์ผ์น๋ก ์ด์๊ฐ ๋ฐ๋ณต๋๊ณ , ์๋ฒ ์๋ ์ธํ ์ด ๋ง์ ๋ฐฐํฌ ์ค์/ํผ๋ก๋๊ฐ ํผ.
- ๋ฐฐํฌ ์ ๋ต: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ก ํ์คํํด ECR์ ์ ์ฅํ๊ณ , ๊ฐ ํ๊ฒฝ์์ ์คํ
- ๊ธฐ๋ ํจ๊ณผ: ๋ฐฐํฌ๊ฐ ๋ ์ผ๊ด์ /๋น ๋ฅด๊ณ , ํ์ฅ/๋กค๋ฐฑ์ด ์ฌ์์ง.
๐ [Step 5] Kubeadm ์ค์ผ์คํธ๋ ์ด์ ์ค๊ณ
- ๋์ ๋ฐฐ๊ฒฝ:
- ๋ฐฐํฌ ์ ๋ต:
- ๊ธฐ๋ ํจ๊ณผ:
2. ์ธํ๋ผ ๊ฐ์ (Overview)
| ํญ๋ชฉ | ๋ด์ฉ | ๋น๊ณ |
|---|---|---|
| Cloud Provider | AWS (Amazon Web Services) | |
| Region / Zone | ap-northeast-2 (Seoul) | Zone a, c ์ฌ์ฉ |
| Domain | devths.com |
Route53 ๊ด๋ฆฌ |
| Server OS | Ubuntu 22.04 LTS | |
| Infra ๋ด๋น์ | david.lee(์ด๋์ฐ), henry.myeong(๋ช ํ์ฑ) |
3. ๊ธฐ์ ์คํ ๋ฐ ์ ์ ์ด์ (Tech Stack & Trade-offs)
| ๋ถ๋ฅ | ๊ธฐ์ ์คํ | ์ ์ ์ด์ (Why) | ๋์ ๋น๊ต ๋ฐ ํ๊ณ (Trade-off) |
|---|---|---|---|
| Compute | AWS EC2 | ํธ๋ํฝ ์์ธก์ด ์ด๋ ต๊ณ , ์ธ๋ฐํ ์๋ฒ ์ค์ ์ด ํ์ํ์ฌ ์ ํ | vs Lambda: Cold Start ๋ฌธ์ ์ ์คํ ์๊ฐ์ ํ์ผ๋ก ๋ฐฐ์ vs ECS: ์ด๊ธฐ ์ค์ ๋ณต์ก๋ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ธฐ ์ํด EC2 ์ฐ์ ๋์ |
| Database | MySQL 8.0 | ๊ด๊ณํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๋ช ํํ๊ณ ํธ๋์ญ์ ๊ด๋ฆฌ๊ฐ ์ค์ํจ | vs MongoDB: ์ ํํ๋ ๋ฐ์ดํฐ๋ผ NoSQL๋ณด๋ค RDBMS๊ฐ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ์ ์ ๋ฆฌ |
| CI/CD | GitHub Actions | ์ฝ๋ ์ ์ฅ์์ ํตํฉ์ด ์ฉ์ดํ๊ณ ๋ณ๋ ์๋ฒ ๊ตฌ์ถ ๋น์ฉ ์์ | vs Jenkins: ๋ณ๋ ๋ง์คํฐ ๋ ธ๋ ๊ด๋ฆฌ ๋น์ฉ ๋ฐ ํ์ต ๊ณก์ ์ด ๋์ ๋ฐฐ์ |
| Storage | AWS S3 | ์ ์ ํ์ผ(์ด๋ฏธ์ง)์ ๋์ ๋ด๊ตฌ์ฑ๊ณผ ์ ๋ ดํ ๋ณด๊ด ๋น์ฉ | vs EBS: ์น ์๋ฒ ๋ค์คํ ์ ํ์ผ ๊ณต์ ๊ฐ ์ด๋ ต๊ณ ์ฉ๋ ํ์ฅ์ด ๋ฒ๊ฑฐ๋ก์ |
๐ ๊ธฐ์ ์คํ ์ ์ ๊ทผ๊ฑฐ ๋๋ณด๊ธฐ
4. ์ธํ๋ผ ์ํคํ ์ฒ (Architecture Diagram)
4.1. ํ์ฌ ์ํคํ ์ฒ (Current Architecture)
[Version 1.0] ํ์ฌ ์ด์ ์ค์ธ ์ต์ข ์ํคํ ์ฒ ๊ตฌ์ฑ๋์ ๋๋ค.
- ์ฃผ์ ํน์ง:
- Public Subnet์ Bastion Host ๋ฐฐ์น
- Private Subnet์ WAS ๋ฐ DB ๋ฐฐ์น๋ก ๋ณด์ ๊ฐํ
- ...
4.2. ์ํคํ ์ฒ ๋ณ์ฒ์ฌ (History)
์๋น์ค ํ์ฅ๊ณผ ๊ณผ์ ์งํ ๋จ๊ณ์ ๋ฐ๋ผ ์ํคํ ์ฒ๊ฐ ์ด๋ป๊ฒ ๋ฐ์ ํ๋์ง ๊ธฐ๋กํฉ๋๋ค.
๐[Step 1] V1 ์คํ๋ฆฐํธ ์งํ์ํฉ: ๋จ์ผ EC2, ํ๋ก์ธ์ค ๊ธฐ๋ฐ, Nginx, S3+Code Deploy ๊ธฐ๋ฐ ๋ฐฐํฌ
๐[Step 2] V2 ์คํ๋ฆฐํธ ์งํ์ํฉ: ๋ค์ค ์ธ์คํด์ค, Docker, ALB ๋์
๐[Step 3] V3 ์คํ๋ฆฐํธ ์งํ์ํฉ: ์ฟ ๋ฒ๋คํฐ์ค ์ ์ฉ
5. ํ์ฌ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ (CI/CD Pipeline)
5.1. ํ๋ก์ธ์ค ํ๋ฆ๋
5.2. ํ์ดํ๋ผ์ธ ์์ธ ๋ช ์ธ
| ๋จ๊ณ | Trigger ์กฐ๊ฑด | ์ํ ์์ (Jobs) | ์ฐ์ถ๋ฌผ (Artifact) | ๋น๊ณ |
|---|---|---|---|---|
| CI (ํตํฉ) | dev ๋ธ๋์น Push |
1. Java 21 Setup2. Gradle Build3. Unit Test ์คํ | Docker Image (Tag: dev-${sha}) | ์คํจ ์ Discord ์๋ฆผ |
| CD (๋ฐฐํฌ) | main ๋ธ๋์น Merge |
1. AWS Credentials ์ค์ 2. S3 ์ ๋ก๋ (CodeDeploy)3. Deploy Trigger | ์๋น์ค ๋ฐฐํฌ ์๋ฃ | ๋ฌด์ค๋จ ๋ฐฐํฌ ์ ์ฉ |
๐[Step 1] V1 CICD: S3+Code Deploy ๊ธฐ๋ฐ ๋ฐฐํฌ
๐[Step 2] V2 CICD: ECR+Code Deploy ๊ธฐ๋ฐ ๋ฐฐํฌ
๐[Step 3] V3 CICD: Helm+ArgoCD ๊ธฐ๋ฐ ๋ฐฐํฌ
6. ๋ณด์ ๋ฐ ๋คํธ์ํฌ ์ ๋ต (Security & Network)
๊ณผ์ ์๊ตฌ์ฌํญ์ ๋ง์ถฐ ์์ฑ๋ ์์ธ ์ค๊ณ ๋ฌธ์๋ค์ ๋๋ค. (์ ๋ชฉ ํด๋ฆญ ์ ์์ธ ํ์ด์ง๋ก ์ด๋)
๐ ์ธํ๋ผ ์ ๊ทผ ์ ์ด ๋ฐฉ์
๐ ์ต์ ๊ถํ ์์น ๊ธฐ๋ฐ IAM ์ค๊ณ ๋ฌธ์
7. ์ฅ์ ๋์ ๋ฐ ๋ถํํ ์คํธ, ๋ชจ๋ํฐ๋ง (Monitoring & LoadTest)
๋ชจ๋ํฐ๋ง ๋ฐ ์ฅ์ ์ ๋ํด์ ์์ฑ๋ ๋ฌธ์๋ค์ ๋๋ค.
๐[๊ณตํต]SLI/SLO ๋ฌธ์
- ์์ฝ: ์๋น์ค ์งํ(V1~V3)์ ๋ฐ๋ฅธ ๋จ๊ณ๋ณ SLI/SLO ์งํ ์ค์ ๋ฐ ๋ณ๊ฒฝ ์ด๋ ฅ์ ๋๋ค.
๐[Step 1] V1 ๋ชจ๋ํฐ๋ง: ๋จ์ผ EC2, CloudWatch ๊ธฐ๋ฐ ๋ฐฐํฌ
- ์์ฝ: ๋จ์ผ ์ธ์คํด์ค ํ๊ฒฝ์์ AWS CloudWatch๋ฅผ ํ์ฉํ ๊ธฐ์ด ๋ชจ๋ํฐ๋ง ๊ตฌ์ถ ๊ณผ์ ์ ๋ค๋ฃน๋๋ค.
๐[Step 2] V2 ๋ชจ๋ํฐ๋ง: ๋ค์ค ์ธ์คํด์ค, ์ค์ ์ง์ค์ ๋ชจ๋ํฐ๋ง ๋์
- ์์ฝ: Prometheus์ Grafana๋ฅผ ๋์ ํ์ฌ ๋ถ์ฐ๋ ์๋ฒ์ ์งํ๋ฅผ ํตํฉ ๊ด๋ฆฌํ๋ ๊ณผ์ ์ ์ค๋ช ํฉ๋๋ค.
๐[Step 3] V3 ๋ชจ๋ํฐ๋ง: ์ฟ ๋ฒ๋คํฐ์ค ์ ์ฉ
- ์์ฝ: K8s ํด๋ฌ์คํฐ ํ๊ฒฝ์ ์ต์ ํ๋ ๋ชจ๋ํฐ๋ง ์ฒด๊ณ์ ์ปจํ ์ด๋ ๊ธฐ๋ฐ ๋ฉํธ๋ฆญ ์์ง ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค.
8. ๋ง์ด๊ทธ๋ ์ด์
๐V1 DB ๋ง์ด๊ทธ๋ ์ด์ : AWS DMS ํ์ฉํ ๋ง์ด๊ทธ๋ ์ด์
- ์์ฝ: EC2์ ์๋ DB๋ฅผ RDS๋ก AWS DMS๋ฅผ ํ์ฉํ์ฌ ๋ง์ด๊ทธ๋ ์ด์ ์ ์งํ
** DB ๋ฌด์ค๋จ ๋ง์ด๊ทธ๋ ์ด์ (Henry)**
- ์์ฝ: PostgreSQL์ logical replica ๊ธฐ๋ฅ์ ์ด์ฉํ ๋ฌด์ค๋จ ๋ง์ด๊ทธ๋ ์ด์ ์งํ
9. ํธ๋ฌ๋ธ์ํ (Troubleshooting Log)
์ธํ๋ผ/๋ฐฐํฌ ๊ด๋ จ ์ฅ์ ๋ฐ์ ๋ฐ ํด๊ฒฐ ๊ธฐ๋ก