Home - 100-hours-a-week/KTB4-3rd-CLOUD GitHub Wiki

KTB4-3rd CLOUD Wiki

๋ชจ์—ฌํƒ€(ํŒ๊ต ์ถœํ‡ด๊ทผ ํƒ์‹œยท๋™ํ–‰ ๋งค์นญ ์„œ๋น„์Šค) ์˜ ํด๋ผ์šฐ๋“œ ์ธํ”„๋ผ ์„ค๊ณ„ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค. ์„œ๋น„์ŠคยทํŒ€ ๊ฐ€์ •์—์„œ ์ถœ๋ฐœํ•ด V1(EC2 + Docker Compose) ๊ตฌ์ถ•, CI/CD, SLI/SLO ์ •์˜, ๋ถ€ํ•˜ ์ธก์ •์œผ๋กœ ์ฐพ์€ V1์˜ ํ•œ๊ณ„, V2(ECS ๊ธฐ๋ฐ˜ ํ™•์žฅ) ์„ค๊ณ„๊นŒ์ง€ ์ž‘์—… ์ˆœ์„œ๋Œ€๋กœ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ๋ฌธ์„œ ์ œ๋ชฉ์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ๋ฌธ์„œ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ๋ฅผ ์ฝ๋‹ค๊ฐ€ ๋‹ค๋ฅธ ๋ฌธ์„œ๋กœ ๋„˜์–ด๊ฐˆ ๋•Œ๋Š” ์˜ค๋ฅธ์ชฝ ์‚ฌ์ด๋“œ๋ฐ”๋‚˜ ์ด ํŽ˜์ด์ง€์˜ ๋ชฉ์ฐจ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.


๋ชฉ์ฐจ

# ์ž‘์—… ๋ถ„๋ฅ˜ ์ง„ํ–‰ ๋‹จ๊ณ„ ๋ฌธ์„œ ์ˆ˜
0 ์„œ๋น„์Šค์™€ ํŒ€ ์šด์˜ ๊ฐ€์ • 1๋‹จ๊ณ„ 4
1 V1 ์ธํ”„๋ผ ์„ค๊ณ„์™€ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ ๊ตฌ์ถ• 1๋‹จ๊ณ„ 7
2 CI ํŒŒ์ดํ”„๋ผ์ธ ์„ค๊ณ„ 2๋‹จ๊ณ„ 1
3 CD ํŒŒ์ดํ”„๋ผ์ธ ์„ค๊ณ„ 3๋‹จ๊ณ„ 1
4 ์‹ ๋ขฐ์„ฑ ์ง€ํ‘œ ์ •์˜ CUJ์™€ SLI SLO 1๋‹จ๊ณ„ 2
5 V2 ํ™•์žฅ ๊ฐ€์ •๊ณผ V1 ๋ถ€ํ•˜ ์ธก์ • 4๋‹จ๊ณ„ 11
6 V2 ์ธํ”„๋ผ ์„ค๊ณ„ 4๋‹จ๊ณ„ 7
7 V2 ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ์žฅ์•  ์•Œ๋ฆผ 5๋‹จ๊ณ„ 2

๋ฌธ์„œ ํ๋ฆ„

flowchart LR
    A["0. ์„œ๋น„์Šค์™€ ํŒ€ ๊ฐ€์ •<br/>DAUยทRPSยท์˜ˆ์‚ฐ"] --> B["1. V1 ์ธํ”„๋ผ<br/>EC2 + Compose"]
    B --> C["2. CI"]
    C --> D["3. CD"]
    A --> E["4. CUJ ยท SLI/SLO"]
    E --> F["5. V2 ํ™•์žฅ ๊ฐ€์ •<br/>V1 ๋ถ€ํ•˜ ์ธก์ •"]
    D --> F
    F --> G["6. V2 ์ธํ”„๋ผ<br/>CloudFrontยทALBยทECSยทRDSยทRedis"]
    G --> H["7. ๋ชจ๋‹ˆํ„ฐ๋งยท์žฅ์•  ์•Œ๋ฆผ<br/>PLG + Alloy ยท Discord"]
Loading

