Cloud Design 4th BE - 100-hours-a-week/KTB4-1st-wiki GitHub Wiki

๋ชฉ์ฐจ

  1. ๋ฐฐํฌ ๋‹จ์œ„
  2. ๋ฐฑ์—”๋“œ ์ƒํƒœ๊ฐ’ ๋ถ„๋ฆฌ
  3. ๋ฐฑ์—”๋“œ ์š”๊ตฌ ์„ฑ๋Šฅ
  4. ์ปจํ…Œ์ด๋„ˆ ์šด์šฉ ๋ฐฉ์‹

1. ๋ฐฐํฌ ๋‹จ์œ„ - ๋‹จ๋… ์ธ์Šคํ„ด์Šค

Important

๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋Š” ๋…๋ฆฝ๋œ ์ธ์Šคํ„ด์Šค๋กœ ํ™•์žฅ, ๋ฐฐํฌํ•œ๋‹ค.

1.1 ๊ธฐ์กด v1 ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์ œํ•˜๋ฉด ์•ˆ ๋˜๋Š” ์ด์œ 

๊ฐ ์„œ๋น„์Šค๋ณ„๋กœ ํ™•์žฅํ•ด์•ผ ํ•˜๋Š” ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๋‹ค

ํ”„๋ก ํŠธ, ๋ฐฑ์—”๋“œ, AI, DB๋Š” ๊ฐ๊ฐ ๋ณ‘๋ชฉ ์ง€์ ์ด ๋‹ค๋ฅด๊ณ , ์š”๊ตฌํ•˜๋Š” ์‚ฌ์–‘์ด ๋‹ค๋ฅด๋‹ค. ๊ฐ๊ฐ์˜ ์„œ๋น„์Šค๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์„œ ์ผ๊ด„์ ์œผ๋กœ ๊ฐœ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๋ฉด ๊ฐ ์„œ๋น„์Šค์—์„œ ํ•„์š”ํ•œ ์„ฑ๋Šฅ๋ณด๋‹ค ์‹ค์ œ๋กœ ๋” ์ ๊ฑฐ๋‚˜ ๋งŽ์€ ์„ฑ๋Šฅ์„ ๋ฐฐ์ •๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ”„๋ก ํŠธ SSR์€ CPU bound ์ž‘์—…์ด์ง€๋งŒ ์Šคํ”„๋ง๋ถ€ํŠธ๋Š” ์ปค๋„ฅ์…˜ ์ ์œ ๊ฐ€ ๋งŽ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”๋กœ ํ•˜๋Š” ๋ฆฌ์†Œ์Šค์˜ ํฌ๊ธฐ์™€ ์ข…๋ฅ˜๊ฐ€ ๋‹ค๋ฅด๋‹ค. ๊ทธ๋ž˜์„œ ํ”„๋ก ํŠธ ์„œ๋น„์Šค์˜ CPU ํ• ๋‹น์„ ๋Š˜๋ฆฌ๊ธฐ ์œ„ํ•ด ์ธํ”„๋ผ๋ฅผ ๋Š˜๋ฆฌ๊ฒŒ ๋˜๋ฉด, ๋‚˜๋จธ์ง€ ๋ฐฑ์—”๋“œ, AI ์„œ๋ฒ„์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ž์›์„ ๋ฐฐ์ • ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๋‹ค๋ฅธ DB๋ฅผ ๊ฐ–๋Š”๋‹ค

DB๋ฅผ ํฌํ•จํ•˜์—ฌ v1์˜ ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์ œํ•˜๋Š” ๊ฒฝ์šฐ DB๋„ ํ•˜๋‚˜์”ฉ ๋Š˜์–ด๋‚˜๋Š”๋ฐ, ์ด๋Ÿฌ๋ฉด ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๋‹ค๋ฅธ DB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋งŒ์•ฝ DB๋ฅผ ์ œ์™ธํ•œ ์ธํ”„๋ผ๋ฅผ ๋ณต์ œํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ํ”„๋ก ํŠธ์—”๋“œ ๋ถ€ํ•˜ ๋•Œ๋ฌธ์— ๋ฐฑ์—”๋“œ๋„ ํ•จ๊ป˜ ๋Š˜์–ด๋‚˜, ํ•„์š” ์—†๋Š” ๋ฐฑ์—”๋“œ๋งˆ๋‹ค DB ์ปค๋„ฅ์…˜์„ ์žก๋Š”๋‹ค. ์œ ํœด ์ปค๋„ฅ์…˜์€ ํ’€ ์„ค์ •(minimumIdle)์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, DB ์ตœ๋Œ€ ์ปค๋„ฅ์…˜์€ ๋ฐฑ์—”๋“œ ์ˆ˜ ร— ํ’€ ์ตœ๋Œ€ ํฌ๊ธฐ(maximumPoolSize)๋กœ ์žก์•„์•ผ ํ•˜๋ฏ€๋กœ ๋ฐฑ์—”๋“œ ์ˆ˜๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ ๋ถ€ํ•˜์— ๋”ฐ๋ผ ๋Š˜์–ด๋‚˜๋ฉด DB์˜ ์ตœ๋Œ€ ์ปค๋„ฅ์…˜์„ ๊ทธ๋งŒํผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜, ๋ฐฑ์—”๋“œ๋งˆ๋‹ค ํ’€ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ์•ผ ํ•œ๋‹ค.

๋ณต์ œ ์ธ์Šคํ„ด์Šค ์ˆ˜ HikariCP ์ตœ๋Œ€ ํ’€ 10๊ฐœ ร— ์ธ์Šคํ„ด์Šค ๊ฐœ์ˆ˜ v1 MySQL max-connections=30
1๋Œ€ 10 OK
3๋Œ€ 30 ํ•œ๊ณ„ ๋„๋‹ฌ
5๋Œ€ 50 ์ดˆ๊ณผ

์œ„์™€ ๊ฐ™์€ ์ด์œ ๋กœ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋Š” ๋…๋ฆฝ๋œ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐฐํฌํ•ด์•ผ ํ•œ๋‹ค.

2. ๋ฐฑ์—”๋“œ ์ƒํƒœ๊ฐ’ ๋ถ„๋ฆฌ

๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋ฅผ ๋…๋ฆฝ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐฐํฌํ•  ๋•Œ, v1 ์ธํ”„๋ผ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ’์„ ๋ถ„๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

v1 ๋ฐฐํฌ์—์„œ๋Š” JWT์˜ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ MySQL์—์„œ ๊ด€๋ฆฌํ•˜๊ณ , ๋กœ๊ทธ์ธ ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค. v2 ๋ฐฐํฌ์—์„œ๋Š” ์„œ๋น„์Šค ํŠธ๋ž˜ํ”ฝ ํ™•์žฅ์— ๋”ฐ๋ผ ๋น ๋ฅธ ์ฝ๊ธฐ, ์“ฐ๊ธฐ๋ฅผ ์œ„ํ•ด์„œ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ๊ณผ ๋กœ๊ทธ์ธ ์„ธ์…˜์„ Redis์—์„œ ๊ด€๋ฆฌํ•  ๊ฒƒ์ด๋‹ค.

๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋ฅผ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค์— ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ฒฝ์šฐ์—, ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ๊ณผ ๋กœ๊ทธ์ธ ์„ธ์…˜์„ ๊ฐ ์ธ์Šคํ„ด์Šค์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž๋Š” ๊ธฐ์กด์— ์ •๋ณด๋ฅผ ์ €์žฅํ–ˆ๋˜ ์„œ๋ฒ„์—๋งŒ ์š”์ฒญํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ํ†ตํ•ด์„œ ๊ณ ์ • ์„ธ์…˜(sticky-session)์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์•„๋ž˜์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  1. ์ธ์Šคํ„ด์Šค ์ˆ˜๋ฅผ ์œ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ์šฐ๋ฆฌ ์„œ๋น„์Šค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์‹œ๊ฐ„๋Œ€์— ๋ชฐ๋ฆฌ๋ฏ€๋กœ, ์Šค์ผ€์ผ๋ง์„ ์‚ฌ์šฉํ•ด ํ”ผํฌ ์‹œ๊ฐ„๋Œ€์— ์ธ์Šคํ„ด์Šค ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๊ณ  ํ•œ๊ฐ€ํ•œ ์‹œ๊ฐ„๋Œ€์—๋Š” ๊ทธ ์ˆ˜๋ฅผ ์ค„์—ฌ์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณ ์ • ์„ธ์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์ธ์Šคํ„ด์Šค์—๋งŒ ํ†ต์‹ ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ•์ œ๋กœ ์ค‘๋‹จํ•ด์•ผ ํ•œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ•์ œ๋กœ ๋กœ๊ทธ์•„์›ƒ๋˜๋Š” ์ •๋„์˜ ๋ฌธ์ œ์ง€๋งŒ, ๋งค์ผ ๊ฐ™์€ ์ผ์ด ๋ฐ˜๋ณต๋œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ํฐ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค.
  2. ์„œ๋ฒ„๋ฅผ ๋Š˜๋ ค๋„ ๋ถ€ํ•˜๊ฐ€ ๋ฐ”๋กœ ๋‚˜๋‰˜์ง€ ์•Š๋Š”๋‹ค. ์‚ฌ์šฉ์ž๋Š” ํŠน์ • ์ธ์Šคํ„ด์Šค๋กœ๋งŒ ์š”์ฒญ์„ ํ•ด์•ผํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋ชฐ๋ ค๋„ ์˜ฎ๊ธธ ์ˆ˜ ์—†๋‹ค.