์ฒ˜์Œ ์ฝ๋Š”๋‹ค๋ฉด ์ถ”์ฒœ ์ˆœ์„œ

  1. ์„œ๋น„์Šค ๋ฌธ์ œ์™€ ์ œ๊ณต ๊ฐ€์น˜ ๊ฐ€์ • โ†’ ์‚ฌ์šฉ์ž ์ƒํ™ฉ๊ณผ ํ–‰๋™ ๊ธฐ๋ฐ˜ RPS ๊ฐ€์ •: ์„œ๋น„์Šค๊ฐ€ ๋ฌด์—‡์ด๊ณ  ํŠธ๋ž˜ํ”ฝ์ด ์–ผ๋งˆ์ธ์ง€
  2. V1 ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„: V1์ด ์™œ ๋‹จ์ผ EC2 + Docker Compose์ธ์ง€
  3. V1 ํ•ต์‹ฌ ์‚ฌ์šฉ์ž ์—ฌ์ •๋ณ„ SLI/SLO ์ •์˜: ๋ฌด์—‡์„ ๊ธฐ์ค€์œผ๋กœ ํ’ˆ์งˆ์„ ํŒ๋‹จํ•˜๋Š”์ง€
  4. V2 ์„œ๋น„์Šค ํ™•์žฅ ๊ฐ€์ • ๋ฐ V1์˜ ํ•œ๊ณ„ ์ง€์ : ๋ถ€ํ•˜ ์ธก์ •์œผ๋กœ ๋ฌด์—‡์ด ๋จผ์ € ๋ฌด๋„ˆ์กŒ๋Š”์ง€
  5. V2 ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธํ”„๋ผ ์„ค๊ณ„: ๊ทธ๋ž˜์„œ V2๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ”๊พธ๋Š”์ง€

0. ์„œ๋น„์Šค์™€ ํŒ€ ์šด์˜ ๊ฐ€์ •

์ธํ”„๋ผ ๊ฒฐ์ •์˜ ์ถœ๋ฐœ์ ์ด ๋˜๋Š” ํŒ€ ๊ทœ๋ชจยท์˜ˆ์‚ฐยท์‹œ์žฅยทํŠธ๋ž˜ํ”ฝ ๊ฐ€์ •์ž…๋‹ˆ๋‹ค. ์ดํ›„ ๋ชจ๋“  ๋ฌธ์„œ์˜ ์ˆ˜์น˜ ๊ทผ๊ฑฐ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋‚˜์˜ต๋‹ˆ๋‹ค.

๋ฌธ์„œ ์š”์•ฝ ํ•ต์‹ฌ ์ˆ˜์น˜ยท๊ฒฐ์ •
ํŒ€ ์šด์˜ ๊ตฌ์กฐ์™€ ์‹คํ–‰ ์ œ์•ฝ ๊ฐ€์ • 6์ธ ์Šคํƒ€ํŠธ์—…์˜ ์—ญํ•  ๋ถ„๋‹ด, V1~V3 ์ผ์ •, ๋ฐฐํฌ ๋นˆ๋„, V1์—์„œ ๊ฐ๋‹น ๊ฐ€๋Šฅํ•œ ์šด์˜ ๋ณต์žก๋„๋ฅผ ์ •์˜ ์ธํ”„๋ผ 1๋ช… ยท ์˜ˆ์‚ฐ 3๊ฐœ์›” 90๋งŒ ์› ยท Prod ์ฃผ 1ํšŒ / Dev ์ˆ˜์‹œ ๋ฐฐํฌ
์„œ๋น„์Šค ๋ฌธ์ œ์™€ ์ œ๊ณต ๊ฐ€์น˜ ๊ฐ€์ • ์ถœํ‡ด๊ทผยท์‹ฌ์•ผ ์ด๋™ ์‚ฌ์šฉ์ž์˜ ๋ฌธ์ œ, ํŽ˜๋ฅด์†Œ๋‚˜, ๋ชจ์ง‘์ž/์ฐธ์—ฌ์ž ์—ญํ• , V1์—์„œ ๊ฒ€์ฆํ•  ํ•ต์‹ฌ ๊ฐ€์น˜์™€ ๊ธฐ๋Šฅ ๋ฒ”์œ„ ํƒ์ƒ‰ โ†’ ์ฐธ์—ฌ โ†’ ์ฑ„ํŒ… โ†’ ์ •์‚ฐ์„ ํ•˜๋‚˜์˜ ํ๋ฆ„์œผ๋กœ
์ดˆ๊ธฐ ํƒ€๊นƒ ์‹œ์žฅ๊ณผ ์‹œ์žฅ ๊ฒ€์ฆ ๊ฐ€์ • ํŒ๊ต ํ…Œํฌ๋…ธ๋ฐธ๋ฆฌ๋ฅผ ์ดˆ๊ธฐ ์ง€์—ญ์œผ๋กœ ์ •ํ•œ ์ด์œ , TAMยทSAMยทSOM ์‚ฐ์ •, MAUยทDAU ์ •์˜์™€ ์‹œ๋‚˜๋ฆฌ์˜ค TAM 83,465๋ช… ยท SAM ์•ฝ 54,169๋ช… ยท ์ดˆ๊ธฐ ๋„๋‹ฌ ์•ฝ 8,315๋ช…
์‚ฌ์šฉ์ž ์ƒํ™ฉ๊ณผ ํ–‰๋™ ๊ธฐ๋ฐ˜ RPS ๊ฐ€์ • ์‚ฌ์šฉ์ž ์ƒํ™ฉยทํ”Œ๋กœ์šฐยท์˜ˆ์™ธ ํ”Œ๋กœ์šฐ๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ํ–‰๋™์„ ์กฐํšŒ/์“ฐ๊ธฐ/์‹ค์‹œ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์œผ๋กœ ๋‚˜๋ˆ  ์ดˆ๊ธฐ RPS๋ฅผ ์‚ฐ์ถœ ํ”ผํฌ ์กฐํšŒ ์•ฝ 1.25 RPS ยท ๋งค์นญยท์ •์‚ฐ ์•ฝ 0.075 RPS

โฌ† ๋ชฉ์ฐจ๋กœ


1. V1 ์ธํ”„๋ผ ์„ค๊ณ„์™€ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ ๊ตฌ์ถ•

๋น„์šฉ๊ณผ ์šด์˜ ์ธ๋ ฅ ์ œ์•ฝ ์•„๋ž˜์—์„œ V1์„ EC2 1๋Œ€ + Docker Compose ๋กœ ๋น ๋ฅด๊ฒŒ ๋„์šฐ๊ธฐ ์œ„ํ•œ ์„ค๊ณ„์™€ ๊ตฌ์ถ• ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค.

๋ฌธ์„œ ์š”์•ฝ ํ•ต์‹ฌ ์ˆ˜์น˜ยท๊ฒฐ์ •
์„œ๋ฒ„ ๊ตฌ์„ฑ Nginx ๋‹จ์ผ ์ง„์ž…์ , EC2 1๋Œ€ ์•ˆ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ถ„๋ฆฌ, Dev/Prod ์ธ์Šคํ„ด์Šค ๋ถ„๋ฆฌ, DB ์ปจํ…Œ์ด๋„ˆ ๋ถ„๋ฆฌ๋ฅผ ๊ฒฐ์ • Nginx โ†’ Next.js / Spring Boot / FastAPI
Docker Compose ์šด์˜ ์ธ์Šคํ„ด์Šค ์ŠคํŽ™ ์„ ์ •, ์ปจํ…Œ์ด๋„ˆ๋ณ„ CPUยท๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ, ๋„์ปค ๋„คํŠธ์›Œํฌ ๋ถ„๋ฆฌ, ์˜์กด์„ฑยท์žฌ์‹œ์ž‘ยท์‹คํ–‰ ์ˆœ์„œ, ์ด๋ฏธ์ง€ ํƒœ๊ทธ ๋ฐฉ์‹ Dev t3.medium ยท Prod t3.medium + swap ยท ์•ฑ/DB ๋„คํŠธ์›Œํฌ ๋ถ„๋ฆฌ
V1 ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ Public Subnet ์„ ํƒ(NAT ๋น„์šฉ ํšŒํ”ผ), Dev/Prod ๋ณด์•ˆ ๊ทธ๋ฃน, IAM, CloudWatch ๋กœ๊ทธ, S3 ๋ฐฑ์—…, Nginx ๋ผ์šฐํŒ… ๊ตฌ์กฐ NAT ์›” ์•ฝ $86 ์ ˆ๊ฐ ยท Prod๋Š” SSM ์ ‘์†
์ดˆ๊ธฐ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ ๊ตฌ์ถ• ๋งˆ์ผ์Šคํ†ค๋ณ„ ์‹ค์ œ ๊ตฌ์ถ• ๊ธฐ๋ก: M1 Dockerfile(๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€), M2 AWS ๋ฆฌ์†Œ์ŠคยทCompose ์‹คํ–‰ ํ™˜๊ฒฝ๊ณผ ๋ธŒ๋žœ์น˜ยทํƒœ๊ทธ ์ •์ฑ…, M3 CI/CD(GitHub Actions โ†’ ECR โ†’ EC2) OIDC ์—ฐ๋™ ยท Discord Webhook ์‹คํŒจ ์•Œ๋ฆผ
Docker Compose ๊ธฐ๋ฐ˜ ๋ฐฐํฌ ๋งˆ์ผ์Šคํ†ค V1์˜ ์ด๋ฏธ์ง€, Compose ์‹คํ–‰ ํ™˜๊ฒฝ, CI/CD๋ฅผ M1~M3 ๋งˆ์ผ์Šคํ†ค์œผ๋กœ ๋‚˜๋ˆ  ๋‹จ๊ณ„๋ณ„ ์™„๋ฃŒ ์กฐ๊ฑด๊ณผ ์‚ฐ์ถœ๋ฌผ์„ ์ •์˜ M1 Dockerfile ยท M2 ComposeยทNginx ยท M3 ECR publishยทSSM deployยทrollback
V1 ์•„ํ‚คํ…์ฒ˜ IaC ์ž…๋ ฅ ๋ช…์„ธ V1 ์•„ํ‚คํ…์ฒ˜ ๊ฒฐ์ •์„ Terraform ๋ฆฌ์†Œ์Šคยท๋ณ€์ˆ˜ยทIAM ๊ถŒํ•œยท๋ฏธ๊ฒฐ์ • ๊ฐ’์œผ๋กœ ๋‚˜๋ˆˆ ์ž…๋ ฅ ๋ช…์„ธ ๊ฐ’ ์ƒํƒœ๋ฅผ ํ™•์ • / ์ดˆ๊ธฐ ๊ถŒ์žฅ / ๊ฒฐ์ • ํ•„์š”๋กœ ๊ตฌ๋ถ„
MySQL SSM ์ ‘๊ทผ ๊ตฌ์„ฑ ์Šคํ”„๋ฆฐํŠธ ๋ฐฑ๋กœ๊ทธ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ DB ํฌํŠธ๋ฅผ ๊ณต๊ฐœํ•˜์ง€ ์•Š๊ณ  ๊ฐœ์ธ IAM User์™€ SSM ํฌํŠธํฌ์›Œ๋”ฉ์œผ๋กœ Dev MySQL์— ์ ‘์†ํ•˜๋Š” ๊ตฌ์„ฑ ๋ฃจํ”„๋ฐฑ 3306 ๋ฐ”์ธ๋”ฉ ยท moyeota_dev_rw ์—ญํ• (DMLยทDDL)