๊ณ ์ • ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์—์„œ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง€๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ธ์Šคํ„ด์Šค ์ˆ˜๋งŒํผ ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ(e.g. ๋ฐฑ์—”๋“œ ์ธ์Šคํ„ด์Šค 10๊ฐœ = ์‚ฌ์šฉ์ž A์˜ ๋กœ๊ทธ์ธ ์„ธ์…˜ 10๊ฐœ ์ €์žฅ) ์‹œ์Šคํ…œ ์ž์› ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„œ๋ฒ„๋ฅผ ๋ฌด์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ํ˜„์žฌ ์„œ๋น„์Šค์—์„œ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ๊ณผ ๋กœ๊ทธ์ธ ์„ธ์…˜์„ ๊ณต์šฉ ๊ณต๊ฐ„์— ์ €์žฅํ•ด์„œ, ๋ชจ๋“  ๋ฐฑ์—”๋“œ ์ธ์Šคํ„ด์Šค์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•จ๊ป˜ ์ ‘๊ทผํ•˜๋Š” ๊ณต์œ  ์ €์žฅ์†Œ์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค.

2.1 Redis ์„ค๊ณ„

Important

ElastiCache Serverless(Valkey)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์›” ์•ฝ $8~12๋กœ ์„ ํƒ์ง€ ์ค‘ ๊ฐ€์žฅ ์ €๋ ดํ•˜๊ณ , ์—ฌ๋Ÿฌ AZ ๋ณต์ œ์™€ ์ž๋™ ์ „ํ™˜์ด ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จ๋œ๋‹ค.

Refresh Token๊ณผ ๋กœ๊ทธ์ธ ์„ธ์…˜์˜ ํฌ๊ธฐ์™€ ๊ฐœ์ˆ˜๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ€์ •ํ•œ๋‹ค. ์„ธ์…˜๊ณผ ํ‚ค์˜ ํฌ๊ธฐ๋Š” ๋ฐฑ์—”๋“œ ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ๊ฐ€์ •ํ–ˆ๋‹ค.

ํ•ญ๋ชฉ ๊ฐœ์ˆ˜ ๊ฐ€์ • ํฌ๊ธฐ ๊ฐ€์ • ํ•ฉ๊ณ„
Refresh Token (TTL 14์ผ) 14์ผ ์•ˆ์— ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ์ตœ๋Œ€ 20๋งŒ (MAU ์ „์ฒด) 0.5KB ์•ฝ 100MB
๋กœ๊ทธ์ธ ์„ธ์…˜ DAU 4๋งŒ 1KB ์•ฝ 40MB
ํ•ฉ๊ณ„ ์•ฝ 140MB
  • ์ฒ˜๋ฆฌ๋Ÿ‰: Peak 80 RPS์—์„œ ์š”์ฒญ๋งˆ๋‹ค Redis ๋ช…๋ น์„ 1~2๋ฒˆ ๋ณด๋‚ด๋„ ์ดˆ๋‹น ์ตœ๋Œ€ 160๊ฑด์ด๋‹ค. Redis๋Š” ์ž‘์€ ๋…ธ๋“œ์—์„œ๋„ ์ดˆ๋‹น ์ˆ˜๋งŒ ๊ฑด์„ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ฒ˜๋ฆฌ๋Ÿ‰์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค. spare_cores-t3 nano redis ๋ฒค์น˜๋งˆํฌ
  • ์žฅ์•  ํ—ˆ์šฉ ๊ธฐ์ค€: Redis์—์„œ ๋กœ๊ทธ์ธ ์„ธ์…˜๊ณผ JWT ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ๋งŒ์„ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ, ๋ฐ์ดํ„ฐ๋Š” ์œ ์‹ค๋ผ๋„ ๊ดœ์ฐฎ๋‹ค.(์žฌ๋กœ๊ทธ์ธ์ด ํ•„์š”) ๊ทธ๋Ÿฌ๋‚˜ Redis๊ฐ€ ๋ฉˆ์ถ˜๋‹ค๋ฉด ์ธ์ฆ์ด ํ•„์š”ํ•œ ๋ชจ๋“  ์š”์ฒญ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง€๋ฏ€๋กœ ํ—ˆ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

์ง์ ‘ ์šด์˜(EC2)๊ณผ ๊ด€๋ฆฌํ˜•(ElastiCache)์„ ๋น„๊ตํ–ˆ๋‹ค. ์„œ์šธ ๋ฆฌ์ „ ๊ณต์‹ ์š”๊ธˆ ๊ธฐ์ค€์ด๋ฉฐ, ํ•œ ๋‹ฌ์€ 730์‹œ๊ฐ„์œผ๋กœ ๊ณ„์‚ฐํ–ˆ๋‹ค.

๋ฐฉ์‹ ๊ตฌ์„ฑ ์›” ๋น„์šฉ ์ž๋™ ์ „ํ™˜ ์ถ”๊ฐ€ ๊ด€๋ฆฌ
EC2 ์ง์ ‘, replica ์‚ฌ์šฉ t4g.micro ร— 2 + gp3 20GB ร— 2 ์•ฝ $19 ์—†์Œ ๋ณต์ œ ์„ค์ •, ๋ฐฑ์—…, ํŒจ์น˜, ์žฅ์•  ์‹œ ์‚ฌ๋žŒ์ด replica๋ฅผ ์Šน๊ฒฉํ•ด์•ผํ•จ
EC2 ์ง์ ‘, Sentinel ์‚ฌ์šฉ t4g.micro ร— 3 + EBS ์•ฝ $28 ์žˆ์Œ Sentinel 3๋Œ€ ๊ตฌ์„ฑ, ํด๋ผ์ด์–ธํŠธ๋ฅผ Sentinel ๋ฐฉ์‹์œผ๋กœ ์„ค์ •, ์ „ํ™˜
ElastiCache ๋…ธ๋“œ, Redis OSS cache.t4g.micro ร— 2 ($0.024/h) $35.0 ์žˆ์Œ ์„œ๋ธŒ๋„ท ๊ทธ๋ฃน, ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน
ElastiCache ๋…ธ๋“œ, Valkey cache.t4g.micro ร— 2 ($0.0192/h) $28.0 ์žˆ์Œ ์œ„์™€ ๋™์ผ
ElastiCache Serverless, Redis OSS ์ตœ์†Œ 1GB ๊ณผ๊ธˆ ($0.151/GB-h) ์•ฝ $110 ์žˆ์Œ ์—†์Œ
ElastiCache Serverless, Valkey ์•ฝ 0.14GB ($0.101/GB-h) ์•ฝ $12 ์žˆ์Œ ์—†์Œ
  • EC2 ์š”๊ธˆ: t4g.micro $0.0104/h, gp3 GB๋‹น ์›” ์•ฝ $0.09
  • Serverless Valkey ์ €์žฅ ์š”๊ธˆ: 0.14GB ร— $0.101 ร— 730 โ‰ˆ $10.3
  • Serverless Valkey ์ฒ˜๋ฆฌ ์š”๊ธˆ: 1KB ์ดํ•˜ ๋‹จ์ˆœ ์ฝ๊ธฐ, ์“ฐ๊ธฐ๋Š” ๋ช…๋ น๋‹น 1 ECPU. 160 ๋ช…๋ น(80 RPS ร— ๋ช…๋ น 2๊ฐœ)์„ ํ•˜๋ฃจ ์ข…์ผ ๋ฐ›๋Š”๋‹ค๊ณ  ํฌ๊ฒŒ ์žก์•„๋„ ์›” 4.1์–ต ECPU ร— $0.0027/๋ฐฑ๋งŒ ECPU = ์•ฝ $1.1
  • AWS ElastiCache pricing
  • EC2๋กœ ์ง์ ‘ ์šด์˜ํ•˜๋Š” ๊ฒƒ์€ ์ €๋ ดํ•˜์ง€ ์•Š๊ณ , ์‚ฌ๋žŒ์ด replica๋ฅผ ์Šน๊ฒฉํ•˜๊ฑฐ๋‚˜ redis๋ฅผ ์ตœ์†Œ 3๋Œ€๋กœ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ Redis ๊ตฌ์„ฑ์ด๋‚˜ ๋ฐฑ์—…, ์ „ํ™˜ ๋“ฑ์„ ์ „๋ถ€ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • ElastiCache ์ค‘ Serverless Valkey๊ฐ€ ๊ฐ€์žฅ ์ €๋ ดํ•˜๊ณ  ์—ฌ๋Ÿฌ AZ์— ๋ณต์ œ๋˜๋ฏ€๋กœ AZ ๋ฐฐ์น˜๋ฅผ ๋”ฐ๋กœ ์„ค๊ณ„ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ElastiCache Serverless Valkey๋ฅผ ์‚ฌ์šฉํ•ด ์„ธ์…˜๊ณผ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ๋‹ค๋งŒ ์ดํ›„ ํŠธ๋ž˜ํ”ฝ์ด ๋”์šฑ ์„ฑ์žฅํ•˜๋Š” ๊ฒฝ์šฐ, ์ €์žฅ ๋ฐ์ดํ„ฐ๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๋งŒํผ Serverless ์‚ฌ์šฉ ๋น„์šฉ์ด ๋Š˜์–ด๋‚˜๋ฏ€๋กœ ๋…ธ๋“œ ๋ฐฉ์‹์ด ๋” ์ €๋ ดํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค. (e.g. MAU 500๋งŒ -> Refresh Token 2.5GB -> ์ตœ์†Œ $184/์›”)