โฌ† ๋ชฉ์ฐจ๋กœ


2. CI ํŒŒ์ดํ”„๋ผ์ธ ์„ค๊ณ„

๋ฌธ์„œ ์š”์•ฝ ํ•ต์‹ฌ ์ˆ˜์น˜ยท๊ฒฐ์ •
CI ํŒŒ์ดํ”„๋ผ์ธ ์„ค๊ณ„ FEยทBEยทAI ๋…๋ฆฝ ๋ ˆํฌ์˜ PR ๊ธฐ๋ฐ˜ CI, ๋ณ€๊ฒฝ ์˜ํ–ฅ๋„์— ๋”ฐ๋ฅธ ํŠธ๋ฆฌ๊ฑฐ, ๋ธŒ๋žœ์น˜(fix/hotfix) ์ •์ฑ…, ์‹คํŒจ ์ฒ˜๋ฆฌ, ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์™€ ํƒœ๊ทธยท์ˆ˜๋ช…์ฃผ๊ธฐ ์ •์ฑ…, Build โ†’ Test โ†’ Image Build โ†’ Push ๋‹จ๊ณ„ ๋นŒ๋“œ 10๋ถ„ ์ด๋‚ด ยท ECR Private + ์ปค๋ฐ‹ SHA Immutable ํƒœ๊ทธ + SemVer ๋ฆด๋ฆฌ์ฆˆ ํƒœ๊ทธ + Lifecycle Policy

โฌ† ๋ชฉ์ฐจ๋กœ


3. CD ํŒŒ์ดํ”„๋ผ์ธ ์„ค๊ณ„

๋ฌธ์„œ ์š”์•ฝ ํ•ต์‹ฌ ์ˆ˜์น˜ยท๊ฒฐ์ •
CD ํŒŒ์ดํ”„๋ผ์ธ ์„ค๊ณ„ Dev/Prod CD ํŒŒ์ดํ”„๋ผ์ธ ๋ถ„๋ฆฌ, ๋ฐฐํฌ ์ „๋žต ๋น„๊ต, ๋ฐฐํฌ ์ „ ๊ฒ€์ฆยท์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋™ยทHealth CheckยทReadinessยทSmoke Test ๊ฒŒ์ดํŠธ, ๋ฐฐํฌ ์‹คํŒจ ์ฒ˜๋ฆฌ, ๋‹จ์ผ EC2 ๊ตฌ์กฐ์˜ ํ•œ๊ณ„ DevยทProd ๋ชจ๋‘ Recreate ๋ฐฐํฌ ยท ๊ฒ€์ฆ๋œ ๋™์ผ ์ด๋ฏธ์ง€๋งŒ Prod๋กœ ์Šน๊ฒฉ

โฌ† ๋ชฉ์ฐจ๋กœ


4. ์‹ ๋ขฐ์„ฑ ์ง€ํ‘œ ์ •์˜ CUJ์™€ SLI SLO

"์„œ๋น„์Šค๊ฐ€ ๋А๋ฆฌ๋‹ค"๋ฅผ ์ˆซ์ž๋กœ ๋งํ•˜๊ธฐ ์œ„ํ•ด, ํ•ต์‹ฌ ์‚ฌ์šฉ์ž ์—ฌ์ •(CUJ)์„ ์ •ํ•˜๊ณ  ์—ฌ์ •๋ณ„ SLI/SLO๋ฅผ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. 5ยท6๋‹จ๊ณ„ ๋ถ€ํ•˜ ์ธก์ •๊ณผ V2 ๋ชฉํ‘œ์˜ ํŒ์ • ๊ธฐ์ค€์ด ๋ฉ๋‹ˆ๋‹ค.

๋ฌธ์„œ ์š”์•ฝ ํ•ต์‹ฌ ์ˆ˜์น˜ยท๊ฒฐ์ •
V1 ํ•ต์‹ฌ ์‚ฌ์šฉ์ž ์—ฌ์ •(CUJ) ์ •์˜ SLI โ†’ SLO โ†’ SLA ๊ด€๊ณ„๋ฅผ ์ •๋ฆฌํ•˜๊ณ , Core/Signature/Delight ๊ฒฝํ—˜์œผ๋กœ ๋‚˜๋ˆ  V1์˜ ํ•ต์‹ฌ ์‚ฌ์šฉ์ž ์—ฌ์ •์„ ๋„์ถœ ์ฐธ์—ฌ์ž: ํƒ์ƒ‰ โ†’ ์ƒ์„ธ โ†’ ์ฐธ์—ฌ โ†’ ์ฑ„ํŒ… / ๋ชจ์ง‘์ž: ๊ฒฝ๋กœ ์ž…๋ ฅ โ†’ ๋“ฑ๋ก โ†’ ์ˆ˜๋ฝ โ†’ ์ฑ„ํŒ…
V1 ํ•ต์‹ฌ ์‚ฌ์šฉ์ž ์—ฌ์ •๋ณ„ SLI/SLO ์ •์˜ ๋™ํ–‰๋ชจ์ง‘ ์ฐธ์—ฌ์žยท๋ชจ์ง‘์ž, ํƒ์‹œํŒŸ ๋งค์นญ 3๊ฐœ CUJ์˜ API ๊ฒฝ๋กœ, ์ธก์ • ์œ„์น˜, Good/Bad event ๊ธฐ์ค€๊ณผ V1 ์ดˆ๊ธฐ SLO ๊ฐ€์šฉ์„ฑ 99.9%(28์ผ ์•ฝ 40๋ถ„) ยท ์กฐํšŒ p95 โ‰ค 1์ดˆ ยท ์“ฐ๊ธฐ p95 โ‰ค 1.5์ดˆ ยท ์ •ํ•ฉ์„ฑ 100%