Redis Multi-AZ ํ†ต์‹  ๋ฐฉ๋ฒ•

  • ๋ฐฑ์—”๋“œ๋Š” ์—”๋“œํฌ์ธํŠธ ์ฃผ์†Œ ํ•˜๋‚˜๋กœ ์ ‘์†ํ•œ๋‹ค. ์–ด๋А ๋…ธ๋“œ๊ฐ€ primary์ธ์ง€, ์ „ํ™˜์ด ์ผ์–ด๋‚ฌ๋Š”์ง€๋Š” AWS๊ฐ€ ๊ด€๋ฆฌํ•œ๋‹ค.
  • Redis๋Š” ์ธํ„ฐ๋„ท์œผ๋กœ ๋‚˜๊ฐˆ ์ผ์ด ์—†์œผ๋ฏ€๋กœ ํ”„๋ผ์ด๋น— ์„œ๋ธŒ๋„ท์— ๋‘”๋‹ค. ๋ณด์•ˆ๊ทธ๋ฃน์€ 6379 ํฌํŠธ๋ฅผ ๋ฐฑ์—”๋“œ ๋ณด์•ˆ๊ทธ๋ฃน์—์„œ๋งŒ ๋ฐ›๋Š”๋‹ค.
  • AZ ๊ฐ„ ์ „์†ก ๋น„์šฉ์€ ํŒ๋‹จ ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์š”์ฒญ๋‹น 1KB๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ณ  80 RPS๊ฐ€ ํ•˜๋ฃจ ์ข…์ผ Redis์— ์š”์ฒญํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋„ ์›” ์•ฝ 207GB, ์ ˆ๋ฐ˜์ด AZ๋ฅผ ๋„˜์œผ๋ฉด ์•ฝ 104GB ร— ๋ฐฉํ–ฅ๋‹น $0.01 ร— 2 = ์•ฝ ์›” $2๋‹ค.

2.2 ์ฑ„ํŒ… ์—ฐ๊ฒฐ ์ƒํƒœ ๋ถ„๋ฆฌ

Important

์ธ์Šคํ„ด์Šค ๊ฐ„ ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ์ค‘๊ณ„๋Š” ๋ฐฑ์—”๋“œ๊ฐ€ ๊ฒฐ์ •ํ•œ Redis Pub/Sub์œผ๋กœ ํ•˜๊ณ , ์œ„์—์„œ ๋„์ž…ํ•œ ElastiCache Serverless(Valkey)๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค. ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€๋Š” ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Pub/Sub์—๋Š” ์ €์žฅ ๋น„์šฉ์ด ๋“ค์ง€ ์•Š๊ณ , 1:1 ๋Œ€ํ™”๋ฐฉ์ด๋ผ ๋ฐœํ–‰ ๊ฑด์ˆ˜์— ๋น„๋ก€ํ•ด ์ฒ˜๋ฆฌ ์š”๊ธˆ๋งŒ ์ถ”๊ฐ€๋œ๋‹ค.

๋ฐฑ์—”๋“œ ์„œ๋ฒ„๊ฐ€ 2๋Œ€ ์ด์ƒ์œผ๋กœ ๋Š˜์–ด๋‚˜๋ฉด, ํ˜„์žฌ ์ฑ„ํŒ… ๊ตฌ์กฐ(Spring ๋‚ด์žฅ SimpleBroker)์—์„œ๋Š” ๊ฐ™์€ ์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐ๋œ ๊ตฌ๋…์ž์—๊ฒŒ๋งŒ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค. ๋Œ€ํ™” ์ƒ๋Œ€ A์™€ B๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์—์„œ ํ†ต์‹ ํ•˜๋ฉด A์˜ ๋ฉ”์‹œ์ง€๊ฐ€ B์—๊ฒŒ ๋„์ฐฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ธ์Šคํ„ด์Šค ์‚ฌ์ด์— ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ค‘๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋ฉ”์‹œ์ง€๋Š” DB์— ๋จผ์ € ์ €์žฅํ•œ ๋’ค ๋ฐœํ–‰ํ•˜๋ฏ€๋กœ, ์ค‘๊ณ„๋Š” ์‹ค์‹œ๊ฐ„ ์ „๋‹ฌ๋งŒ ๋‹ด๋‹นํ•˜๊ณ  ๊ธฐ๋ก์€ DB์— ๋‚จ๋Š”๋‹ค.

Redis Pub/Sub ๋„์ž… ๋น„์šฉ

Pub/Sub ๋ฉ”์‹œ์ง€๋Š” ๊ตฌ๋…์ž์—๊ฒŒ ์ „๋‹ฌ๋˜๋ฉด ์‚ฌ๋ผ์ง€๊ณ  ์ €์žฅ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ €์žฅ ์š”๊ธˆ์ด ๋Š˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์š”๊ธˆ์€ ์ „๋‹ฌ ๊ฑด์ˆ˜์— ๋น„๋ก€ํ•œ๋‹ค. ์šฐ๋ฆฌ ์„œ๋น„์Šค๋Š” ์ฑ„ํŒ…๋ฐฉ์ด 1:1์ด๋ผ ๋ฉ”์‹œ์ง€ ํ•œ ๊ฑด์„ ๋ฐ›๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์ตœ๋Œ€ 2๊ฐœ(๋ณด๋‚ธ ์‚ฌ๋žŒ๊ณผ ๋ฐ›๋Š” ์‚ฌ๋žŒ์˜ ์ธ์Šคํ„ด์Šค)๋‹ค. ๋Œ€ํ™”๋ฐฉ ํ•˜๋‚˜๋‹น ์ฑ„๋„ ํ•˜๋‚˜๋ฅผ ์“ฐ๊ณ , ๊ทธ ๋ฐฉ์˜ ์ฐธ์—ฌ์ž๊ฐ€ ํ†ต์‹ ํ•˜๋Š” ์ธ์Šคํ„ด์Šค๋งŒ ๊ตฌ๋…ํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ˆ˜๊ฐ€ ๋Š˜์–ด๋„ ๋ฉ”์‹œ์ง€ ํ•œ ๊ฑด์˜ ์ „๋‹ฌ ์ˆ˜๋Š” ๋Š˜์ง€ ์•Š๋Š”๋‹ค.

ํ•ญ๋ชฉ ๊ฐ’ ๋น„๊ณ 
๋ฉ”์‹œ์ง€ ๋ฐœ์ƒ๋Ÿ‰ Peak 7๊ฑด/์ดˆ ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ์†ก์ˆ˜์‹  Peak RPS
ํ•˜๋ฃจ ์ข…์ผ Peak๋กœ ๋ฐ›๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•œ ์›” ๋ฉ”์‹œ์ง€ 7 ร— 86,400 ร— 30 = ์•ฝ 1,800๋งŒ ๊ฑด
๋ฉ”์‹œ์ง€๋‹น ECPU ๋ฐœํ–‰ 1 + ์ „๋‹ฌ ์ตœ๋Œ€ 2 = 3 1KB ์ดํ•˜ ๋ช…๋ น์€ 1 ECPU
์›” ECPU ์•ฝ 5,400๋งŒ

์ฑ„ํŒ… ์ค‘๊ณ„ Redis Pub/Sub ๊ตฌ์„ฑ ๋ฐฉ์•ˆ

์„ ํƒ์ง€ ์ถ”๊ฐ€ ๋น„์šฉ ํŒ๋‹จ
ElastiCache Serverless, Valkey ์›” ์•ฝ $0.15 ์ƒˆ ์ธํ”„๋ผ๊ฐ€ ์—†๊ณ , ์š”๊ธˆ์ด ๋ฉ”์‹œ์ง€ ๊ฑด์ˆ˜์—๋งŒ ๋น„๋ก€ํ•œ๋‹ค. Multi-AZ์™€ ์ž๋™ ์žฅ์•  ์กฐ์น˜(primary ์ „ํ™˜)
์ฑ„ํŒ…์šฉ Redis EC2์— ๊ตฌ์ถ• t4g.micro ํ•œ ๋Œ€ ์ด์ƒ, ์›” ์•ฝ $8 ์ด์ƒ. ๊ฐ€์šฉ์„ฑ์„ ๊ณ ๋ ค ์‹œ ์•ฝ $19~28 ์ €์žฅ์ด ์—†๋Š” ์šฉ๋„์ธ๋ฐ๋„ ์„œ๋ฒ„ ๋น„์šฉ์ด ๊ณ ์ •์œผ๋กœ ๋‚˜๊ฐ€๊ณ , ํŒจ์น˜์™€ ์žฅ์•  ๋Œ€์‘์„ ์ง์ ‘ ํ•ด์•ผ ํ•œ๋‹ค.
ElastiCache ๋…ธ๋“œ, Valkey cache.t4g.micro ร— 2 ์•ฝ $28 Serverless๊ฐ€ Pub/Sub์— ๋งž์ง€ ์•Š์„ ๋•Œ์˜ ๋Œ€์ฒด์•ˆ์ด๋‹ค. ํ‰์†Œ์—๋Š” ๊ณ ์ •๋น„๊ฐ€ ๋” ํฌ๋‹ค
์™ธ๋ถ€ STOMP ๋ธŒ๋กœ์ปค (Amazon MQ) ๋ธŒ๋กœ์ปค ์ธ์Šคํ„ด์Šค ์ƒ์‹œ ๊ณผ๊ธˆ, ์ด์ค‘ํ™” ์‹œ 2๋Œ€ (์„œ์šธ ์š”๊ธˆ ๋ฏธํ™•์ธ) Spring์˜ ๋ธŒ๋กœ์ปค ์—ฐ๋™(enableStompBrokerRelay)์„ ๊ทธ๋Œ€๋กœ ์“ฐ๊ณ  ์ „๋‹ฌ ๋ณด์žฅ๋„ ๋˜์ง€๋งŒ, ๋ฉ”์‹œ์ง€๋ฅผ DB์— ์ด๋ฏธ ์ €์žฅํ•˜๋ฏ€๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Œ
SNS/SQS๋กœ ์ธ์Šคํ„ด์Šค์— ์ „๋‹ฌ ํ˜ธ์ถœ๋‹น ์†Œ์•ก
DB ํด๋ง (๊ฐ ์ธ์Šคํ„ด์Šค๊ฐ€ chat_messages์˜ ์ƒˆ ํ–‰์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์กฐํšŒ) ์ถ”๊ฐ€ ์ธํ”„๋ผ ์—†์Œ ์ธ์Šคํ„ด์Šค ์ˆ˜์™€ ํ™œ์„ฑ ๋ฐฉ ์ˆ˜์— ๋น„๋ก€ํ•ด DB ์กฐํšŒ๊ฐ€ ๋ฐœ์ƒ
์ธ์Šคํ„ด์Šค๋ผ๋ฆฌ ์ง์ ‘ ์ „๋‹ฌ ์—†์Œ ์Šค์ผ€์ผ๋ง์œผ๋กœ ๋ฐ”๋€Œ๋Š” ์ธ์Šคํ„ด์Šค ์ฃผ์†Œ๋ฅผ ์„œ๋กœ ์•Œ์•„์•ผ ํ•จ

ElastiCache Serverless Valkey๊ฐ€ ์ €๋ ดํ•œ ๋น„์šฉ์œผ๋กœ Multi AZ์™€ ์ž๋™ ์žฅ์•  ์กฐ์น˜๊นŒ์ง€ ์ง€์›ํ•˜๋ฉฐ, ๋ฐฑ์—”๋“œ ์ƒํƒœ ๋ถ„๋ฆฌ์—์„œ ์ด๋ฏธ ์‚ฌ์šฉํ•˜๋Š” ์ธํ”„๋ผ์ด๋ฏ€๋กœ ๋„์ž…ํ•˜๊ธฐ์— ์ ์ ˆํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ์ „๋‹ฌ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. Pub/Sub์€ ๊ตฌ๋…์ž๊ฐ€ ์—†๊ฑฐ๋‚˜ ์—ฐ๊ฒฐ์ด ๋Š๊ธด ์ˆœ๊ฐ„์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฒ„๋ฆฐ๋‹ค. ๋ฉ”์‹œ์ง€๋ฅผ DB์— ๋จผ์ € ์ €์žฅํ•˜๋ฏ€๋กœ ๋†“์นœ ๋ฉ”์‹œ์ง€๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์‹œ ์ ‘์†ํ•  ๋•Œ ์ฑ„ํŒ… ํžˆ์Šคํ† ๋ฆฌ ์กฐํšŒ๋กœ ๋ฐ›๋Š”๋‹ค. ๊ตํ™˜ ์•ฝ์†์„ ์žก๋Š” ์ฑ„ํŒ…์—์„œ๋Š” "๊ฐ€๋” ์‹ค์‹œ๊ฐ„ ์ „๋‹ฌ์„ ๋†“์ณ๋„ ๊ธฐ๋ก์€ ๋‚จ๋Š”๋‹ค" ์ˆ˜์ค€์ด๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

3. ๋ฐฑ์—”๋“œ ์š”๊ตฌ ์„ฑ๋Šฅ

3.1 ํŠธ๋ž˜ํ”ฝ ์‹œ๊ฐ„ ๋ถ„ํฌ

์šฐ๋ฆฌ ์„œ๋น„์Šค์˜ ํƒ€๊ฒŸ์ธต์€ 20, 30๋Œ€ ์ž์ทจ ํ˜น์€ ๊ธฐ์ˆ™์‚ฌ์—์„œ ์ƒํ™œํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ฏ€๋กœ, ํŠธ๋ž˜ํ”ฝ ์‹œ๊ฐ„ ๋ถ„ํฌ๋Š” ์ด ํƒ€๊ฒŸ์ธต์ด ํ™œ๋ฐœํžˆ ์ธํ„ฐ๋„ท์„ ์‚ฌ์šฉํ•˜๋Š” ์‹œ๊ฐ„์œผ๋กœ ์ •ํ•˜๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•˜๋‹ค. 2026๋…„ CJ ๋ฉ”์กฐ๋ฏธ๋””์–ด 20๋Œ€, 30๋Œ€ ํƒ€๊ฒŸ ๋ฆฌํฌํŠธ์˜ "์ธํ„ฐ๋„ท ์ด์šฉ ์‹œ๊ฐ„๋Œ€" ์‘๋‹ต์„ ์šฐ๋ฆฌ ์„œ๋น„์Šค์˜ ์‹œ๊ฐ„๋Œ€๋ณ„ ๋ถ€ํ•˜ ๋ถ„ํฌ๋กœ ๋ณธ๋‹ค.

CJ ๋ฉ”์กฐ๋ฏธ๋””์–ด 2026๋…„ 20๋Œ€, 30๋Œ€ ์ธํ„ฐ๋„ท ์ด์šฉ ์‹œ๊ฐ„๋Œ€ ์ž๋ฃŒ image image
  • ๊ฐ€์žฅ ๋ถ๋น„๋Š” ์‹œ๊ฐ„์˜ RPS๋ฅผ 80์œผ๋กœ ๋‘๊ณ , ๋‚˜๋จธ์ง€ ๊ตฌ๊ฐ„์€ ์‹œ๊ฐ„๋‹น ๊ฐ’์— ๋น„๋ก€ํ•ด ๊ณ„์‚ฐํ•œ๋‹ค.
  • ๊ธฐ์ƒ ์งํ›„์™€ ์‹ฌ์•ผ๋Š” ์ž๋ฃŒ์— ๋ ์‹œ๊ฐ์ด ์—†์–ด ๊ฐ๊ฐ 1์‹œ๊ฐ„(06-07), 3์‹œ๊ฐ„(23-02)์œผ๋กœ ๊ฐ€์ •ํ–ˆ๋‹ค. 02-06์‹œ๋Š” ๊ณ„์‚ฐ ํŽธ์˜์ƒ 0์œผ๋กœ ๊ฐ€์ •ํ–ˆ๋‹ค.
  • 20, 30๋Œ€ ๊ฐ’์€ ๋‚จ๋…€ ํ‰๊ท ์œผ๋กœ ๊ณ„์‚ฐํ–ˆ๋‹ค.
  • RPS๋Š” Peak ํƒ€์ž„์ธ 20-23์‹œ์˜ 1์‹œ๊ฐ„ ๋น„์œจ์— ๋น„๋ก€ํ•˜๊ฒŒ ๊ณ„์‚ฐํ–ˆ๋‹ค.
    • e.g. ๊ธฐ์ƒ์งํ›„ 5.5%, RPS = 80 x (5.5 / 22.8) = ์•ฝ 19
๊ตฌ๊ฐ„ ์‹œ๊ฐ„ 20๋Œ€ 30๋Œ€ ํ‰๊ท  1์‹œ๊ฐ„ ๋น„์œจ RPS
๊ธฐ์ƒ ์งํ›„ 06-07 8.0% 3.0% 5.5% 5.5 19
๋“ฑ๊ตยท์ถœ๊ทผ 07-09 17.0% 18.0% 17.5% 8.8 31
์˜ค์ „ 09-11 4.5% 11.5% 8.0% 4.0 14
์ ์‹ฌ 11-14 15.0% 14.5% 14.8% 4.9 17
์˜คํ›„ 14-17 16.0% 14.5% 15.3% 5.1 18
ํ•˜๊ตยทํ‡ด๊ทผ 17-20 25.0% 28.0% 26.5% 8.8 31
์ €๋… 20-23 66.5% 70.5% 68.5% 22.8 80
์‹ฌ์•ผ 23-02 41.5% 26.5% 34.0% 11.3 40
์ƒˆ๋ฒฝ 02-06 โ€” โ€” โ€” โ€” 0

ํ”ผํฌ ์‹œ๊ฐ„๋Œ€๋Š” ์ €๋… ์‹œ๊ฐ„๋Œ€(20-23์‹œ)๋กœ, 68.5%์˜ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์‘๋‹ตํ–ˆ๋‹ค.

ํŠธ๋ž˜ํ”ฝ์€ ์„ธ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

๋‹จ๊ณ„ ์‹œ๊ฐ„ RPS
ํ”ผํฌ 20~23์‹œ (3์‹œ๊ฐ„) 80
์ค‘๊ฐ„ ์ถœ๊ทผ 07-09์‹œ, ํ‡ด๊ทผ 17-20์‹œ, ์‹ฌ์•ผ 23-02์‹œ (8์‹œ๊ฐ„) 31-40
๋‚ฎ์Œ ๊ธฐ์ƒ ์งํ›„, ๋‚ฎ 09-17์‹œ, ์ƒˆ๋ฒฝ 02-06์‹œ (13์‹œ๊ฐ„) 0~19

3.2 ๋ฐฑ์—”๋“œ ํ•„์š” ๋ฆฌ์†Œ์Šค

Important