โฌ† ๋ชฉ์ฐจ๋กœ


5. V2 ํ™•์žฅ ๊ฐ€์ •๊ณผ V1 ๋ถ€ํ•˜ ์ธก์ •

V2 ์„ฑ์žฅ ๋ชฉํ‘œ๋ฅผ ์„ธ์šฐ๊ณ , V1 ๊ตฌ์กฐ์— ๋ถ€ํ•˜๋ฅผ ๊ฑธ์–ด ์–ด๋””๊ฐ€ ๋จผ์ € ํฌํ™”๋˜๋Š”์ง€ ์‹ค์ธกํ•œ ๋ฌธ์„œ๋“ค์ž…๋‹ˆ๋‹ค. 6๋‹จ๊ณ„ V2 ์„ค๊ณ„์˜ ๊ทผ๊ฑฐ์ž…๋‹ˆ๋‹ค.

๋ฌธ์„œ ์š”์•ฝ ํ•ต์‹ฌ ์ˆ˜์น˜ยท๊ฒฐ์ •
V2 ์„œ๋น„์Šค ํ™•์žฅ ๊ฐ€์ • ๋ฐ V1์˜ ํ•œ๊ณ„ ์ง€์  V2 ๊ธฐ๋Šฅ(ํ˜ผ์žก๋„ยท์ •์‚ฐ AI)๊ณผ 6๊ฐœ ์—…๋ฌด์ง€๊ตฌ ํ™•์žฅ ๊ฐ€์ •, V2 ์šด์˜ SLO์™€ ๊ฒ€์ฆ ์‹œ๋‚˜๋ฆฌ์˜ค, V1 ๋ถ€ํ•˜ ์ธก์ • ๊ฒฐ๊ณผ(Nginx OOM, HikariCP ๋Œ€๊ธฐ์—ด ํฌํ™”, ์ขŒ์„ยทํƒ์‹œํŒŸ ๊ฒฝํ•ฉ) DAU 24๋ฐฐ ยท ํ”ผํฌ 91 RPS ยท ํ–‰์‚ฌ ์ค‘์ฒฉ 225.5 RPS ยท WebSocket 1,800 ์—ฐ๊ฒฐ
V1 ์‚ฌ์šฉ์ž ์—ฌ์ • ๊ธฐ๋ฐ˜ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ์„ค๊ณ„ S1 ์กฐํšŒ ์ฆ๊ฐ€, S2ยทS3 WebSocket ์—ฐ๊ฒฐยท์ฑ„ํŒ… ์ €์žฅ, S4 ์ธ๊ธฐ ํŒŸ ์ขŒ์„ ๊ฒฝํ•ฉ, S5 ํ˜ผํ•ฉยทํ–‰์‚ฌ ์ŠคํŒŒ์ดํฌ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ SLI ํŒ์ •ยท์›์ธ ๋ถ„์„ ์ง€ํ‘œ k6 ์‹œ๋‚˜๋ฆฌ์˜ค ยท CUJ 3์ข… ๋ถ„๋‹น 12ํšŒ์”ฉ ์‹œ์ž‘
V1 Socket ์„œ๋ฒ„ ๋ถ€ํ•˜ ์ธก์ • WebSocket ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝยท์œ ์ง€์™€ STOMP ๋ฉ”์‹œ์ง€ ์ €์žฅยท์ „๋‹ฌ ๊ฒฝ๋กœ ์‹ค์ธก. 1์ฐจ ํ•œ๊ณ„๋Š” ๋ฉ”์‹œ์ง€ ์ €์žฅ์ด ์•„๋‹Œ ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ ๊ตฌ๊ฐ„์—์„œ ๋ฐœ์ƒ ๋ชฉํ‘œ 36 msg/s ์ค‘ 8.66 msg/s ยท ์—ฐ๊ฒฐ ์‹คํŒจ ํ›„ OOM Kill ยท V2 ์‹œ์ž‘ ์ŠคํŽ™ 0.5 vCPU / 1 GiB ร— 3๋Œ€
V1 Docker Compose ๊ตฌ์กฐ์˜ ํ•œ๊ณ„ ๋ถ„์„ V1์˜ ํ˜„์žฌ ๊ตฌ์กฐ์™€ ๋ถ€ํ•˜ ์ธก์ •์œผ๋กœ ํ™•์ธํ•œ ํ•œ๊ณ„, V2 ์„ฑ์žฅ ์‹œ ๋“œ๋Ÿฌ๋‚˜๋Š” ๊ตฌ์กฐ์  ํ•œ๊ณ„๋ฅผ ์ •๋ฆฌํ•ด V2 ์ธํ”„๋ผ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋„์ถœ t3.medium 1๋Œ€์— CPU 2.00 ์ „๋Ÿ‰ ๋ฐฐ๋ถ„ ยท RESTยทWebSocket์ด ํ•œ JVM ยท HikariCP 10