๋ฐฑ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ๋Š” ์š”์ฒญ 1๊ฑด์— CPU ์•ฝ 5.7 ms(80 RPS ๊ธฐ์ค€)๋ฅผ ์“ฐ๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ถ€ํ•˜์™€ ๊ฑฐ์˜ ๊ด€๊ณ„์—†์ด ์•ฝ 460 MiB๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ 1 GiB๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค. t4g.small(2 vCPU, 2 GiB)์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ 1๊ฐœ์”ฉ ๋‘์–ด ํ˜„์žฌ ํ”ผํฌ 80 RPS๋ฅผ 2๋Œ€(AZ๋‹น 1๋Œ€)๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ฐ™์€ ๊ตฌ์กฐ์—์„œ ์ธ์Šคํ„ด์Šค ๋Œ€์ˆ˜๋งŒ ๋Š˜๋ ค์„œ ๋†’์€ ํŠธ๋ž˜ํ”ฝ์— ๋Œ€์‘ํ•œ๋‹ค.

๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค ์ธก์ •

v2 ์ƒํ™ฉ์—์„œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค๊ฐ€ ์–ผ๋งˆ๋‚˜ ํ•„์š”ํ•œ์ง€ ์ธก์ •ํ–ˆ๋‹ค.

์ธก์ • ๋ฐฉ๋ฒ• ๋ฐ ์กฐ๊ฑด (ํด๋ฆญํ•ด์„œ ํŽผ์น˜๊ธฐ)

์ธก์ • ์š”์ฒญ์€ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์˜ ๋ชจ๋“  API๊ฐ€ ์•„๋‹Œ, user flow ์š”์ฒญ์—์„œ 51%๋กœ ๊ฐ€์žฅ ๋งŽ์ด ํ˜ธ์ถœ๋˜๋Š” API ๋‘ ๊ฐœ๋กœ ๋ฌผํ’ˆ ์ƒ์„ธ ์กฐํšŒ์™€ ๋ฌผํ’ˆ ๋ชฉ๋ก ์กฐํšŒ๋ฅผ ๊ณจ๋ž๋‹ค. user flow ํ‘œ์—์„œ๋Š” ๊ฐ๊ฐ 27.1, 13.4 RPS์˜€๋Š”๋ฐ, ์กฐ๊ธˆ ๋” ๊ฐ„๋‹จํžˆ ํ•˜์—ฌ ์ธก์ • ์š”์ฒญ์˜ 2:1 ๋น„์œจ๋กœ ์กฐ์ •ํ–ˆ๋‹ค.

ํ•ญ๋ชฉ ๊ฐ’
์ธก์ •์ผ 2026-10-04
์ธ์Šคํ„ด์Šค EC2 t4g.large 1๋Œ€
์ด๋ฏธ์ง€ ๋ฐฑ์—”๋“œ dev ์ด๋ฏธ์ง€
๋ฐฑ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ CPU 1๊ฐœ ์ œํ•œ, ๋ฉ”๋ชจ๋ฆฌ 2 GiB
DB MySQL 8.4, ๊ฐ™์€ ์ธ์Šคํ„ด์Šค, ๋นˆ DB์— Flyway V1 ์ ์šฉ
๋ฐ์ดํ„ฐ ๊ทธ๋ฃน 20๊ฐœ, ์‚ฌ์šฉ์ž 2,000๋ช…(v2 Peak ๋™์‹œ ์‚ฌ์šฉ์ž ์ˆ˜), ๋ฌผ๊ฑด 20,000๊ฐœ, ์ด๋ฏธ์ง€ 40,000์žฅ
๋ถ€ํ•˜ k6 ๊ณ ์ • RPS. 20 RPS ์›Œ๋ฐ์—… 120์ดˆ ํ›„ 20 / 40 / 80 RPS ๊ฐ 180์ดˆ
์ธ์ฆ ํ…Œ์ŠคํŠธ ์ „์šฉ JWT secret์œผ๋กœ ์‚ฌ์šฉ์ž๋ณ„ Access Token์„ ์„œ๋ช…
์ œ์™ธํ•œ ๊ฒƒ Sentry ๋น„ํ™œ์„ฑํ™”, AI ์„œ๋ฒ„ยท์นด์นด์˜ค ํ˜ธ์ถœ ์—†์Œ
CPU ์ˆ˜์ง‘ ๊ธฐ์ค€ ๊ตฌ๊ฐ„ ์‹œ์ž‘ยท๋์˜ process_cpu_time_ns_total ์ฐจ์ด
๋ฉ”๋ชจ๋ฆฌ ์ˆ˜์ง‘ ๊ธฐ์ค€ docker stats
  • CPU ์ˆ˜์ง‘ ๊ธฐ์ค€ ์ƒ์„ธ: ๊ตฌ๊ฐ„ ๋ process_cpu_time โˆ’ ๊ตฌ๊ฐ„ ์‹œ์ž‘ process_cpu_time

์ธก์ • ๊ฒฐ๊ณผ

๋ชฉํ‘œ RPS ์ฒ˜๋ฆฌ ์š”์ฒญ ์ˆ˜ ๋ฐฑ์—”๋“œ CPU ์‚ฌ์šฉ ์‹œ๊ฐ„ ์š”์ฒญ๋‹น CPU ํ‰๊ท  ์‚ฌ์šฉ CPU p95 ๋ชฉ๋ก / ์ƒ์„ธ ์‹คํŒจ์œจ ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ตœ๋Œ€
20 3,601๊ฑด 33.7์ดˆ 9.35 ms 0.19 vCPU 16.5 / 16.5 ms 0% 444 MiB
40 7,201๊ฑด 53.1์ดˆ 7.37 ms 0.29 vCPU 15.7 / 17.0 ms 0% 458 MiB
80 14,401๊ฑด 81.7์ดˆ 5.67 ms 0.45 vCPU 15.4 / 17.0 ms 0% 457 MiB
  • ์š”์ฒญ๋‹น CPU = ์ „์ฒด CPU ์‚ฌ์šฉ ์‹œ๊ฐ„ / ์ฒ˜๋ฆฌํ•œ ์š”์ฒญ ์ˆ˜
  • 80 RPS์—์„œ๋„ CPU 1๊ฐœ์˜ 45%๋งŒ ์“ฐ๊ณ  p95๋Š” 17 ms๋‹ค. 1 vCPU๊ฐ€ ํ˜„์žฌ ํ”ผํฌ ์ „์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ์›Œ๋ฐ์—… 120์ดˆ ๋™์•ˆ์€ 20 RPS์—์„œ๋„ p95๊ฐ€ ๋ชฉ๋ก 2,362 ms, ์ƒ์„ธ 2,055 ms์˜€๋‹ค.
  • ๋ฐฑ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ์™ธํ•œ OS์™€ Docker๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์•ฝ 340 MiB๊ฐ€ ํ•„์š”ํ–ˆ๋‹ค.

3.3 ์ธ์Šคํ„ด์Šค ์‚ฌ์–‘ - t4g.small

ํƒ€์ž… vCPU / ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ์ค€ ์„ฑ๋Šฅ ์‹œ๊ฐ„๋‹น ๋น„์šฉ
t4g.micro 2 / 1 GiB 10% ร— 2 = 0.2 vCPU $0.0104
t4g.small 2 / 2 GiB 20% ร— 2 = 0.4 vCPU $0.0208
t4g.medium 2 / 4 GiB 20% ร— 2 = 0.4 vCPU $0.0416
  • v2 ์ƒํ™ฉ์˜ Peak RPS 80์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ, ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋Š” ์ตœ์†Œ 0.45 vCPU, ์•ฝ 800 MiB(OSยทDocker ์•ฝ 340 MiB + ๋ฐฑ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ ์•ฝ 460 MiB) ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • t4g.small 1๋Œ€๋Š” ๊ธฐ์ค€ ์„ฑ๋Šฅ 0.4 vCPU ์•ˆ์—์„œ ์•ฝ 71 RPS๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. (0.4 vCPU รท ์š”์ฒญ๋‹น 5.67 ms) ๋”ฐ๋ผ์„œ ๊ฐ€์šฉ์„ฑ ํ•˜ํ•œ์„ ์ธ 2๋Œ€(AZ๋‹น 1๋Œ€)๋กœ ํ”ผํฌ 80 RPS๋ฅผ ๊ธฐ์ค€ ์„ฑ๋Šฅ ์•ˆ์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค(1๋Œ€๋‹น 40 RPS, 0.23 vCPU).
  • AZ ํ•˜๋‚˜๊ฐ€ ๋น ์ ธ๋„ ๋‚จ์€ 1๋Œ€๊ฐ€ ๋ฒ„์ŠคํŠธ(์ตœ๋Œ€ 2 vCPU)๋กœ 80 RPS(0.45 vCPU)๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ 2 GiB๋Š” OS+Docker(์•ฝ 340 MiB)์™€ ๋ฐฑ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ(์•ฝ 460 MiB)๋ฅผ ๋„ฃ๊ณ ๋„ ์—ฌ์œ ๊ฐ€ ์žˆ๋‹ค.
  • t4g.micro๋Š” ๋ฐฑ์—”๋“œ์— ์•ฝ 580 MiB๋งŒ ๋‚จ์•„, ์š”์ฒญ์ด ๋ชฐ๋ฆฌ๋ฉด OOM์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ t4g.small 1๋Œ€๋ฅผ ๋‘ AZ์— ์ด 2๋Œ€๋ฅผ ๋‘์–ด ์šด์šฉํ•  ๊ฒƒ์ด๋‹ค.

ํ•œ๊ณ„

  • ๋ฌผํ’ˆ ๋ชฉ๋ก, ๋ฌผํ’ˆ ์ƒ์„ธ๋งŒ ์ธก์ •ํ–ˆ๋‹ค. ๋กœ๊ทธ์ธ์ด๋‚˜ ๋ฌผ๊ฑด ๋“ฑ๋ก(S3, AI ํ˜ธ์ถœ), ๊ตํ™˜, ์ฑ„ํŒ…์€ ์ธก์ •ํ•˜์ง€ ์•Š๊ณ  ์•ž์„œ ์ธก์ •ํ•œ ๋‘ ํ•ญ๋ชฉ๊ณผ ์š”์ฒญ๋‹น ๊ฐ™์€ CPU๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋กœ๊ทธ์ธ๊ณผ ๋ฌผ๊ฑด ๋“ฑ๋ก์€ ์™ธ๋ถ€ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋ฏ€๋กœ ์Šค๋ ˆ๋“œ ์ ์œ  ์‹œ๊ฐ„์ด ๊ธธ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋œ๋‹ค.

4. ์ปจํ…Œ์ด๋„ˆ ์šด์šฉ ๋ฐฉ์‹ - ECS on EC2

Important

๋ฐฑ์—”๋“œ๋Š” ECS on EC2๋กœ ์šด์˜ํ•œ๋‹ค. t4g.small 2๋Œ€(AZ๋‹น 1๋Œ€)์— ๋ฐฑ์—”๋“œ ํƒœ์Šคํฌ๋ฅผ 1๊ฐœ์”ฉ ๋‘”๋‹ค. ๊ฐ™์€ ์š”๊ตฌ๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์ตœ์†Œ ๊ตฌ์„ฑ์œผ๋กœ ๋น„๊ตํ•˜๋ฉด ECS on EC2๊ฐ€ Fargate๋ณด๋‹ค ์›” ์•ฝ $14 ์ €๋ ดํ•˜๋‹ค. ๊ธˆ์•ก ์ž์ฒด๋Š” ์ž‘์ง€๋งŒ, Fargate์— ๋” ๋‚ด๋Š” ๋น„์šฉ์œผ๋กœ ์–ป๋Š” ์ด์ (์ธ์Šคํ„ด์Šค ๊ด€๋ฆฌ ์ƒ๋žต, ๋น ๋ฅธ ํ™•์žฅ)์„ ์šฐ๋ฆฌ ์ƒํ™ฉ์—์„œ๋Š” ASG์™€ ์‚ฌ์ „ ์ฆ์„ค๋กœ ๋Œ€์‹ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋” ๋‚ผ ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค. EC2 + ASG๋ณด๋‹ค๋Š” ์›” ์•ฝ $4 ๋น„์‹ธ์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐํฌํ•˜๋Š” ๋‹จ์œ„, ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ECS๋ฅผ ๊ณ ๋ฅธ๋‹ค. ๋Œ€์‹  ์ธ์Šคํ„ด์Šค์™€ ํƒœ์Šคํฌ ๋‘ ๊ณ„์ธต์˜ ์Šค์ผ€์ผ๋ง์„ ํ•จ๊ป˜ ์šด์˜ํ•ด์•ผ ํ•œ๋‹ค.

4.1 ์šด์šฉ ๋ฐฉ์‹ ์„ธ ๊ฐ€์ง€ ๋น„๊ต

์ƒํ™ฉ

  • v2 ์‚ฌ์šฉ์ž๋Š” ์„œ๋น„์Šค ์ค‘๋‹จ์„ ์šฉ๋‚ฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฐฐํฌ๋Š” ๋ฌด์ค‘๋‹จ์œผ๋กœ ํ•œ๋‹ค. ๋ฐฐํฌ ์‹œ์  ์ œํ•œ์ด ์—†์–ด์ง€๋ฉด์„œ ๋ฐฐํฌ ๋นˆ๋„๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค.
  • 2์ฐจ ๋ฐฐํฌ๊นŒ์ง€๋Š” ์„œ๋น„์Šค ์ˆ˜์ต์ด ์ ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ€์šฉ์„ฑ ํ•˜ํ•œ์„ (AZ ๋‘ ๊ณณ์— ๋ฐฐํฌ)์„ ์ง€ํ‚ค๋Š” ๋ฒ”์œ„์—์„œ ์ตœ์†Œ ๋น„์šฉ์„ ์—ฌ์ „ํžˆ 1์ˆœ์œ„๋กœ ๋‘”๋‹ค.

์ปจํ…Œ์ด๋„ˆ ์šด์šฉ ๋ฐฉ์‹ ์„ธ ๊ฐ€์ง€

ํ•ญ๋ชฉ EC2 + ASG ECS on EC2 ECS on Fargate
๊ฐœ์ˆ˜๋ฅผ ๋งž์ถ”๋Š” ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค(ASG์˜ desired capacity) ํƒœ์Šคํฌ(์„œ๋น„์Šค์˜ desired count)์™€ ์ธ์Šคํ„ด์Šค(์šฉ๋Ÿ‰ ๊ณต๊ธ‰์ž๊ฐ€ ASG๋ฅผ ์กฐ์ •) ํƒœ์Šคํฌ
์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์ฃผ์ฒด ์ธ์Šคํ„ด์Šค ๋ถ€ํŒ… ๋•Œ ์‹คํ–‰๋˜๋Š” user data ์Šคํฌ๋ฆฝํŠธ EC2 ์ธ์Šคํ„ด์Šค์˜ ECS ์—์ด์ „ํŠธ Fargate
์‹คํ–‰ํ•  ์ด๋ฏธ์ง€ ๋ฒ„์ „ ์‹œ์ž‘ ํ…œํ”Œ๋ฆฟ(user data์˜ ์ด๋ฏธ์ง€ ํƒœ๊ทธ) ํƒœ์Šคํฌ ์ •์˜ ๋ฆฌ๋น„์ „์˜ ์ปจํ…Œ์ด๋„ˆ ์ •์˜(container definitions) ํƒœ์Šคํฌ ์ •์˜ ๋ฆฌ๋น„์ „์˜ ์ปจํ…Œ์ด๋„ˆ ์ •์˜
ALB ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค bridge ๋ชจ๋“œ: ์ธ์Šคํ„ด์Šค(๋™์  ํฌํŠธ)
awsvpc ๋ชจ๋“œ: ํƒœ์Šคํฌ IP
ํƒœ์Šคํฌ IP(awsvpc ๊ณ ์ •)
  • ์„ธ ๋ฐฉ์‹ ๋ชจ๋‘ 2๊ฐœ AZ์— ์‹คํ–‰ ๋‹จ์œ„๋ฅผ ๋‘๋ฉด ๊ฐ€์šฉ์„ฑ ํ•˜ํ•œ์„ ์„ ๋งŒ์กฑํ•œ๋‹ค.
  • ์š”๊ธˆ ์ฒด๊ณ„๋Š” EC2 ๊ณ„์—ด๊ณผ Fargate๊ฐ€ ๋‹ค๋ฅด๋‹ค. EC2(t4g)๋Š” ์ธ์Šคํ„ด์Šค ๋‹จ์œ„๋กœ ๊ณผ๊ธˆํ•˜๊ณ , CPU๋ฅผ ๊ธฐ์ค€ ์„ฑ๋Šฅ๊ณผ ํฌ๋ ˆ๋”ง ๋ฒ„์ŠคํŠธ๋กœ ์ œ๊ณตํ•œ๋‹ค. Fargate๋Š” ์ง€์ •ํ•œ vCPU์™€ ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ๊ฐ ๊ณผ๊ธˆํ•˜๊ณ , ์ง€์ •ํ•œ vCPU๋ฅผ ๋ฒ„์ŠคํŠธ ์—†์ด ๋ณด์žฅํ•œ๋‹ค.
  • ํƒœ์Šคํฌ ์ •์˜ ๋ฆฌ๋น„์ „: ํƒœ์Šคํฌ ์ •์˜(์ด๋ฏธ์ง€, CPUยท๋ฉ”๋ชจ๋ฆฌ, ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋“ฑ)๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ๋งˆ๋‹ค ๋งŒ๋“ค์–ด์ง€๋Š” ์ƒˆ ๋ฒ„์ „

4.2 ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ ๋น„์œจ๊ณผ ๋น„์šฉ

  • ์„œ์šธ ๋ฆฌ์ „, ์˜จ๋””๋งจ๋“œ, ์›” 730์‹œ๊ฐ„ ๊ธฐ์ค€
  • ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ์ธก์ •์น˜์— ๋”ฐ๋ผ Peak RPS 80์—์„œ 0.45 vCPU๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ๋‹ค.
  • ์ธก์ •์น˜์— ํ•œ๊ณ„๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ์—ฌ์œ ๋ฅผ ๋‘๊ธฐ ์œ„ํ•ด AZ ์žฅ์• ๋กœ ์‹คํ–‰ ๋‹จ์œ„๊ฐ€ ํ•˜๋‚˜ ๋น ์ง„ ์ƒํ™ฉ๊นŒ์ง€ Peak RPS์—์„œ vCPU ์‚ฌ์šฉ ๋น„์œจ์„ 70% ์ดํ•˜๋กœ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.