โฌ† ๋ชฉ์ฐจ๋กœ


6. V2 ์ธํ”„๋ผ ์„ค๊ณ„

5๋‹จ๊ณ„์—์„œ ์ฐพ์€ ํ•œ๊ณ„ ์ง€์ ๋ณ„๋กœ V2 ๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ •ํ•œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

๋ฌธ์„œ ์š”์•ฝ ์ตœ์ข… ๊ฒฐ์ •
V2 Nginx ์ธํ”„๋ผ ์„ค๊ณ„ 0.15 vCPUยท64 MiB Nginx ํ•˜๋‚˜์— ๋ชจ๋“  ์—ฐ๊ฒฐ ๋น„์šฉ์ด ๋ชฐ๋ฆฌ๊ณ  ํ˜ธ์ŠคํŠธ ๋‹จ์œ„๋กœ ์žฅ์• ๊ฐ€ ์ „ํŒŒ๋˜๋Š” ํ•œ๊ณ„๋ฅผ ๋ถ„์„, ์ง„์ž…์  ๋Œ€์•ˆ ๋น„๊ต CloudFront โ†’ ALB(ACM) โ†’ ECS, Nginx ์ œ๊ฑฐ
V2 DB ์ธํ”„๋ผ ์„ค๊ณ„ MySQL ์กฐํšŒยท์ฑ„ํŒ… ์ €์žฅยท์ธ๊ธฐ ํŒŸ ๊ฒฝํ•ฉ ์‹ค์ธก. ๋ณ‘๋ชฉ์€ DB CPU๊ฐ€ ์•„๋‹Œ ์ปค๋„ฅ์…˜ ์ ์œ ์™€ hot-row ๊ฒฝํ•ฉ โ†’ ๋‹จ์ผ writer OLTP๋กœ ํŒ๋‹จ RDS for MySQL Single-AZ (db.t4g.small)
V2 ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธํ”„๋ผ ์„ค๊ณ„ RESTยทWebSocket์ด ํ•œ JVM์„ ๊ณต์œ ํ•ด ๊ผฌ๋ฆฌ ์ง€์—ฐ์ด ์ „ํŒŒ๋˜๋Š” ๋ฌธ์ œ๋กœ ๋‘ ์„œ๋น„์Šค๋ฅผ ๋ถ„๋ฆฌ, ์‹คํ–‰ ํ™˜๊ฒฝยท๋น„์šฉยทtask ์ŠคํŽ™ ์‚ฐ์ • ECS on EC2 + Spot ยท REST t3.small ร— 2, WebSocket t3.small ร— 3
V2 WebSocket ๋ฉ”์‹œ์ง€ ๋ฒ„์Šค์™€ Redis ๋„์ž… ์„ค๊ณ„ ์„œ๋น„์Šค ๋ถ„๋ฆฌ ํ›„ Simple Broker๋กœ๋Š” ์ธ์Šคํ„ด์Šค ๊ฐ„ ์ „๋‹ฌ์ด ์•ˆ ๋˜๋Š” ๋ฌธ์ œ, Redis ์šฉ๋„ยท์ด๋ฒคํŠธ ๊ณ„์•ฝยท์ „๋‹ฌ ๋ณด์žฅ๊ณผ ์žฅ์•  ์ฒ˜๋ฆฌ Redis Pub/Sub ๋ฅผ fan-out ๊ฒฝ๋กœ๋กœ ๋„์ž…, ์›๋ณธ์€ MySQL
V2 ECS ๊ธฐ๋ฐ˜ ์ „์ฒด ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ V1 Compose๋ฅผ ์Šคํ…Œ์ด์ง€๋ณ„ ECS on EC2 ๋‹ค์ค‘ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ „ํ™˜. ProdยทNon-Prod ALB, ์„œ๋น„์Šค๋ณ„ ASG(Capacity Provider), Redis Pub/Sub, RDS devยทstgยทprod ํด๋Ÿฌ์Šคํ„ฐ ร— restยทwebsocketยทfrontendยทfastapi ์„œ๋น„์Šค ยท ๊ธฐ์ค€ ์šฉ๋Ÿ‰ On-Demand + REST Spot
ECS Task Auto Scaling ์ •์ฑ… (์ž‘์„ฑ ์ค‘) ์ถœํ‡ด๊ทผ ์‹œ๊ฐ„๋Œ€ ํŠธ๋ž˜ํ”ฝ ํŽธ์ฐจ์— ๋งž์ถ˜ ASGยทECS Service Auto Scaling ์ •์ฑ… ํ‰์‹œ 3.9 RPS โ†” ์ถœํ‡ด๊ทผ ํ‰๊ท  45.5 RPS(11.7๋ฐฐ) ยท ์ˆœ๊ฐ„ ํ”ผํฌ 91 RPS
V2 DB ๋ฌด์ค‘๋‹จ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์„ค๊ณ„ V1 MySQL ์ปจํ…Œ์ด๋„ˆ ๋ฐ์ดํ„ฐ๋ฅผ RDS๋กœ ์˜ฎ๊ธฐ๋Š” ๋ฐฉ์‹ ๋น„๊ต, ์‹คํ–‰ ์ ˆ์ฐจ, stg ๋ฆฌํ—ˆ์„ค ์ธก์ • ํ•ญ๋ชฉ ์ฝ๊ธฐ ์ „์šฉ ์ „ํ™˜ + mysqldump ์ผ๊ด„ ์ด๊ด€ ยท ์“ฐ๊ธฐ ์ค‘๋‹จ ์ˆ˜ ์ดˆ ยท RDS 8.4.11