๊ตฌ์„ฑ ์‹คํ–‰ ๋‹จ์œ„ vCPU ์‚ฌ์šฉ ๋น„์œจ AZ ์žฅ์•  ์‹œ vCPU ์‚ฌ์šฉ ๋น„์œจ ์›” ๋น„์šฉ
Fargate 0.5 vCPU / 1 GB ร— 2 45% 90% $33.2
Fargate 0.5 vCPU / 1 GB ร— 3 (AZ 3๊ฐœ) 30% 45% $49.7
Fargate 1 vCPU / 2 GB ร— 2 23% 45% $66.3
t4g.small ร— 2 (ECS on EC2) 56% (๊ธฐ์ค€ ์„ฑ๋Šฅ 0.4 vCPU ๋Œ€๋น„) 23% (๋ฒ„์ŠคํŠธ ์ƒํ•œ 2 vCPU ๋Œ€๋น„) $35.8
t4g.small ร— 2 (ASG + EC2) ๋™์ผ ๋™์ผ $31.8
  • Fargate: ARM64 vCPU ์‹œ๊ฐ„๋‹น $0.03725, GB ์‹œ๊ฐ„๋‹น $0.00409. ํƒœ์Šคํฌ๋‹น ์ž„์‹œ ์Šคํ† ๋ฆฌ์ง€ 20 GiB๊ฐ€ ์š”๊ธˆ์— ํฌํ•จ๋œ๋‹ค.
  • t4g.small: ์‹œ๊ฐ„๋‹น $0.0208 ร— 2๋Œ€ = $30.4์— ๋ฃจํŠธ EBS๊ฐ€ ๋”ํ•ด์ง„๋‹ค. ECS ์ตœ์ ํ™” AMI์˜ ๋ฃจํŠธ ๋ณผ๋ฅจ์ด ๊ธฐ๋ณธ 30 GiB(gp3 GB-์›” $0.0912)๋ผ 2๋Œ€์— ์›” $5.5๊ฐ€ ๋“ ๋‹ค. EC2 + ASG๋Š” ์ผ๋ฐ˜ AL2023 AMI(8 GiB)๋ฅผ ์“ฐ๋ฏ€๋กœ ์›” $31.8์ด๋‹ค.

Fargate 0.5 vCPU, 1 GB ๊ตฌ์„ฑ์€ AZ ์žฅ์•  ์‹œ ์ƒˆ ํƒœ์Šคํฌ๊ฐ€ ํ• ๋‹น๋˜๊ธฐ ์ „๊นŒ์ง€ vCPU์˜ 90%๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 70%๋ฅผ ๋„˜์œผ๋ฏ€๋กœ ๋” ๋†’์€ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•˜๊ณ , ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๋‹ค.

  1. AZ ๊ฐœ์ˆ˜๋ฅผ ๋Š˜๋ ค ์ด ์„ธ ๊ณณ์— 0.5 vCPU, 1 GB ํƒœ์Šคํฌ๋ฅผ ๋‘”๋‹ค.
  2. ํƒœ์Šคํฌ ๋ฆฌ์†Œ์Šค๋ฅผ 1 vCPU, 2 GB๋กœ ๋Š˜๋ฆฐ๋‹ค. Fargate์—๋Š” 0.75 vCPU๊ฐ€ ์—†๊ณ , 1 vCPU์˜ ์ตœ์†Œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 2 GB๋‹ค.

2๋ฒˆ์€ 1๋ฒˆ๋ณด๋‹ค ๋น„์šฉ์ด ์•ฝ 33% ๋†’์œผ๋ฏ€๋กœ, Fargate๋ฅผ ์“ด๋‹ค๋ฉด 1๋ฒˆ์„ ์“ด๋‹ค.

EC2๋Š” t4g.small์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ํ‰์†Œ์—๋Š” ๊ธฐ์ค€ ์„ฑ๋Šฅ(0.4 vCPU) ๋Œ€๋น„ ์‚ฌ์šฉ ๋น„์œจ์ด Fargate๋ณด๋‹ค ๋†’๋‹ค. ํ•˜์ง€๋งŒ 0.4 vCPU๋ฅผ ๋„˜๋Š” ์ˆœ๊ฐ„๋ถ€ํ„ฐ๋Š” ์ ๋ฆฝํ•œ ํฌ๋ ˆ๋”ง์œผ๋กœ 2 vCPU๊นŒ์ง€ ๋ฒ„์ŠคํŠธํ•˜๋ฏ€๋กœ, AZ ์žฅ์•  ์‹œ์—๋„ ์‚ฌ์šฉ ๋น„์œจ์ด ์ƒํ•œ ๋Œ€๋น„ 23%์— ๊ทธ์นœ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์š”๊ตฌ๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๊ฐ€์žฅ ์ €๋ ดํ•œ Fargate ๊ตฌ์„ฑ($49.7)์ด ECS on EC2($35.8)๋ณด๋‹ค ์›” ์•ฝ $14, ์•ฝ 1.4๋ฐฐ ๋น„์‹ธ๋‹ค.

Fargate๋ฅผ ์“ฐ์ง€ ์•Š๋Š” ์ด์œ 

Fargate๋Š” EC2 ๊ณ„์—ด๋ณด๋‹ค 14~18 ๋‹ฌ๋Ÿฌ์ •๋„ ์ €๋ ดํ•˜์ง€๋งŒ, "๋น„์‹ธ์„œ ์“ฐ์ง€ ์•Š๋Š”๋‹ค"๊ฐ€ ์•„๋‹ˆ๋ผ "๊ทธ ๋ˆ์„ ๋” ๋‚ด๊ณ  ์–ป๋Š” ๊ฒƒ์ด ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ๊ฐ€"๋กœ ํŒ๋‹จํ–ˆ๋‹ค. Fargate๊ฐ€ ํ˜„์žฌ ์šฐ๋ฆฌ ์„œ๋น„์Šค ์ƒํ™ฉ์—์„œ EC2๋ณด๋‹ค ๋‚˜์€ ์ ์€ ๋‘ ๊ฐ€์ง€์ด๊ณ , ๋‘˜ ๋‹ค ์šฐ๋ฆฌ ์ƒํ™ฉ์—์„œ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

Fargate์˜ ์ด์  ์šฐ๋ฆฌ ์ƒํ™ฉ์—์„œ์˜ ๋Œ€์‘
์ธ์Šคํ„ด์Šค๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค ์ธ์Šคํ„ด์Šค ๊ต์ฒด์™€ ๊ฐœ์ˆ˜ ์œ ์ง€๋Š” ASG๊ฐ€ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. AMI ๊ฐฑ์‹ ์€ ์ธ์Šคํ„ด์Šค ์ƒˆ๋กœ ๊ณ ์นจ์œผ๋กœ ๋ฐ˜์˜ํ•œ๋‹ค.
ํ™•์žฅ์ด ๋น ๋ฅด๋‹ค. EC2๋Š” ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ๋„์šด ๋’ค์—์•ผ ํƒœ์Šคํฌ๋ฅผ ๋ฐฐ์น˜ํ•œ๋‹ค ํ˜„์žฌ peak RPS ํŠธ๋ž˜ํ”ฝ์œผ๋กœ๋Š” t4g.small ํ•œ ๋Œ€ ๋งŒ์œผ๋กœ๋„ ์„œ๋น„์Šค๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์„œ๋น„์Šค๊ฐ€ ์ ์  ๋” ์„ฑ์žฅํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” ํ”ผํฌ ํƒ€์ž„์— ๋งž์ถฐ ASG๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ๋Š˜๋ ค์„œ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํŠธ๋ž˜ํ”ฝ ๊ธ‰์ฆ์€ ์™ธ๋ถ€ ์š”์ธ๋ณด๋‹ค ๋‚ด๋ถ€ ์ด๋ฒคํŠธ๋กœ ์ƒ๊ธธ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋ฏ€๋กœ, ์ด๋ฒคํŠธ ์ „์— ์ธ์Šคํ„ด์Šค๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋Š˜๋ฆฐ๋‹ค.

๊ฐ์ˆ˜ํ•˜๋Š” ๊ฒƒ

  • 80 RPS์˜ CPU๋งŒ ๋ณด๋ฉด t4g.small 1๋Œ€๋กœ๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ€์šฉ์„ฑ ํ•˜ํ•œ์„  ๋•Œ๋ฌธ์— 2๋Œ€๋ฅผ ๋‘๊ณ , ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๋ฐฑ์—”๋“œ ํ•˜๋‚˜๋งŒ ์‹คํ–‰ํ•œ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ๋Š” OS+Docker(์•ฝ 340 MiB)์™€ ์ปจํ…Œ์ด๋„ˆ(์•ฝ 460 MiB)๋ฅผ ํ•ฉ์ณ ์•ฝ 800 MiB๋‹ค. ์—ฌ์œ ๋ฅผ ๋‘์–ด 1.5 GiB๋กœ ์žก์•„๋„ ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ์•ฝ 500 MiB๊ฐ€ ํ‰์†Œ์—๋Š” ์“ฐ์ด์ง€ ์•Š๋Š”๋‹ค.
  • ์˜ˆ์ธกํ•˜์ง€ ๋ชปํ•œ ๊ธ‰์ฆ์—๋Š” Fargate๋ณด๋‹ค ๋Šฆ๊ฒŒ ๋Œ€์‘ํ•œ๋‹ค. ์ƒˆ ์ธ์Šคํ„ด์Šค ๋ถ€ํŒ…, ECS ์—์ด์ „ํŠธ ๋“ฑ๋ก, ํƒœ์Šคํฌ ๋ฐฐ์น˜๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

4.3 ์šด์˜ ๋ณต์žก๋„