โฌ† ๋ชฉ์ฐจ๋กœ


7. V2 ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ์žฅ์•  ์•Œ๋ฆผ

V2๋ฅผ ์šด์˜ํ•˜๋ฉด์„œ ์žฅ์• ๋ฅผ ์‚ฌ์šฉ์ž๋ณด๋‹ค ๋จผ์ € ์•Œ๊ธฐ ์œ„ํ•œ ๊ด€์ธกยท์•Œ๋ฆผ ์„ค๊ณ„์ž…๋‹ˆ๋‹ค.

๋ฌธ์„œ ์š”์•ฝ ์ตœ์ข… ๊ฒฐ์ •
V2 ์ค‘์•™ ์ง‘์ค‘์‹ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ์„ค๊ณ„ V2 ์š”๊ตฌ์‚ฌํ•ญ์—์„œ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ๋‹ตํ•  ์งˆ๋ฌธ, ๊ตฌ์กฐ ํ›„๋ณด 4๊ฐœ ๋น„๊ต, ๋กœ๊ทธยท๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘ ๋ฐฉ์‹๊ณผ V2 ๊ตฌ์กฐ ์•ˆ์˜ ๋ฐฐ์น˜ PLG(PrometheusยทLokiยทGrafana) + Alloy, ํŠธ๋ ˆ์ด์Šค๋Š” Sentry ยท ๋ชจ๋‹ˆํ„ฐ๋ง EC2 1๋Œ€
V2 ์„œ๋น„์Šค ์žฅ์•  ์•Œ๋ฆผ ์ฒด๊ณ„ ์„ค๊ณ„ ์š”์ฒญ ๊ฒฝ๋กœ์˜ ์žฅ์•  ํŒ๋‹จ ์ง€์  6๊ณณ, CloudWatchยทGrafana ๋‘ ์•Œ๋ฆผ ๊ฒฝ๋กœ, ๊ทœ์น™ยท์ฑ„๋„ ๋ผ์šฐํŒ…ยท์ผœ๋Š” ์ˆœ์„œ CloudWatch Alarm โ†’ EventBridge โ†’ Discord + Grafana ๊ทœ์น™ 6๊ฐœ ยท prod page๋Š” #incident

โฌ† ๋ชฉ์ฐจ๋กœ

โš ๏ธ **GitHub.com Fallback** โš ๏ธ