EC2 + ASG ๋Œ€์‹  ECS๋ฅผ ๊ณ ๋ฅด๋Š” ์ด์œ ๋Š” ๊ด€๋ฆฌ ๋‹จ์œ„๋‹ค.

  • ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐํฌํ•˜๋Š” ๋‹จ์œ„๋Š” ์ปจํ…Œ์ด๋„ˆ๋‹ค. ASG๋Š” ์ธ์Šคํ„ด์Šค ๊ฐœ์ˆ˜๋งŒ ๊ด€๋ฆฌํ•˜๊ณ , ECS๋Š” ์ปจํ…Œ์ด๋„ˆ(ํƒœ์Šคํฌ)๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์›” ์•ฝ $4์˜ ๋น„์šฉ ์ฐจ์ด๊ฐ€ ์žˆ์–ด๋„ ECS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • EC2 + ASG์—์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฒ„์ „ ๊ณ ์ •, ์žฅ์•  ๊ต์ฒด, ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๋ฅผ user data์™€ ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ง์ ‘ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ณ , ์ด ์ผ์€ ๋ฐฐํฌ์™€ ์žฅ์• ๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋ฐ˜๋ณต๋œ๋‹ค.
  • ECS๋Š” ์ด๋ฅผ ํƒœ์Šคํฌ ์ •์˜์™€ ์„œ๋น„์Šค ์„ค์ •์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋Œ€์‹ , ์ธ์Šคํ„ด์Šค(์šฉ๋Ÿ‰ ๊ณต๊ธ‰์ž)์™€ ํƒœ์Šคํฌ(์„œ๋น„์Šค) ๋‘ ๊ณ„์ธต์˜ ์Šค์ผ€์ผ๋ง์„ ์ฒ˜์Œ์— ํ•จ๊ป˜ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋‹ด์„ ์ง„๋‹ค.
์ž‘์—… EC2 + ASG ECS on EC2
๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ์ธ์Šคํ„ด์Šค์— CodeDeploy ์—์ด์ „ํŠธ, appspec, ํ›… ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•„์š”. ์ธ์Šคํ„ด์Šค ๋ฌถ์Œ ๋‹จ์œ„๋กœ ์ „ํ™˜ ์ด๋ฏธ์ง€๊ฐ€ ํƒœ์Šคํฌ ์ •์˜์— ๊ณ ์ •๋˜์–ด, ์Šค์ผ€์ผ ์•„์›ƒ์ด๋‚˜ ๊ต์ฒด๋กœ ์ƒ๊ธฐ๋Š” ํƒœ์Šคํฌ๋„ ํ˜„์žฌ ๋ฒ„์ „์„ ์‹คํ–‰ํ•œ๋‹ค. CodeDeploy ECS ๋ธ”๋ฃจ/๊ทธ๋ฆฐ์„ ์„œ๋น„์Šค ์„ค์ •์œผ๋กœ ์“ด๋‹ค
์žฅ์•  ์‹œ ๋ณต๊ตฌ ASG ํ—ฌ์Šค ์ฒดํฌ ์œ ํ˜•์„ ELB๋กœ ๋‘์–ด, ALB๊ฐ€ ์ธ์Šคํ„ด์Šค ํ—ฌ์Šค์ฒดํฌ ํ›„ ASG๊ฐ€ ์ธ์Šคํ„ด์Šค ๊ต์ฒด ํƒœ์Šคํฌ ์žฅ์• : ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ํƒœ์Šคํฌ๋งŒ ์ค‘์ง€ํ•˜๊ณ  ์ƒˆ๋กœ ๋„์šด๋‹ค
์ธ์Šคํ„ด์Šค ์žฅ์• : ์ƒˆ ์ธ์Šคํ„ด์Šค ๊ต์ฒด
์ธ์Šคํ„ด์Šค ๊ต์ฒด ๋Œ€์ƒ ๊ทธ๋ฃน์˜ ๋“ฑ๋ก ํ•ด์ œ ์ง€์—ฐ์ด ๋๋‚˜๋ฉด ์ธ์Šคํ„ด์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ์ธ์Šคํ„ด์Šค ๊ต์ฒด ์ธ์Šคํ„ด์Šค ๋“œ๋ ˆ์ด๋‹์ด ์ข…๋ฃŒํ•  ์ธ์Šคํ„ด์Šค์˜ ํƒœ์Šคํฌ๋ฅผ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์— ๋จผ์ € ๋„์šด ๋’ค ๊ธฐ์กด ํƒœ์Šคํฌ๋ฅผ ๋ฉˆ์ถ˜๋‹ค
๋น„๋ฐ€๊ฐ’ user data๊ฐ€ SSM์—์„œ ์ฝ์–ด ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋„ฃ๋Š”๋‹ค. ๊ถŒํ•œ์€ ์ธ์Šคํ„ด์Šค ํ”„๋กœํŒŒ์ผ ๋‹จ์œ„๋‹ค ํƒœ์Šคํฌ ์ •์˜ secrets๊ฐ€ ์ฃผ์ž…ํ•œ๋‹ค. ๊ถŒํ•œ์€ ํƒœ์Šคํฌ ์—ญํ•  ๋‹จ์œ„๋‹ค
  • ๋“œ๋ ˆ์ด๋‹: EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜ ๊ต์ฒดํ•  ๋•Œ ์‹คํ–‰ ์ค‘์ธ ํƒœ์Šคํฌ(Task)๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ค‘์ง€ํ•˜๊ณ , ์ƒˆ๋กœ์šด ํƒœ์Šคํฌ๊ฐ€ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์— ๋ฐฐ์น˜๋˜์ง€ ์•Š๋„๋ก ์ƒํƒœ๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ณต์‹๋ฌธ์„œ

4.4 ์šด์šฉ ๋ฐฉ์‹ ์ •๋ฆฌ

ํ•ญ๋ชฉ ๊ฐ’
์ธ์Šคํ„ด์Šค t4g.small 2๋Œ€ (AZ๋‹น 1๋Œ€), ECS์˜ Capacity Provider๋Š” ASG
ํƒœ์Šคํฌ ์ธ์Šคํ„ด์Šค๋‹น ํ‰์ƒ์‹œ 1๊ฐœ. ์ปจํ…Œ์ด๋„ˆ cpu๋Š” ๊ฐ€์ค‘์น˜๋งŒ ๋‘”๋‹ค. memoryReservation ์•ฝ 512 MiB
๋„คํŠธ์›Œํฌ bridge ๋ชจ๋“œ
๋ฐฐํฌ ์ „๋žต ๋ธ”๋ฃจ/๊ทธ๋ฆฐ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ. AWS CodeDeploy๋ฅผ ์ด์šฉํ•ด AllAtOnce ๋ฐฉ์‹์œผ๋กœ ์ƒˆ ๋ฒ„์ „์˜ Task๋ฅผ ๋™์‹œ์— ๋ฐฐํฌ

๋„คํŠธ์›Œํฌ ๋ชจ๋“œ

  • awsvpc ๋ชจ๋“œ: ECS์—์„œ Task์— ENI๋ฅผ ์ง์ ‘ ํ• ๋‹นํ•˜์—ฌ, EC2 ์ธ์Šคํ„ด์Šค์™€ ๋™์ผํ•œ ์ˆ˜์ค€์˜ ๋…๋ฆฝ๋œ ํ”„๋ผ์ด๋น— IPv4 ์ฃผ์†Œ์™€ ๋„คํŠธ์›Œํฌ ์†์„ฑ์„ ๋ถ€์—ฌํ•˜๋Š” ๋„คํŠธ์›Œํ‚น ๋ชจ๋“œ
    • Task์— private IPv4 ์ฃผ์†Œ๋ฅผ ๋ฐ›์œผ๋ฏ€๋กœ ๋ฐฑ์—”๋“œ์—์„œ ์นด์นด์˜ค OAuth ์•„์›ƒ๋ฐ”์šด๋“œ ํŠธ๋ž˜ํ”ฝ์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด NAT ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ํ•„์š”ํ•จ
  • bridge ๋ชจ๋“œ: ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ธ์Šคํ„ด์Šค์˜ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ฑฐ์ณ ๋‚˜๊ฐ€๋ฏ€๋กœ ์ธ์Šคํ„ด์Šค ๊ณต์ธ IP๋กœ ์™ธ๋ถ€์— ์—ฐ๊ฒฐ
    • ์ปจํ…Œ์ด๋„ˆ 8080์„ ์ธ์Šคํ„ด์Šค์˜ ๋™์  ํฌํŠธ์— ๋งคํ•‘
    • ALB ๋Œ€์ƒ ์œ ํ˜•์€ instance

์ฃผ์˜์‚ฌํ•ญ

์‹คํ–‰ ๋‹จ์œ„์™€ ์„œ๋น„์Šค ์ข…๋ฅ˜๊ฐ€ ๋Š˜์–ด AMI์™€ ์šฉ๋Ÿ‰ ๊ณต๊ธ‰์ž ๊ด€๋ฆฌ๊ฐ€ ์„œ๋น„์Šค ๋น„์šฉ ์ฐจ์•ก์ธ ์›” $18๋ณด๋‹ค ํฐ ๋ถ€๋‹ด์ด ๋˜๋ฉด Fargate๋ฅผ ๋‹ค์‹œ ๋น„๊ตํ•œ๋‹ค. ํƒœ์Šคํฌ ์ •์˜๋Š” ๊ทธ๋Œ€๋กœ ์“ธ ์ˆ˜ ์žˆ์ง€๋งŒ ์„œ๋น„์Šค์˜ ์šฉ๋Ÿ‰ ๊ณต๊ธ‰์ž ์œ ํ˜•์€ ๋ฐ”๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ์ƒˆ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ALB์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ๋„˜๊ธด๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ (ํด๋ฆญํ•ด์„œ ํŽผ์น˜๊ธฐ)
  • AWS Fargate ์š”๊ธˆ
    • ํƒœ์Šคํฌ 1๊ฐœ ์‹œ๊ฐ„๋‹น = vCPU ์ˆ˜ ร— $0.03725 + ๋ฉ”๋ชจ๋ฆฌ GB ร— $0.00409
    • 0.5 ร— 0.03725 + 1 ร— 0.00409 = $0.022715 = ์•ฝ $33.2
โš ๏ธ **GitHub.com Fallback** โš ๏ธ