Docker - 100-hours-a-week/9-team-Devths-WIKI GitHub Wiki

๋ชฉ์ฐจ (ํŽผ์น˜๊ธฐ/์ ‘๊ธฐ)

0. Docker ์ปจํ…Œ์ด๋„ˆํ™” ๋ฐฐํฌ ์„ค๊ณ„

๐Ÿ’ก ์ปจํ…Œ์ด๋„ˆ๋ž€? ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฃผ๋ณ€ ํ™˜๊ฒฝ์— ์ƒ๊ด€์—†์ด ์–ด๋””์„œ๋“  ๋˜‘๊ฐ™์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํŒจํ‚ค์ง•ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.


1. ํ˜„์žฌ Devths ์„œ๋น„์Šค์˜ ๋ฐฐ๊ฒฝ ๋ฐ ๋ฌธ์ œ ์ •์˜

1-1. Devths ์„œ๋น„์Šค ์ธํ”„๋ผ์—์„œ ์ค‘์š”ํ•œ ์š”์†Œ

Devths๋Š” AI ์•Œ๋ฆผ ๋ฐ ์ทจ์—… ์ง€์› ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์ด๋ ฅ์„œ์™€ ํฌํŠธํด๋ฆฌ์˜ค ๊ฐ™์€ ์‚ฌ์šฉ์ž์˜ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃธ. ๋”ฐ๋ผ์„œ ์ธํ”„๋ผ ์„ค๊ณ„ ์‹œ ์•ˆ์ •์„ฑ(๋ฐฐํฌยท๋ณต๊ตฌยทํ™•์žฅ)๊ณผ ๋ณด์•ˆ์„ ์ตœ์šฐ์„  ๊ฐ€์น˜๋กœ ์„ค์ •ํ•˜์—ฌ ๊ตฌ์ถ•ํ•จ.

์„œ๋น„์Šค ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ทจ์—… ์ค€๋น„ ์ƒํƒœ๋ฅผ ์ œ๋•Œ ํ™•์ธยท์ˆ˜์ •ํ•˜๊ธฐ ์–ด๋ ต๊ณ , ์ด๋ ฅ์„œยทํฌํŠธํด๋ฆฌ์˜ค์—๋Š” ๊ฐœ์ธ์ •๋ณด๋ฟ ์•„๋‹ˆ๋ผ ๋Œ€์™ธ๋น„ ์ˆ˜์ค€์˜ ๋‚ด์šฉ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์–ด ๋ฌด๋‹จ ์ ‘๊ทผ๊ณผ ์œ ์ถœ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ณด์•ˆ์ด ํ•„์ˆ˜์ž„.

ํ˜„์žฌ ์„œ๋น„์Šค์˜ ์„ฑ์žฅ์„ธ๊ฐ€ ๊ฐ€ํŒŒ๋ฅด์ง€๋งŒ, ์žฅ์• ๊ฐ€ ๋ฐ˜๋ณต๋˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ์„œ๋น„์Šค ์‹ ๋ขฐ๋ฅผ ์žƒ๊ณ  ๋น ๋ฅด๊ฒŒ ์ดํƒˆํ•  ์ˆ˜ ์žˆ์Œ.


1-2. ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜ ํŠน์„ฑ

  • ๋‹จ์ผ ์ธ์Šคํ„ด์Šค ๋ฐ ๋‹ค์ค‘ ์–ธ์–ด ์Šคํƒ(Sprint Boot + Python AI + Next.js)์œผ๋กœ ๊ตฌ์„ฑ๋จ.
  • AI ๋ถ„์„ ๊ธฐ๋Šฅ์€ CPU/RAM์„ ์ง‘์ค‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ๋…์  ์œ„ํ—˜์ด ์กด์žฌํ•จ.
  • ์™ธ๋ถ€ API(OAuth, LLM) ์˜์กด๋„๊ฐ€ ๋†’์•„ ์™ธ๋ถ€ ์ง€์—ฐ์ด ์‹œ์Šคํ…œ ์ „์ฒด๋กœ ์ „์ด๋  ์ˆ˜ ์žˆ์Œ.
  • ์ฑ„ํŒ… ๊ธฐ๋Šฅ์€ WebSocket ๊ธฐ๋ฐ˜ ์žฅ๊ธฐ ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์—ฐ๊ฒฐ ์ˆ˜ ์ฆ๊ฐ€์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ/๋„คํŠธ์›Œํฌ/CPU ์ฆ๊ฐ€๋Ÿ‰์ด ์„ ํ˜•์ ์œผ๋กœ ์ฆ๊ฐ€ํ•จ.

1-3. ์„œ๋น„์Šค ๋‚ด ๋ฌธ์ œ์ 

ํ˜„์žฌ ์„œ๋น„์Šค๋Š” MAU๊ฐ€ 30๋งŒ์œผ๋กœ ์ด์šฉ์ž ์ˆ˜๊ฐ€ ๊ธ‰๊ฒฉํ•˜๊ฒŒ ์ฆ๊ฐ€ ์ค‘์ด๊ธฐ์—, ์„œ๋น„์Šค ํ™•์žฅ์ด ํ•„์š”ํ•œ ์ƒํ™ฉ

  • ๋ฌธ์ œ 1 (์ฑ„ํŒ… ํŠธ๋ž˜ํ”ฝ์˜ ํ™•์žฅ ์š”๊ตฌ)

    WebSocket ๊ธฐ๋ฐ˜ ์ฑ„ํŒ…์€ ์—ฐ๊ฒฐ์ด ์˜ค๋ž˜ ์œ ์ง€๋˜๋Š” ํŠน์„ฑ์ƒ ์‚ฌ์šฉ์ž๊ฐ€ ๋Š˜์–ด๋‚ ์ˆ˜๋ก ๋™์‹œ ์—ฐ๊ฒฐ๋งŒํผ ๋ฉ”๋ชจ๋ฆฌ ์ ์œ ๊ฐ€ ๋ˆ„์ ๋จ.

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

    ๋”ฐ๋ผ์„œ ์ฑ„ํŒ…์€ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€์— ๋งž์ถฐ ์ˆ˜ํ‰ ํ™•์žฅ(Scale-out)์„ ์ „์ œ๋กœ ์„ค๊ณ„ํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ.


  • ๋ฌธ์ œ 2 (๋‹จ์ผ ์„œ๋ฒ„ ๊ตฌ์กฐ์—์„œ์˜ ์—ฐ์‡„ ์žฅ์•  ์œ„ํ—˜)

    AI ๋ถ„์„ ์š”์ฒญ์€ CPU/RAM์„ ์ง‘์ค‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํŠธ๋ž˜ํ”ฝ์ด ๋ชฐ๋ฆฌ๋ฉด ๋™์ผ ์„œ๋ฒ„์—์„œ ๋™์ž‘ํ•˜๋Š” ๋‹ค๋ฅธ ๊ธฐ๋Šฅ(์ด๋ ฅ์„œ ์กฐํšŒ/์ €์žฅ ๋“ฑ)๊นŒ์ง€ ์‘๋‹ต ์ง€์—ฐยทํƒ€์ž„์•„์›ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ.

    ํŠน์ • ๊ธฐ๋Šฅ์˜ ๋ถ€ํ•˜๊ฐ€ ์ „์ฒด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ฌด๋„ˆ๋œจ๋ฆฌ๋Š” ์—ฐ์‡„ ์žฅ์• ๋กœ ํ™•์žฅ๋  ์œ„ํ—˜์ด ์กด์žฌํ•จ.


  • ๋ฌธ์ œ 3(๋ฐฐํฌ ์˜ˆ์ธก ๋ถˆ๊ฐ€)

    ํ˜„์žฌ GitHub Actions(CI) + AWS CodeDeploy(CD)๋กœ ์ž๋™ํ™”๋Š” ๊ฐ–์ถฐ์ ธ ์žˆ์Œ.

    ๋‹ค๋งŒ ๋ฐฐํฌ ๊ฒฐ๊ณผ๋ฌผ์ด ์„œ๋ฒ„ ํ™˜๊ฒฝ(JDK/OS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/์„ค์ •)์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ตฌ์กฐ์ด๊ธฐ์—, ๋™์ผ ๋ฆฌ๋น„์ „์ด๋ผ๋„ ์„œ๋ฒ„ ์ƒํƒœ์— ๋”ฐ๋ผ ๋ฐฐํฌ๋Š” ์„ฑ๊ณตํ–ˆ์ง€๋งŒ ์‹คํ–‰์ด ์‹คํŒจํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ.


2. Docker ๋„์ž… ํ•ต์‹ฌ ๋…ผ๋ฆฌ

๋‹จ์ˆœ ์ธ์Šคํ„ด์Šค ํ™•์žฅ์ด ์•„๋‹Œ, ์™œ ์ปจํ…Œ์ด๋„ˆ์—ฌ์•ผ ํ•˜๋Š”๊ฐ€?

2-1. ์ธ์Šคํ„ด์Šค, ๊ฐ€์ƒํ™”, ์ปจํ…Œ์ด๋„ˆ ๋น„๊ต

์ธ์Šคํ„ด์Šค(ํ”„๋กœ์„ธ์Šค ๋ฐฐํฌ) ๊ฐ€์ƒํ™”(VM) ์ปจํ…Œ์ด๋„ˆ(Docker)
ํŠน์ง• ํ˜ธ์ŠคํŠธ OS์— ์ง์ ‘ ์„ค์น˜/์‹คํ–‰, ํ™˜๊ฒฝ์ด ๋ˆ„์ ๋จ(๋“œ๋ฆฌํ”„ํŠธ) ๊ฒŒ์ŠคํŠธ OS ํฌํ•จ, ๊ฒฉ๋ฆฌ ๊ฐ•ํ•˜์ง€๋งŒ ๋ฌด๊ฑฐ์›€ ํ”„๋กœ์„ธ์Šค+์˜์กด์„ฑ๋งŒ ํŒจํ‚ค์ง•, ๋™์ผ ์ด๋ฏธ์ง€๋กœ ์–ด๋””์„œ๋‚˜ ๋™์ผ ์‹คํ–‰
์•ˆ์ •์„ฑ ํ•œ ํ”„๋กœ์„ธ์Šค ์žฅ์• /๋ฆฌ์†Œ์Šค ํญ์ฃผ๊ฐ€ ์ „์ฒด์— ์ „์ด๋˜๊ธฐ ์‰ฌ์›€ ์šด์˜/๋ฐฐํฌ๊ฐ€ ๋А๋ฆผ cgroup/namespace๋กœ ์„œ๋น„์Šค๋ณ„ ๊ฒฉ๋ฆฌ, ํ—ฌ์Šค์ฒดํฌยท์žฌ๊ธฐ๋™ ์ž๋™ํ™” ์šฉ์ด
๋ณด์•ˆ ์„œ๋ฒ„์— ํŒจํ‚ค์ง€/๋„๊ตฌ๊ฐ€ ๊ณ„์† ์Œ“์—ฌ ๊ณต๊ฒฉ๋ฉด ์ฆ๊ฐ€ OS ๋‹จ์œ„ ๊ฒฉ๋ฆฌ๋กœ ๊ฐ•ํ•จ ์ปค๋„ ๊ณต์œ ๋ผ VM๋งŒํผ ๊ฐ•ํ•œ ๊ฒฝ๊ณ„๋Š” ์•„๋‹ˆ๋‚˜, ์ด๋ฏธ์ง€ ์ตœ์†Œํ™”/๊ถŒํ•œ ์ถ•์†Œ/๋„คํŠธ์›Œํฌ ๋ถ„๋ฆฌ๋กœ ์‹ค๋ฌด ๋ณด์•ˆ ์ˆ˜์ค€ ๋‹ฌ์„ฑ ๊ฐ€๋Šฅ
Devths ๊ฒฐ๋ก  AI ํญ์ฃผ/์ฑ„ํŒ… ๋™์‹œ์ ‘์†์—์„œ ๊ฐ€์žฅ ์ทจ์•ฝ ์•ˆ์ •์„ฑ์€ ์ข‹์ง€๋งŒ ์†Œ๊ทœ๋ชจ ํŒ€์— ์šด์˜ ๋ถ€๋‹ด ํผ ๊ฐ€์žฅ ์ž‘์€ ๋น„์šฉ์œผ๋กœ โ€˜์ž์› ๊ฒฉ๋ฆฌ+๋น ๋ฅธ ๋ฐฐํฌ+์ผ๊ด€์„ฑโ€™์„ ๋™์‹œ์— ๋‹ฌ์„ฑ

2-2. Devths ์„œ๋น„์Šค์— ํ•„์š”ํ•œ ์ปจํ…Œ์ด๋„ˆ ํŠน์„ฑ

  • Devths ์ธํ”„๋ผ ํ™•์žฅ ์ „์ œ ์กฐ๊ฑด์€ ์•ˆ์ •์„ฑ๊ณผ ๋ณด์•ˆ ์ž„. ์ปจํ…Œ์ด๋„ˆ ๋„์ž…์€ 1-3์—์„œ ์ •์˜ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•

2-2-1. ๋‹จ์ผ ์ธ์Šคํ„ด์Šค์—์„œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

Devths๊ฐ€ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋Š” ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ์— ๊ธฐ๋Šฅ๋ณ„ ์ž์›์˜ ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”ํ•จ.

  1. ๊ธฐ๋Šฅ๋ณ„ ๊ฒฉ๋ฆฌ ๋ฐ ์ž์› ๊ฐ„์„ญ ์ตœ์†Œํ™”๊ฐ€ ํ•„์š”ํ•จ
    Devths๋Š” AI(VLLM) ๊ณ ๋ถ€ํ•˜์™€ ์ฑ„ํŒ…(WebSocket) ์žฅ๊ธฐ ์—ฐ๊ฒฐ์ด ๊ณต์กดํ•˜๋ฏ€๋กœ, ํ•œ ๊ธฐ๋Šฅ์˜ ํญ์ฃผ๊ฐ€ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ(BE API ๋“ฑ)์œผ๋กœ ์ „์ด๋˜์ง€ ์•Š๋„๋ก ์‹คํ–‰ ๋‹จ์œ„๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ์ž์› ์‚ฌ์šฉ์„ ์ œ์–ดํ•ด์•ผ ํ•จ. ์„œ๋น„์Šค๋ณ„ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰/์žฌ๊ธฐ๋™ ๋‹จ์œ„๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ , ํ•„์š” ์‹œ CPUยท๋ฉ”๋ชจ๋ฆฌ ์ƒํ•œ์„ ์„ค์ •ํ•ด ์žฅ์•  ์ „ํŒŒ์™€ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์™„ํ™”ํ•จ. ํ”„๋กœ์„ธ์Šค์—๋„ cgroup ๊ธฐ๋ฐ˜ ์ž์› ์ œํ•œ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, Docker๋Š” ํ”„๋กœ์„ธ์ŠคยทํŒŒ์ผ์‹œ์Šคํ…œยท๋„คํŠธ์›Œํฌ๊นŒ์ง€ ์„œ๋น„์Šค ๋‹จ์œ„๋กœ ๋ฌถ์–ด ๊ฒฉ๋ฆฌํ•˜๋ฏ€๋กœ ์šด์˜ ๋ณต์žก๋„์™€ ์žฅ์•  ์ „ํŒŒ๋ฅผ ํ•จ๊ป˜ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Œ.

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

2-2-2. ๋ฉ€ํ‹ฐ ์ธ์Šคํ„ด์Šค๋กœ ์ „ํ™˜ํ•  ๋–„, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

Devths๋Š” MAU๊ฐ€ ํญ๋ฐœ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•  ๊ฒฝ์šฐ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋งŒ์œผ๋กœ๋Š” ์ฑ„ํŒ…(WebSocket) ๋™์‹œ ์—ฐ๊ฒฐ๊ณผ AI(VLLM) ์š”์ฒญ๋Ÿ‰์„ ๊ฐ๋‹นํ•˜๊ธฐ ์–ด๋ ค์›Œ, ๋ฉ€ํ‹ฐ ์ธ์Šคํ„ด์Šค(์ˆ˜ํ‰ ํ™•์žฅ) ์ „ํ™˜์„ ๊ณ ๋ คํ•ด์•ผ ํ•จ.


  1. Scale-out์€ โ€˜๋™์ผํ•œ ์‹คํ–‰ ๋‹จ์œ„ ๋ณต์ œโ€™๊ฐ€ ์ „์ œ์ž„
    ์ธ์Šคํ„ด์Šค๊ฐ€ ๋Š˜์–ด๋‚ ์ˆ˜๋ก ์ˆ˜๋™์œผ๋กœ ๋Ÿฐํƒ€์ž„์„ ์„ค์น˜ํ•˜๊ณ  ์„ค์ •ํ•˜๋Š” ๋ฐฉ์‹์€ ์„œ๋ฒ„๋ณ„ ํŽธ์ฐจ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉฐ, ์žฅ์•  ์›์ธ์„ ๋ถ„์‚ฐ์‹œํ‚ด. Docker ์ด๋ฏธ์ง€๋Š” ๋ชจ๋“  ์„œ๋ฒ„์— ๋™์ผํ•œ ์‹คํ–‰ ๋‹จ์œ„๋ฅผ ์ œ๊ณตํ•˜์—ฌ, ์„œ๋ฒ„ ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋”๋ผ๋„ ์ „์ฒด ์‹œ์Šคํ…œ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๊ท ์ผํ•˜๊ฒŒ ์œ ์ง€๋˜๋„๋ก ๋ณด์žฅํ•จ.

  1. ASG(Auto Scaling Group)์—์„œ๋Š” ๋ถ€ํŒ… ์ดํ›„ ์ ˆ์ฐจ๊ฐ€ ์งง์•„์•ผ ํ•จ
    ์ƒˆ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ์„ค์น˜์™€ ๊ตฌ์„ฑ ์ž‘์—…์ด ๊ธธ์–ด์ง€๋ฉด ํ™•์žฅ(Scaling) ์†๋„๊ฐ€ ์ €ํ•˜๋˜๊ณ  ์‹คํŒจ ์ง€์ ์ด ๋Š˜์–ด๋‚จ. ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜์˜ ์ด๋ฏธ์ง€ ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๋ฉด ๋ณต์žกํ•œ ์ดˆ๊ธฐํ™” ๊ณผ์ •์ด ์ƒ๋žต๋˜์–ด ์ธ์Šคํ„ด์Šค ํ™•์žฅ ํ๋ฆ„์ด ๋‹จ์ˆœํ•ด์ง€๊ณ  ๋นจ๋ผ์ง.

  1. ๋ณด์•ˆ ๋ฐ ์•ˆ์ •์„ฑ์„ ์œ„ํ•œ ์šด์˜ ํ‘œ์ค€์„ ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉํ•จ
    Devths๋Š” ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ์„œ๋น„์Šค์ด๋ฏ€๋กœ ์‹คํ–‰ ๊ถŒํ•œ ์ตœ์†Œํ™”, ์ด๋ฏธ์ง€ ๊ฒฝ๋Ÿ‰ํ™”, ๋„คํŠธ์›Œํฌ ๋ถ„๋ฆฌ์™€ ๊ฐ™์€ ์šด์˜ ์›์น™์„ ๋ชจ๋“  ํ™˜๊ฒฝ์— ๋™์ผํ•˜๊ฒŒ ์ ์šฉํ•ด์•ผ ํ•จ. Docker๋Š” ์ด๋Ÿฌํ•œ ์›์น™์„ ์ด๋ฏธ์ง€ ์ž์ฒด์™€ ์‹คํ–‰ ์„ค์ •์œผ๋กœ ํ‘œ์ค€ํ™”ํ•จ. ์ด๋ฅผ ํ†ตํ•ด ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ถ€ํ„ฐ ๋ฉ€ํ‹ฐ ์ธ์Šคํ„ด์Šค ํ™˜๊ฒฝ๊นŒ์ง€ ๋™์ผํ•œ ์ˆ˜์ค€์˜ ๋ณด์•ˆ ๋ฐ ์•ˆ์ •์„ฑ ๊ธฐ์ค€์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Œ.

3. Docker ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ๋„

image
  • ์šด์˜ ์ ‘๊ทผ์€ SSM์„ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜์—ฌ ์ธ๋ฐ”์šด๋“œ ํฌํŠธ ๋…ธ์ถœ์„ ์ตœ์†Œํ™”ํ•จ.
  • ๋ฐฑ์—”๋“œ ๋ฐ ๋ฐ์ดํ„ฐ ๊ณ„์ธต์€ ํ”„๋ผ์ด๋น— ์„œ๋ธŒ๋„ท์— ๋ฐฐ์น˜ํ•˜์—ฌ ์™ธ๋ถ€ ์ง์ ‘ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•จ.
  • ํ™˜๊ฒฝ๋ณ„๋กœ VPC๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์šด์˜ ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ๋ฐ ์‚ฌ๊ณ  ์ „ํŒŒ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•จ.

4. ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์กฐ ์„ค๊ณ„

4-1. ์ปจํ…Œ์ด๋„ˆ ํŒจํ‚ค์ง• ๋น„๊ต

์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ๋ฐ ์‹คํ–‰ ํ™˜๊ฒฝ ํ›„๋ณด๋ฅผ daemon/daemon-less, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜/์‹œ์Šคํ…œ ์ปจํ…Œ์ด๋„ˆ ๊ด€์ ์—์„œ ๋น„๊ตํ•จ. ๊ธฐ์ˆ  ์„ ํƒ ๊ธฐ์ค€์€ ๋ณด์•ˆ, ์•ˆ์ •์„ฑ, ๋น„์šฉ, ํ˜ธํ™˜์„ฑ

image

2025๋…„ ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์„ค๋ฌธ์กฐ์‚ฌ - Cloud ๊ด€๋ จ ์ธ๊ธฐ ์žˆ๋Š” ๋„๊ตฌ

ํ•ญ๋ชฉ Containerd Docker (์„ ํƒ) Podman LXD
์ข…๋ฅ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ ์‹œ์Šคํ…œ ์ปจํ…Œ์ด๋„ˆ
ํ•ต์‹ฌ ์„ฑ๊ฒฉ ๋กœ์šฐ๋ ˆ๋ฒจ ํ‘œ์ค€ ๋Ÿฐํƒ€์ž„ ๊ฐ€์žฅ ๋Œ€์ค‘์ ์ธ ํ”Œ๋žซํผ (Daemon ๊ธฐ๋ฐ˜) ๋ฐ๋ชฌ๋ฆฌ์Šค(Daemonless) ๊ธฐ๋ฐ˜ ๊ฐ€์ƒํ™” ์‹œ์Šคํ…œ ์ปจํ…Œ์ด๋„ˆ
ํ˜ธํ™˜์„ฑ K8s ๊ณต์‹ ํ‘œ์ค€์œผ๋กœ ์šด์˜ ํ™˜๊ฒฝ ํ™•์žฅ ์‹œ ์œ ๋ฆฌ CI/CD ๋ฐ ์ผ๋ฐ˜ ์•ฑ ๋ฐฐํฌ์˜ ํ‘œ์ค€์ด์ž Containerd๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ k8s ํ™•์žฅ ๊ฐ€๋Šฅ Pod ๊ฐœ๋…์„ ์ง€์›ํ•˜์—ฌ, ์ถ”ํ›„ k8s ํ™•์žฅ ์‹œ ๊ฐœ๋… ์ดํ•ด ์œ ๋ฆฌ ECR, ๋„์ปคํ—ˆ๋ธŒ ๋“ฑ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ / ํ์‡„๋งยท์ธํ„ฐ๋„ท ๋ถˆ๊ฐ€ ํ™˜๊ฒฝ์—์„œ ์“ฐ๊ธฐ์— ์ „์šฉ ์„œ๋ฒ„ ์‚ฌ์šฉ
๋ณด์•ˆ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๋งŒ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋…ธ์ถœ ์ตœ์†Œํ™” Daemon ๋ฐ Root ๊ถŒํ•œ ์˜์กด Daemon-less๋กœ ๊ณต๊ฒฉ ํ‘œ๋ฉด ์ตœ์†Œํ™” VM์— ์ค€ํ•˜๋Š” ๊ฐ•ํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€
์ž ์žฌ์  ์œ„ํ—˜ - ๋‚ฎ์€ ์‚ฌ์šฉ์ž ์ ‘๊ทผ์„ฑ - Docker Daemon์ด ์ฃฝ์œผ๋ฉด ํ•ด๋‹น ๋…ธ๋“œ ์ „์ฒด๊ฐ€ ๋งˆ๋น„

- Root ๊ณ„์ •์œผ๋กœ Daemon์ด ๋…ธ์ถœ๋˜์–ด ๊ณต๊ฒฉ๋‹นํ•  ์œ„ํ—˜ ์กด์žฌ
- ์ปจํ…Œ์ด๋„ˆ ๋นŒ๋“œ์‹œ, Buildah๋Š” ์˜คํ”ˆ ์†Œ์Šค ๋„๊ตฌ ์˜์กด

- Root ๊ถŒํ•œ์ด ์—†๊ธฐ์— 1024๋ฒˆ ์ดํ•˜์˜ ํฌํŠธ/๊ถŒํ•œ/๋งˆ์šดํŠธ/๋„คํŠธ์›Œํฌ ์ถ”๊ฐ€ ์„ค์ • ํ•„์š”
- Docker/OCI ์ด๋ฏธ์ง€๋ฅผ LXD๊ฐ€ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ์•„๋‹˜
๋น„์šฉ ์˜คํ”ˆ์†Œ์Šค (๋ฌด๋ฃŒ) Personal ๋ฌด๋ฃŒ / Pull ํšŸ์ˆ˜ 200ํšŒ/6์‹œ๊ฐ„ ์ œํ•œ
- 250๋ช… ์ด์ƒ ์‹œ, PRO๋ฒ„์ „ ์›” $7 ๋น„์šฉ
์˜คํ”ˆ์†Œ์Šค (๋ฌด๋ฃŒ) ์˜คํ”ˆ์†Œ์Šค (๋ฌด๋ฃŒ)
  • LXD๋Š” ์‹œ์Šคํ…œ ์ปจํ…Œ์ด๋„ˆ์ด๊ธฐ์—, ๊ฒฝ๋Ÿ‰ํ™”๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์“ฐ๋Š” ์˜๋ฏธ๊ฐ€ ํ‡ด์ƒ‰๋˜์–ด ๋ฐฐ์ œํ•จ.
  • podman์˜ ๊ฒฝ์šฐ์—, ๋ช…๋ น์–ด ์น˜ํ™˜ (alias docker=podman) ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—… ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•˜๋Š” ๋“ฑ ํŽธ์˜์„ฑ๋„ ๋†’์ง€๋งŒ, Docker-compose ๋ฐ ๋„คํŠธ์›Œํฌ์˜ ํ˜ธํ™˜์„ฑ ๋ถ€์กฑ.
  • Docker ์ƒํƒœ๊ณ„์—์„œ ๋ฐœ์ƒํ•œ ๋ณด์•ˆ ์‚ฌ๊ณ ๋“ค์ด Docker ๋ฐ๋ชฌ์˜ ๋ฃจํŠธ ๊ถŒํ•œ ์‹คํ–‰ ๋ฐฉ์‹์— ์˜ํ•ด์„œ ๋ฐœ์ƒํ•˜๋Š” ์ž ์žฌ์  ์œ„ํ—˜ ์กด์žฌ. ์ฐธ๊ณ ๋งํฌ(ํ•œ๊ตญ์ •๋ณด๊ธฐ์ˆ ์ง„ํฅ์›)
    • ํ•˜์ง€๋งŒ, ์™ธ๋ถ€์—์„œ ๋…ธ์ถœ ์ž์ฒด๊ฐ€ ๋˜์ง€์•Š๋Š” ํ”„๋ผ์ด๋น— ์„œ๋ธŒ๋„ท์œผ๋กœ ์ด์ „ํ•œ๋‹ค๋ฉด, ํฌํŠธ๊ฐ€ ์—ด๋ฆฌ์ง€์•Š๋„๋ก ๋ณด์•ˆ ๋ฌธ์ œ ๊ทน๋ณต ๊ฐ€๋Šฅ
  • Docker๋Š” ๋ฌธ์„œยท๋ ˆํผ๋Ÿฐ์ŠคยทํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ์‚ฌ๋ก€ยทCI/CD ์—ฐ๋™์ด ๊ฐ€์žฅ ํ’๋ถ€ํ•ด, ์žฅ์•  ๋ฐœ์ƒ ์‹œ ํ•ด๊ฒฐ ๊ฒฝ๋กœ๊ฐ€ ๋น ๋ฅด๊ณ  ์šด์˜ ํ‘œ์ค€ํ™”๊ฐ€ ์‰ฌ์›Œ ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ ์•ˆ์ •์ ์œผ๋กœ ์šด์˜ํ•˜๊ธฐ์— ์œ ๋ฆฌํ•จ.

โ‡’ ์ธ์›์ด ์ ์€ ์†Œ๊ทœ๋ชจ ํŒ€์ด๋ผ๋Š” ์ƒํ™ฉ๊ณผ ํ”„๋ผ์ด๋น— ์„œ๋ธŒ๋„ท ๋„์ž…์„ ํ†ตํ•œ ๋ณด์•ˆ ๋ณด์™„, ํ˜ธํ™˜์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ๋„์ปค๋กœ ์ตœ์ข… ์„ ํƒํ•จ


4-2. ์ปจํ…Œ์ด๋„ˆ ์ €์žฅ์†Œ ์„ ์ •

์šฐ๋ฆฌ ์„œ๋น„์Šค์˜ ์ปจํ…Œ์ด๋„ˆ ์ €์žฅ์†Œ ์„ ์ • ๊ธฐ์ค€์€ ๋ณด์•ˆ, ์•ˆ์ •์„ฑ, ๋น„์šฉ, ํ˜ธํ™˜์„ฑ ์ž…๋‹ˆ๋‹ค.

AWS ECR (์„ ํƒ) Docker Hub ์ž์ฒด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ตฌ์ถ•
์„ค๋ช… AWS ์ „์šฉ ๊ด€๋ฆฌํ˜• ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ํผ๋ธ”๋ฆญ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ž์ฒด ๊ตฌ์ถ• ๋‚ด๋ถ€ ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ
๋ณด์•ˆ์„ฑ ๋ฐ ํŽธ์˜์„ฑ PrivateLink๋กœ ๋„คํŠธ์›Œํฌ ๊ฒฉ๋ฆฌ ๊ฐ€๋Šฅ ์ธํ„ฐ๋„ท ๊ฒฝ์œ  ์ ‘๊ทผ ๋ฆฌ์Šคํฌ ์กด์žฌ ์šด์˜/๊ด€๋ฆฌ ์ฑ…์ž„์ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ง‘์ค‘๋จ
์•ˆ์ •์„ฑ AWS ๊ด€๋ฆฌํ˜•์ด๋ผ ๊ฐ€์šฉ์„ฑ์ด ์•ˆ์ •์ ์ž„ ์™ธ๋ถ€ ์žฅ์• ยท์ •์ฑ…ยทRate limit ์˜ํ–ฅ์ด ์ „์ด๋จ ์ด์ค‘ํ™”ยท๋ฐฑ์—…์„ ์ง์ ‘ ๊ตฌ์„ฑํ•ด์•ผ ํ•จ
AWS ์„œ๋น„์Šค ํ˜ธํ™˜์„ฑ EKS/ECS ๋“ฑ๊ณผ ๊ธฐ๋ณธ ์—ฐ๋™๋จ ์™ธ๋ถ€ ์—ฐ๋™์„ ์œ„ํ•œ ์ถ”๊ฐ€ ์„ค์ • ํ•„์š” ์—ฐ๋™/๊ถŒํ•œ/์šด์˜์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ
Private ์„œ๋ธŒ๋„ท ํ˜ธํ™˜์„ฑ PrivateLink ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ
- Interface Endpoint 2๊ฐœ: $0.013 ร— 2
- S3 Gateway Endpoint 1๊ฐœ ํ•„์š”(๋ฌด๋ฃŒ)
NAT Gateway ๋“ฑ ์ธํ„ฐ๋„ท ์•„์›ƒ๋ฐ”์šด๋“œ ๊ฒฝ๋กœ ํ•„์š”
- NAT: $0.059/์‹œ๊ฐ„
- NAT: $0.059/GB(๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ)
๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ๋กœ ์šด์˜ ๊ฐ€๋Šฅ
ํ•œ ๋‹ฌ 100GB ์ €์žฅ ๋ฐ 1TB ์ „์†ก ๊ธฐ์ค€ ๋น„์šฉ ๊ณ„์‚ฐ (ํŽผ์น˜๊ธฐ)
AWS ECR (์„ ํƒ) Docker Hub ์ž์ฒด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ตฌ์ถ•
๋น„์šฉ - Public: 50GB๊นŒ์ง€ ๋ฌด๋ฃŒ ์ €์žฅ
- Private: 500MB๊นŒ์ง€ ๋ฌด๋ฃŒ ์ €์žฅ
- ์ €์žฅ: $0.10/GB-์›”
- ๋™์ผ ๋ฆฌ์ „ Data Transfer ๋ฌด๋ฃŒ
- Public: ๋ฌด์ œํ•œ
- Private: 1๊ฐœ ์ œ๊ณต
- Pull 200ํšŒ/6์‹œ๊ฐ„ ์ œํ•œ
- ์ถ”๊ฐ€ ์‚ฌ์šฉ ์‹œ PRO $7/์›”
- EC2(t3.medium) ์•ฝ $38.69
- EBS $9.12
- ๋ฐฑ์—…/๋ณต๊ตฌ/๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐํšŒ๋น„์šฉ ๋ฐœ์ƒ
๊ณ ์ • ๋น„์šฉ $18.72
(Interface Endpoint 2๊ฐœ)
$43.90
(NAT Gateway)
$0
์ €์žฅ ๋น„์šฉ (100GB) $10
($0.10/GB)
$0 $0
๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋น„ (1TB) $10
(PrivateLink $0.01/GB)
$59
(NAT $0.059/GB)
$0
ํ•ฉ๊ณ„ (์›”) $38.72 $102.90 $47.81
  • Docker Hub๋ฅผ ํ”„๋ผ์ด๋น— ์„œ๋ธŒ๋„ท์—์„œ ์“ฐ๋ ค๋ฉด NAT Gateway๋ฅผ ํ†ตํ•œ ์•„์›ƒ๋ฐ”์šด๋“œ ์ธํ„ฐ๋„ท ๊ฒฝ๋กœ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, ์™ธ๋ถ€๋ง์„ ํƒ€๋Š” ๊ฒƒ์— ๋ณด์•ˆ์ ์ธ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ.
  • PrivateLink๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ธํ„ฐ๋„ท์„ ์ ˆ๋Œ€ ํƒ€์ง€ ์•Š๊ณ  ๋‚ด๋ถ€๋ง์œผ๋กœ๋งŒ ํ†ต์‹ ๋˜๊ธฐ์—, ๋ณด์•ˆ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Œ.
  • Docker Hub ๋ฐฉ์‹๋ณด๋‹ค ์•ฝ 3๋ฐฐ ์ €๋ ดํ•จ.
  • ๋ณด์•ˆ์„ฑ(ํ์‡„๋ง), ๋น„์šฉ(NAT ๋Œ€๋น„ 60% ์ ˆ๊ฐ), ๊ด€๋ฆฌ ํŽธ์˜์„ฑ, AWSํ˜ธํ™˜์„ฑ์„ ๋ชจ๋‘ ๊ณ ๋ คํ•˜์—ฌ AWS ECR์„ ์„ ํƒํ•จ.

4-3. Dockerfile ์„ค๊ณ„

4-3-1. ์™œ ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง• ๋นŒ๋“œ๋ฅผ ์จ์•ผํ•˜๋Š”์ง€ (๋ฐฑ์—”๋“œ ์˜ˆ์‹œ)

๊ตฌ๋ถ„ ์ผ๋ฐ˜ ๋นŒ๋“œ ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง• ๋นŒ๋“œ (์„ ํƒ) ์ ˆ๊ฐ ํšจ๊ณผ
์‚ฌ์šฉํ•œ ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ JDK ๊ธฐ๋ฐ˜ JRE + alpine
ํฌํ•จ ๋‚ด์—ญ ์†Œ์Šค์ฝ”๋“œ, ๋นŒ๋“œํˆด, ์บ์‹œ, JDK ์ „์ฒด Jar + ์‹คํ–‰ ํ™˜๊ฒฝ(JRE)
์ด๋ฏธ์ง€ ํฌ๊ธฐ ์•ฝ 650 MB ์•ฝ 140 MB ์•ฝ 78.5% ๊ฐ์†Œ
์ €์žฅ ์šฉ๋Ÿ‰ (30๊ฐœ ์˜ˆ์‹œ) 19.5 GB 4.2 GB 15.3 GB ์ ˆ์•ฝ
์›” ECR ์ €์žฅ๋น„์šฉ ($0.1/GB) $1.95 $0.42 78% ์ ˆ๊ฐ
  • ์šฐ๋ฆฌ ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ์—๋Š”, private ์ปจํ…Œ์ด๋„ˆ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ด๋ฏธ์ง€๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋” ๋งŽ์€ ๋น„์šฉ์ด ์ฒญ๊ตฌ๋จ. ๊ทธ๋ ‡๊ธฐ์— ๋” ๊ฐ€๋ฒผ์šด ํฌ๊ธฐ์˜ ์ด๋ฏธ์ง€ ์ œ์ž‘์ด ํ•„์ˆ˜
    • Alpine ๊ธฐ๋ฐ˜์˜ ๊ฒฝ๋Ÿ‰ ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์ค€์œผ๋กœ ์ฑ„ํƒ
  • ๋”ฐ๋ผ์„œ ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง• ๊ธฐ๋ฐ˜์˜ ๊ฒฝ๋Ÿ‰ ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์ค€์œผ๋กœ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์ด ๋น„์šฉ๊ณผ ์šด์˜ ํšจ์œจ ์ธก๋ฉด์—์„œ ์œ ๋ฆฌํ•จ.

4-3-2. BE Dockerfile

# ====== Build Stage ======
FROM eclipse-temurin:21-jdk AS builder
# ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ /build๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
WORKDIR /build
# ํŒŒ์ผ์„ ์ด๋™์‹œํ‚ต๋‹ˆ๋‹ค.
COPY . .
# ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ Jar๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
RUN ./gradlew bootJar

# ====== Runtime Stage ======
FROM eclipse-temurin:21-jre-alpine
# ์‹คํ–‰ ํŒŒ์ผ ์ด๋™
WORKDIR /app
# ๋นŒ๋“œํ•œ jar ํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ
COPY --from=builder /build/build/libs/*.jar app.jar
# ๋…ธ์ถœํ•  ํฌํŠธ
EXPOSE 8080
# ์‹คํ–‰ํ•  ํ™˜๊ฒฝ ์„ค์ •
ENV SPRING_PROFILES_ACTIVE=prod
# ์‹คํ–‰ํ•˜๊ธฐ
CMD ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "app.jar"]
  • ์‹คํ–‰ํ™œ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ์„œ ๋งˆ์ง€๋ง‰ profile์„ ์ˆ˜์ •ํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

4-3-3. AI Dockerfile

# ====== Build Stage ======
FROM python:3.11-slim AS builder
WORKDIR /build

# ๋นŒ๋“œ์— ํ•„์š”ํ•œ ์ตœ์†Œ ํŒจํ‚ค์ง€
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential gcc \
  && rm -rf /var/lib/apt/lists/*

COPY requirements.txt .
RUN pip install --no-cache-dir --upgrade pip \
 && pip wheel --no-cache-dir --wheel-dir /wheels -r requirements.txt

# ====== Runtime Stage ======
FROM python:3.11-slim
WORKDIR /app

# ๋ณด์•ˆ: non-root ์œ ์ € ๊ถŒ์žฅ
RUN useradd -m appuser
USER appuser

COPY --from=builder /wheels /wheels
RUN pip install --no-cache-dir --no-index --find-links=/wheels /wheels/*

COPY . .

EXPOSE 8000
ENV APP_ENV=prod
CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

5. ์ปจํ…Œ์ด๋„ˆํ™” ๋ฒ”์œ„ ๋ฐ ๊ตฌ์กฐ ์„ค๊ณ„

  • ์–ด๋–ค ์„œ๋น„์Šค๊นŒ์ง€ ์ปจํ…Œ์ด๋„ˆํ™” ํ•˜์—ฌ ๋ฐฐํฌํ•  ๊ฒƒ ์ธ์ง€ ๊ฒฐ์ •
  • ๋Œ€์ƒ: ์„œ๋น„์Šค(FE, BE, AI), DB(PostgreSQL, NoSQL DB, VectorDB), MQ ๋“ฑ ์„œ๋น„์Šค ์šด์˜์„ ์œ„ํ•œ ์ „์ฒด ๋ฐฐํฌ ๋Œ€์ƒ ๊ฒ€ํ†  ํ•„์š”
  • ์ธํ”„๋ผ ๊ตฌ์กฐ, ๋„คํŠธ์›Œํฌ ์„ค๊ณ„, ์„ฑ๋Šฅ, ๋ฐฐํฌ ๋ฐฉ์‹์˜ ํ™•์žฅ์„ฑ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถ€๋ถ„์„ ๊ณ ๋ คํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆํ™” ์—ฌ๋ถ€ ์„ ํƒ

5-1. ์ปจํ…Œ์ด๋„ˆํ™” ์ œ์™ธ๋Œ€์ƒ

  1. FE (Next.js)

    • ์š”๊ตฌ์‚ฌํ•ญ
      • ์ •์  ์ฝ˜ํ…์ธ  ์œ„์ฃผ: CSR๋กœ ๊ตฌ์„ฑ, ๋žœ๋”ฉ ํŽ˜์ด์ง€๋Š” SSG. ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ Œ๋”๋ง ์ง„ํ–‰
      • ์ •์  ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ ํ™•์ •. ์„œ๋ฒ„ ํ•„์š” ์—†์Œ
    • ๋ฌธ์ œ ์ƒํ™ฉ ์˜ˆ์ธก
      • ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„: ์ •์  ํŒŒ์ผ ์„œ๋น™์„ ์œ„ํ•ด EC2, Nginx ๋“ฑ ์›น ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, ์ปจํ…Œ์ด๋„ˆํ™” ํ•˜์—ฌ ์‹คํ–‰ํ•˜๋ฉด ์ปดํ“จํŒ… ์ž์› ์ถ”๊ฐ€ ์†Œ๋ชจ ํ•„์š”
      • ๊ด€๋ฆฌ ์š”์†Œ ์ฆ๊ฐ€: ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€ ์‹œ ์ •์  ํŒŒ์ผ ์„œ๋น™์„ ์œ„ํ•œ ์„œ๋ฒ„๋„ ์Šค์ผ€์ผ๋ง ํ•„์š”
    • ๊ฒฐ๋ก : ์ปจํ…Œ์ด๋„ˆํ™”X, S3 + Cloud Front
      • ์„œ๋ฒ„๊ฐ€ ํ•„์š” ์—†๋Š” ์•„ํ‚คํ…์ฒ˜์ด๋ฏ€๋กœ S3 + CF ์ ์šฉํ•˜์—ฌ Serverless ๊ตฌ์กฐ๋กœ ์ง„ํ–‰
      • ์ปดํ“จํŒ… ์ž์› ํ•ญ์‹œ ์‹คํ–‰์ด ํ•„์š” ์—†์œผ๋ฏ€๋กœ ๋น„์šฉ ์ ˆ๊ฐ
      • CDN์„ ํ†ตํ•œ ์บ์‹ฑ๊ณผ ์„œ๋น™์œผ๋กœ ๋น ๋ฅธ ์†๋„ ๋ณด์žฅ

  2. DB

    • PostgreSQL

      • ์š”๊ตฌ์‚ฌํ•ญ
        • ์•ˆ์ •์„ฑ ๋ฐ ๋ฐ์ดํ„ฐ ์˜์†์„ฑ: ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋Š” ์ ˆ๋Œ€ ์œ ์‹ค๋˜๋ฉด ์•ˆ๋จ
        • ๊ณ ๊ฐ€์šฉ์„ฑ: ์„œ๋ฒ„ ์žฅ์•  ์‹œ์—๋„ ์ฆ‰์‹œ ๋ณต๊ตฌ ํ•„์š”, ๋กค๋ฐฑ ๋ฐฑ์—… ๊ธฐ๋Šฅ ํ•„์š”
      • ๋ฌธ์ œ ์ƒํ™ฉ ์˜ˆ์ธก
        • DB๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ๋‹ด์„ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ ๋ฌธ์ œ ๋ฐ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ ์„ค์ • ๋“ฑ ๋ฌธ์ œ๋กœ ๋ฐ์ดํ„ฐ ์œ ์‹ค ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ
        • Failover(multi-AZ, ๋กค๋ฐฑ ๋“ฑ)๊ฐ€ ์—†๋‹ค๋ฉด ๋‹จ์ผ ์žฅ์•  ์ง€์ 
      • ๊ฒฐ๋ก : RDS ์„ ํƒ
        • EC2 ์œ„์—์„œ ์ง์ ‘ ์šด์˜ํ•˜๋Š” ๊ฒฝ์šฐ RDS ๋Œ€๋น„ 15% ๊ฐ€๋Ÿ‰ ๋น„์šฉ ์ ˆ๊ฐ ๊ฐ€๋Šฅ (t3.medium, 100GB ์šฉ๋Ÿ‰ gp2, multi-AZ ๊ธฐ์ค€ / EC2: $208.69, RDS: $245.15)
        • ์•ˆ์ •์„ฑ์„ ์œ„ํ•œ ๊ธฐ๋Šฅ ์ง์ ‘ ๊ตฌํ˜„, ์ˆ˜๋™ ์šด์˜ ์œ„ํ•œ ๋ฆฌ์†Œ์Šค ์†Œ๋ชจ
        • ํ•œ์ •๋œ ์šด์˜ ์ธ๋ ฅ ๋ฐ ํ™˜๊ฒฝ์—์„œ ๋ฆฌ์†Œ์Šค ์ ˆ๊ฐ์„ ์œ„ํ•ด RDS ์„ ํƒ

    • Redis

      • ์š”๊ตฌ์‚ฌํ•ญ
        • ๋ฉ€ํ‹ฐ ์ธ์Šคํ„ด์Šค ๊ฐ„ ์ •๋ณด ๊ณต์œ (๋กœ๊ทธ์ธ ์ •๋ณด, ์ฑ„ํŒ… ๊ธฐ๋Šฅ ๋“ฑ)๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ
        • ๊ณ ๊ฐ€์šฉ์„ฑ ํ•„์š”
      • ๋ฌธ์ œ ์ƒํ™ฉ ์˜ˆ์ธก
        • ๋ณ„๋„ EC2์—์„œ ์‹คํ–‰ ํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ์„œ๋ฒ„๊ฐ€ ์ฃฝ์œผ๋ฉด ๋‹จ์ผ ์žฅ์• ์ง€์ (์ธ์ฆ ์˜ค๋ฅ˜)
        • ์žฅ์•  ๋ฐœ์ƒ์‹œ ๋กœ๊ทธ์ธ/์ธ์ฆ ์žฅ์• ๋กœ ์ธํ•œ ์‹ฌ๊ฐํ•œ UX ์ €ํ•˜ ๋ฐœ์ƒ
        • ์žฅ์•  ๋ฐœ์ƒ์‹œ ๋‹ค์ค‘ ์„œ๋ฒ„๊ฐ„ ์ฑ„ํŒ… ๋‹จ์ ˆ ๋ฐ ๋ฉ”์‹œ์ง€ ์œ ์‹ค ๊ฐ€๋Šฅ์„ฑ
        • Redis ์žฅ์•  โ†’BE ์—ฐ๊ฒฐ ์žฌ์‹œ๋„ โ†’ ์Šค๋ ˆ๋“œ ํ’€ ๊ณ ๊ฐˆ โ†’ ์‹œ์Šคํ…œ ์ „์ฒด๋กœ ์žฅ์•  ์ „ํŒŒ
        • ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•ด ๋‹ค์ค‘ ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ • ์‹œ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ, ์Šฌ๋กฏ ํ• ๋‹น ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ
        • EC2์—์„œ ์ง์ ‘ ์šด์˜ํ•˜๋Š” ๊ฒฝ์šฐ ElastiCache ๋Œ€๋น„ ์•ฝ 47% ๋น„์šฉ ์ ˆ๊ฐ ๊ฐ€๋Šฅ (t3.small, 1GB ์šฉ๋Ÿ‰ / EC2: ์•ฝ $15 , ElastiCache: ์•ฝ $28)
        • ์šด์˜์„ ์œ„ํ•œ ๋ฆฌ์†Œ์Šค ์†Œ๋ชจ ๋ฐœ์ƒ(ํด๋Ÿฌ์Šคํ„ฐ๋ง ์‹œ Failover, Master ๋ณ€๊ฒฝ์—๋”ฐ๋ฅธ ๋Œ€์‘)
      • ๊ฒฐ๋ก : ElastiCache(primary-Replica)
        • ์ฑ„ํŒ… Pub/Sub ๋ฐ ์„ธ์…˜ ์•ˆ์ •์„ฑ ๋ณด์žฅ
        • primary ์žฅ์• ์‹œ ์ž๋™์œผ๋กœ Replica๋กœ ์ „ํ™˜ํ•˜์—ฌ ์ตœ์†Œํ•œ์˜ failover
    • VectorDB

      • AI ์„œ๋น„์Šค์— ํ™œ์šฉ๋  Vector DB ๋ฏธ์ •์œผ๋กœ ์„ค๊ณ„ ๋ณด๋ฅ˜
  3. MQ (Apache Kafka): AWS MSK

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

5-2. ์ปจํ…Œ์ด๋„ˆํ™” ๋Œ€์ƒ

  1. BE ์„œ๋น„์Šค (Spring Boot)
    • ์š”๊ตฌ์‚ฌํ•ญ
      • ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‹คํ–‰. ์•ˆ์ •์„ฑ ํ•„์š”
      • ์šด์˜ ์‹œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€์™€ ์žฆ์€ ๋ฒ„๊ทธ ์ˆ˜์ •์œผ๋กœ ๋นˆ๋ฒˆํ•œ ๋ฐฐํฌ์™€ ํŠธ๋ž˜ํ”ฝ์— ๋”ฐ๋ฅธ ํ™•์žฅ ๋ฐœ์ƒ
      • ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ์ž์› ๊ฒฝํ•ฉ ์‹œ ์–ด๋ ค์šด ์ œ์–ด, ๋ณต์žกํ•œ ์„ค์ •
    • ๋ฌธ์ œ ์ƒํ™ฉ ์˜ˆ์ธก
      • ์Šค์ผ€์ผ ์•„์›ƒ ์ง€์—ฐ: ํŠธ๋ž˜ํ”ฝ ํญ์ฆ ์ƒํ™ฉ ์‹œ EC2๋ฅผ ์ƒˆ๋กœ ์‹คํ–‰ํ•˜๊ณ  ํ™˜๊ฒฝ ์„ค์ • ํ›„ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์€ ์˜ค๋žœ ์‹œ๊ฐ„ ์†Œ์š”
      • ํ™˜๊ฒฝ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ: ๊ฐœ๋ฐœ์ž ๋กœ์ปฌ์—์„œ๋Š” ์‹คํ–‰๋˜๋Š” ๋กœ์ง์ด ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ
    • ๊ฒฐ๋ก : ์ปจํ…Œ์ด๋„ˆํ™”
      • ๋ถˆ๋ณ€ ์ธํ”„๋ผ ๊ตฌ์ถ•: OS, JDK, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด๋ฏธ์ง€๋กœ ํŒจํ‚นํ•˜์—ฌ ํ™˜๊ฒฝ ์ผ๊ด€์„ฑ ํ™•๋ณด
      • ๋น ๋ฅธ ํ™•์žฅ: ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€ Pull, ์‹คํ–‰์„ ํ†ตํ•ด ๋น ๋ฅธ ํ™•์žฅ ์‹คํ–‰ ๊ฐ€๋Šฅ
  2. AI (FastAPI)
    • ์š”๊ตฌ์‚ฌํ•ญ
      • ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ ๋ณต์žก
      • ๋ถ„์„ ์š”์ฒญ์— ๋”ฐ๋ฅธ CPU, ๋ฉ”๋ชจ๋ฆฌ ๋ถ€ํ•˜ ๊ธ‰์ฆ
    • ๋ฌธ์ œ ์ƒํ™ฉ ์˜ˆ์ธก
      • ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€๋กœ ์ธํ•œ AI ๋ถ„์„ ์š”์ฒญ ์ฆ๊ฐ€
      • AI ์„œ๋ฒ„์˜ ์ž์› ์ฆ๊ฐ€๋กœ ์ธํ•œ ๋™์ผ ์ธ์Šคํ„ด์Šค ๋‚ด BE๊นŒ์ง€ ๊ฐ™์ด ๋А๋ ค์ง€๋Š” ์ž์› ๊ฐ„์„ญ ๋ฌธ์ œ ๋ฐœ์ƒ ์˜ˆ์ƒ
      • ์„œ๋ฒ„ OS ๋ ˆ๋ฒจ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „ ์ฐจ์ด๋กœ ์ธํ•œ ์‹คํ–‰ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ
    • ๊ฒฐ๋ก : ์ปจํ…Œ์ด๋„ˆํ™”
      • AI ์„œ๋ฒ„๋ฅผ ๋ณ„๋„์˜ ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ฒฉ๋ฆฌํ•˜์—ฌ ์ž์›์„ ์ œํ•œ, ํƒ€ ์„œ๋น„์Šค์˜ ์•ˆ์ •์  ์‹คํ–‰ ๋ณด์žฅ
      • ํ™•์žฅ์„ฑ ๋ฐ ์ด์‹์„ฑ ํ™•๋ณด: ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€ ๋“ฑ ํ•„์š”์‹œ ์ปจํ…Œ์ด๋„ˆ๋งŒ ๊ณ ์‚ฌ์–‘ ๋…ธ๋“œ๋กœ ์˜ฎ๊ธฐ๊ฑฐ๋‚˜ ํ™•์žฅ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆํ™” ํ•„์ˆ˜, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋น„์šฉ ์ ˆ์•ฝ

5-3. ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€ ๊ตฌ์กฐ

5-3-1 ์ธ์Šคํ„ด์Šค ์ŠคํŽ™

๊ตฌ๋ถ„ ์ธ์Šคํ„ด์Šค ํƒ€์ž… vCPU / RAM ์ˆ˜๋Ÿ‰ (Prod) ์—ญํ•  ๋ฐ ํŠน์ง•
API Node c5.large 2 vCPU / 4 GB 2~4๋Œ€ (ASG) - Spring Boot ๊ธฐ๋ฐ˜ ๋ฉ”์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ
- REST API ์„œ๋น™ ๋ฐ ๋ฐ์ดํ„ฐ CRUD ์ „๋‹ด
Chat Node t3.medium 2 vCPU / 4 GB 2๋Œ€ ์ด์ƒ (ASG) WebSocket ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์ „์šฉ ์„œ๋ฒ„
- ๋‹ค๋Ÿ‰์˜ ๋™์‹œ ์—ฐ๊ฒฐ ์œ ์ง€ ๋ฐ ๋ฉ”์‹œ์ง€ ์ค‘๊ณ„ ์ฒ˜๋ฆฌ
AI Inference g4dn.2xlarge 8 vCPU / 32 GB (16GB GPU) 1~2๋Œ€ (ASG) - vLLM ๊ธฐ๋ฐ˜ LLM ์ถ”๋ก  ์ „์šฉ (FastAPI ์›Œ์ปค ํฌํ•จ)
- ๋ชจ๋ธ ๋กœ๋”ฉ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์ตœ์†Œํ™”๋ฅผ ์œ„ํ•œ Warm Pool ์ ์šฉ

1. API์™€ Chat์˜ ๋ถ„๋ฆฌ

  • ์ฑ„ํŒ… ์„œ๋ฒ„๋ฅผ ๋…๋ฆฝ์ ์ธ ASG๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฉ”์ธ API์˜ ๋ฐฐํฌ๋‚˜ ๋ถ€ํ•˜๊ฐ€ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์—ฐ๊ฒฐ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ๊ฒฉ๋ฆฌํ•˜์˜€๊ธฐ์— ์ธ์Šคํ„ด์Šค์˜ ์ŠคํŽ™์„ ๋‚ฎ์ถฐ์„œ ์ง„ํ–‰.
  • ์ฑ„ํŒ… ์„œ๋ฒ„๋Š” ์œ ์ €๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์•ˆ ๋ณด๋‚ผ ๋•Œ๋Š” CPU๋ฅผ ๊ฑฐ์˜ ์“ฐ์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋งŒ ์ ์œ ํ•˜๊ธฐ์—, ๋น„์‹ผ CPU ์„ฑ๋Šฅ ๋Œ€์‹  4๊ธฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ํ™•๋ณดํ•˜๋Š” t3 ์‚ฌ์šฉํ•จ.

2. ์ฑ„ํŒ… ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค ํƒ€์ž… (t3 vs c5)

  • ์ฑ„ํŒ… ์„œ๋ฒ„๋Š” ์—ฐ์‚ฐ ๋ถ€ํ•˜๋ณด๋‹ค ๋Œ€๋Ÿ‰์˜ ์œ ํœด ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋ฏ€๋กœ, ๋น„์šฉ ํšจ์œจ์ ์ธ t3.medium์„ ์šฐ์„  ์ฑ„ํƒํ•จ. ๋‹จ, ๋™์‹œ ์ ‘์†์ž ์ˆ˜๊ฐ€ ๊ธ‰์ฆํ•  ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์–‘์— ๋”ฐ๋ผ t3.large๋กœ ์Šค์ผ€์ผ ์—… ๊ฒ€ํ† .
    • ์ฑ„ํŒ… ์›น์†Œ์ผ“์˜ ๋ถ€ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฟ ์•„๋‹ˆ๋ผ, ํ•ด๋‹น ๋‚ด์šฉ์„ ์ „์ฒด์—๊ฒŒ ๋ณต์‚ฌํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” CPU๋„ ์กด์žฌ.
  • [์ฐธ๊ณ  ๋งํฌ]

3. AI ๋…ธ๋“œ์˜ ASG ๋ฐ Warm Pool (์•„์ง ๋ฏธ์ •)

  • LLM ๋ชจ๋ธ์€ ์ธ์Šคํ„ด์Šค ๋ถ€ํŒ… ํ›„ ๋ชจ๋ธ ๋กœ๋”ฉ์—๋งŒ ์ˆ˜ ๋ถ„์ด ์†Œ์š”
  • ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฏธ๋ฆฌ ๋ชจ๋ธ์ด ๋กœ๋“œ๋œ ์ •์ง€ ์ƒํƒœ(Stopped)๋กœ ์œ ์ง€ํ–ˆ๋‹ค๊ฐ€, ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€ ์‹œ ์ฆ‰์‹œ ์‹คํ–‰ ์ƒํƒœ(Running)๋กœ ์ „ํ™˜ํ•˜์—ฌ ํ™•์žฅ ์ง€์—ฐ ์‹œ๊ฐ„(Scale-out Latency)์„ 80% ์ด์ƒ ๋‹จ์ถ•

6. ์ „์ฒด ์•„ํ‚คํ…์ณ ์„ค๊ณ„

6-1. VPC ์„ค๊ณ„ ๋ฐ 3-tier ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ

6-1-1. VPC๋ฅผ ํ™˜๊ฒฝ๋ณ„๋กœ ๋ถ„๋ฆฌํ•œ ์ด์œ 

์šด์˜ ํ™˜๊ฒฝ์€ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๊ณ  ์žฅ์•  ์˜ํ–ฅ ๋ฒ”์œ„๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ/์Šคํ…Œ์ด์ง•๊ณผ ๋„คํŠธ์›Œํฌ ๊ฒฝ๊ณ„๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์•ˆ์ •์„ฑ๊ณผ ๋ณด์•ˆ์„ ๋™์‹œ์— ํ™•๋ณดํ•จ.


1. ๋‹จ์ผ VPC ์‚ฌ์šฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

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

6-1-2. NAT Gateway / NAT Instance์˜ ์‚ฌ์šฉ

image
  • PRODํ™˜๊ฒฝ์—์„œ๋Š” ์™ธ๋ถ€ API(OAuth, Gemini, OpenAPI, Google Calendar) ํ˜ธ์ถœ์ด ๋งŽ์€ ์„œ๋น„์Šค ํŠน์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก, ์•ˆ์ „ํ•˜๊ฒŒ NAT Gateway๋ฅผ Prod VPC์— ์„ค์ •ํ•จ.
  • ํ”„๋ผ์ด๋น— ์„œ๋ธŒ๋„ท์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์™ธ๋ถ€๋กœ ๋‚˜๊ฐˆ ๋•Œ๋งŒ NAT๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜์—ฌ ํ”„๋ผ์ด๋น— ์„œ๋ธŒ๋„ท์˜ ๋…ธ์ถœ์„ ์ฐจ๋‹จํ•จ.
  • NON-PROD๋Š” ํŠธ๋ž˜ํ”ฝ์ด ์ผ์ •ํ•˜์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ ์ง์ „์—๋งŒ ์ฃผ๋กœ ์“ฐ์ž„. NAT Gateway์˜ ๋†’์€ ๊ณ ์ •๋น„๋ฅผ ์ง€๋ถˆํ•˜๋Š” ๋Œ€์‹ , EC2(t3.micro ๋“ฑ)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์œ ๋™์ ์œผ๋กœ NAT ์„ฑ๋Šฅ์„ ์กฐ์ ˆํ•จ.
  1. PrivateLink์™€ Nat Gateway๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 
  • ์ธ๋ฐ”์šด๋“œ๋Š” ALB๋กœ ๋‹จ์ผํ™”ํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ณ , ์•„์›ƒ๋ฐ”์šด๋“œ๋Š” ๋ชฉ์ ์ง€์— ๋”ฐ๋ผ ๋‚ด๋ถ€๋ง(PrivateLink)๊ณผ ์™ธ๋ถ€๋ง(NAT Gateway)์œผ๋กœ ๋ถ„๋ฆฌํ•ด ํšจ์œจ์„ฑ๊ณผ ์•ˆ์ „์„ฑ์„ ๋™์‹œ์— ํ™•๋ณดํ•จ.

  1. ๋ชจ๋“  ํ™˜๊ฒฝ VPC์— PrivateLink๋ฅผ ๊ตฌ์„ฑํ•œ ์ด์œ 
  • PrivateLink๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠธ๋ž˜ํ”ฝ์ด VPC ๋‚ด๋ถ€์—์„œ AWS ๋ฐฑ๋ณธ ๋„คํŠธ์›Œํฌ๋กœ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์–ด, ์ธํ„ฐ๋„ท ๋…ธ์ถœ์ด ์ค„์–ด๋“ค๊ณ  ๊ฒฝ๋กœ๊ฐ€ ๋‹จ์ˆœํ•ด์ ธ ์žฅ์•  ์›์ธ๊ณผ ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ํ†ต์ œํ•˜๊ธฐ ์‰ฌ์›€
  • ๋˜ํ•œ, ๋ชจ๋“  VPC์— ๋™์ผํ•˜๊ฒŒ ์ ์šฉํ•˜๋ฉด ํ™˜๊ฒฝ๋ณ„ ๋ณด์•ˆ ์ˆ˜์ค€๊ณผ ๋ฐฐํฌ ์•ˆ์ •์„ฑ์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Œ

6-1-3. AWS 3-tier ์•„ํ‚คํ…์ณ ๊ตฌํ˜„

  • ํ”„๋ผ์ด๋น— ์„œ๋ธŒ๋„ท์—๋Š” ๋ฐฑ์—”๋“œ ๋ฐ ๋ฐ์ดํ„ฐ ๊ณ„์ธต์„ ๋ฐฐ์น˜ํ•˜์—ฌ ์™ธ๋ถ€ ์ง์ ‘ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•จ.
  • ๋ณด์•ˆ ๊ทธ๋ฃน์€ ์ปจํ…Œ์ด๋„ˆ ๋ฐ ์ธ์Šคํ„ด์Šค ๊ฐ„ ํ•„์š”ํ•œ ํฌํŠธ๋งŒ ์ตœ์†Œ ๋ฒ”์œ„๋กœ ํ—ˆ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ๊ณ„์ธต ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•จ.

6-1-4. ๋ฉ€ํ‹ฐ AZ

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

6-1-4. ํ”„๋ผ์ด๋น— ์„œ๋ธŒ๋„ท ์ธ๋ฐ”์šด๋“œ ์ ‘๊ทผ ๋ฐฉ์‹

์„ ํƒ ๊ธฐ์ค€์€ ๋ณด์•ˆ, ๋น„์šฉ, ๊ฐœ๋ฐœ์˜ ํŽธ์˜์„ ๋ฐ”ํƒ•์œผ๋กœ ๋น„๊ตํ•จ.

๋น„๊ต ํ•ญ๋ชฉ Client VPN AWS Systems Manager (SSM) ๋ฐ”์Šคํ‹ฐ์˜จ ์„œ๋ฒ„ (Bastion Host)
์ ‘์† ๋ฐฉ์‹ ์ „์šฉ ํ„ฐ๋„๋ง์„ ํ†ตํ•œ ๋„คํŠธ์›Œํฌ ํ•ฉ๋ฅ˜ ์—์ด์ „ํŠธ ๊ธฐ๋ฐ˜์˜ ๋ธŒ๋ผ์šฐ์ €/CLI ์ ‘์† ํผ๋ธ”๋ฆญ ์„œ๋ธŒ๋„ท์˜ ์ค‘๊ณ„ ์„œ๋ฒ„๋ฅผ ๊ฒฝ์œ ํ•œ SSH ์ ‘์†
๋น„์šฉ ์‹œ๊ฐ„๋‹น ์ ‘์† ๊ณผ๊ธˆ (์›” $72) ๋ฌด๋ฃŒ ์ธ์Šคํ„ด์Šค ์œ ์ง€๋น„ (t3.micro ๊ธฐ์ค€ ์›” $10 ๋‚ด์™ธ)
๋ณด์•ˆ ์ธ์ฆ์„œ ๋ฐ ํ‚ค ๊ด€๋ฆฌ ํ•„์š” IAM ์ •์ฑ…์œผ๋กœ ์„ธ๋ฐ€ํ•œ ์ ‘๊ทผ ์ œ์–ด SSH ํ‚ค ๊ด€๋ฆฌ ๋ฐ 22๋ฒˆ ํฌํŠธ ๋…ธ์ถœ ๋ฆฌ์Šคํฌ ์กด์žฌ
ํŽธ์˜์„ฑ ๋กœ์ปฌ DB ํˆด ์ง์ ‘ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ ํ„ฐ๋ฏธ๋„ ์œ„์ฃผ SSH ํ„ฐ๋„๋ง ์„ค์ • ํ›„ ๋กœ์ปฌ ํˆด ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ
๊ด€๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ ๋†’์Œ (์ธ์ฆ์„œ ๊ฐฑ์‹  ๋“ฑ) ๋‚ฎ์Œ (๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค) ์ค‘๊ฐ„ (OS ๋ณด์•ˆ ํŒจ์น˜ ๋ฐ ์‚ฌ์šฉ์ž ํ‚ค ๊ด€๋ฆฌ)

SSM์€ ์ธ๋ฐ”์šด๋“œ ํฌํŠธ ๋…ธ์ถœ ์—†์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ  IAM์œผ๋กœ ์ ‘๊ทผ ํ†ต์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ํ”„๋ผ์ด๋น— ์„œ๋ธŒ๋„ท ๋ณด์•ˆ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Œ. ๋”ฐ๋ผ์„œ SSM ๊ธฐ๋ฐ˜ ์ ‘๊ทผ์„ ์ฑ„ํƒํ•จ.


6-2. ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๋„คํŠธ์›Œํฌ ์ „๋žต

  • ๋‹จ์ผ ๋…ธ๋“œ ๋‚ด์˜ ํ†ต์‹ ์€ Docker Bridge Network๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์„ ๋‹จ์ˆœํ™”ํ•จ.
  • ์™ธ๋ถ€ ํ†ต์‹ ์€ NAT Gateway๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•˜๋ฉฐ, OAuth ๋“ฑ ์™ธ๋ถ€ ์˜์กด ํ˜ธ์ถœ์˜ ์•ˆ์ •์„ฑ๊ณผ ์šด์˜ ์ผ๊ด€์„ฑ์„ ํ™•๋ณดํ•จ.

6-3. ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๋ณผ๋ฅจ ์ „๋žต

  • ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ๋Š” ํ˜ธ์ŠคํŠธ์— ์˜๊ตฌ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  stdout/stderr ๊ธฐ๋ฐ˜์œผ๋กœ ์ถœ๋ ฅํ•˜๋ฉฐ, ๊ฐ ์ธ์Šคํ„ด์Šค์— promtail์„ ๋ฐฐ์น˜ํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ์ค‘์•™ ๋กœ๊ทธ ์Šคํ† ์–ด(Loki)๋กœ ์ˆ˜์ง‘ํ•จ.
  • ์šฐ๋ฆฌ ์„œ๋น„์Šค๋Š” ์ˆ˜ํ‰ ํ™•์žฅ์ด ์ค‘์š”ํ•˜๊ธฐ์— ์‚ฌ๋ผ์งˆ ์ˆ˜๋„ ์žˆ์ง€๋งŒ,, ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ต์ฒด๋˜๋”๋ผ๋„ ๋กœ๊ทธ๊ฐ€ ์ค‘์•™์— ๋‚จ์•„ ์žฅ์•  ๋ถ„์„๊ณผ ์ถ”์ ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„ํ•จ.

7. ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ๋ฐฐํฌ ์ „๋žต

  • ๊ธฐ์กด ์„œ๋น„์Šค ๊ธฐ๋ฐ˜์˜ Artifact ๋ฐฐํฌ ๋ฐฉ์‹ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ์ปจํ…Œ์ด๋„ˆ ๋ฐฉ์‹ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋ณ€๊ฒฝ ์„ค๊ณ„

7-1. ์š”๊ตฌ์‚ฌํ•ญ

  • ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ: ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๋Š” ๋„์ค‘ ์ค‘๋‹จ์ด ๋ฐœ์ƒํ•˜๋ฉด ์‘๋‹ต ๋ฐ ์ฑ„ํŒ…์˜ ์œ ์‹ค๋“ฑ์œผ๋กœ UX๊ฐ€ ์ €ํ•˜๋  ์šฐ๋ ค ์žˆ์Œ.
  • ํ™˜๊ฒฝ ์ผ์น˜: ๊ฐœ๋ฐœ, ์Šคํ…Œ์ด์ง•, ์šด์˜ ํ™˜๊ฒฝ๊ฐ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์„ ์ผ์น˜์‹œ์ผœ์•ผ ํ•จ.
  • ๋น ๋ฅธ ๋กค๋ฐฑ: ๋ฐฐํฌ ํ›„ ์‹คํ–‰ ์‹คํŒจ ๋ฐ ์น˜๋ช…์  ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ, ์„œ๋น„์Šค ๋ณต๊ตฌ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜์—ฌ ์„œ๋น„์Šค์˜ Down time์„ ์ตœ์†Œํ™” ํ•„์š”ํ•จ. Down Time์ด ๊ธธ์–ด์งˆ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์˜ ์ €ํ•˜, ์„œ๋น„์Šค ์‹ ๋ขฐ๋„ ํ•˜๋ฝ์œผ๋กœ ์ธํ•œ ์‚ฌ์šฉ์ž ์ดํƒˆ์šฐ๋ ค ์žˆ์Œ.
  • ๋ฆฌ์†Œ์Šค ํšจ์œจ์  ์‚ฌ์šฉ: ๋ฐฐํฌ ๊ณผ์ •์—์„œ ์šด์˜ ์„œ๋ฒ„์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋ชจํ•˜์ง€ ์•Š์•„์•ผ ํ•จ.

7-2. ๋ฐฐํฌ ๋ฐฉ์‹

  • ๋ฐฉ์‹: B/G ๋ฐฐํฌ ๋ฐฉ์‹ ์œ ์ง€
  • ์„ ์ • ๊ทผ๊ฑฐ
    • ์™„์ „ํ•œ ๋ฆฌ์†Œ์Šค ๊ฒฉ๋ฆฌ๋กœ ์ธํ•œ ์„œ๋น„์Šค ๋ณดํ˜ธ ๊ฐ€๋Šฅ
    • ASG์™€ ์—ฐ๋™ํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ ํญ์ฆ์— ๋Œ€๋น„ํ•œ ์Šค์ผ€์ผ๋ง ๊ณผ์ • ์‰ฌ์›€
    • AWS๊ฐ€ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋กค๋ฐฑ ๋กœ์ง์œผ๋กœ, ์˜ˆ์™ธ ์ƒํ™ฉ์— ๋Œ€ํ•œ ๋Œ€๋น„ ๊ฐ€๋Šฅ
  • ๊ตฌํ˜„ ๋ฐฉ์‹
    • Docker-compose ํŒŒ์ผ์„ ํ™œ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค ๋‹จ์œ„๋กœ ์ƒ์„ฑ ํ›„ ํŠธ๋ž˜ํ”ฝ ์ „ํ™˜ ๊ฐ€๋Šฅ

7-3. ์„œ๋ฒ„ ๋ณ„ ๋ฐฐํฌ ์ „๋žต (๊ฐœ๋ฐœ/์Šคํ…Œ์ด์ง•/์šด์˜)

ํ™˜๊ฒฝ ์ „๋žต ์„ค๋ช…
๊ฐœ๋ฐœ ์„œ๋ฒ„ ์žฌ์‹œ์ž‘(Recreate) - ๊ธฐ์กด ์ปจํ…Œ์ด๋„ˆ ์ค‘๋‹จ ํ›„ ์ƒˆ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
- ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋ธŒ๋กœ ์•ฝ๊ฐ„์˜ ๋‹ค์šดํƒ€์ž„ ํ—ˆ์šฉ
- ๋น ๋ฅธ ๋ฐฐํฌ์†๋„๋ฅผ ํ™•๋ณดํ•ด ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ
์Šคํ…Œ์ด์ง• ์„œ๋ฒ„ Rolling Update - ์šด์˜ ํ™˜๊ฒฝ๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌํ•˜์—ฌ, ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ ๋ฐ ์ธํ”„๋ผ ์„ค์ • ๊ฒ€์ฆ
์šด์˜ ์„œ๋ฒ„ Rolling Update - ์„œ๋น„์Šค ์ค‘๋‹จ ์—†์ด ์ธ์Šคํ„ด์Šค ๋‹จ์œ„๋กœ ์ˆœ์ฐจ์  ์—…๋ฐ์ดํŠธ ์ง„ํ–‰
- ALB Health Check ๊ฐ€ ํ†ต๊ณผ๋œ ํ›„ ํŠธ๋ž˜ํ”ฝ ์œ ์ž… ์ „ํ™˜

7-4. ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๊ด€๋ฆฌ

7-4-1. ์ด๋ฆ„ ๊ด€๋ฆฌ

  • ์ด๋ฏธ์ง€ ์ด๋ฆ„์€ [์ €์žฅ์†Œ ์ฃผ์†Œ]/[ํ”„๋กœ์ ํŠธ]/[์ด๋ฏธ์ง€๋ช…]:[ํƒœ๊ทธ] ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด๋ฉฐ, ์†Œ๋ฌธ์ž ๋ฐ ํ•˜์ดํ”ˆ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•จ.
  • ๊ทœ์น™: [AWS_Account_ID].dkr.ecr.[Region].amazonaws.com/[Service_Name]/[App_Name]:[Tag]

7-4-2. ๋ฒ„์ €๋‹

  • latest ํƒœ๊ทธ๋Š” ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๋ณ‘ํ–‰ ์‚ฌ์šฉํ•˜๋˜, ์šด์˜ ๋ฐฐํฌ๋Š” ๋ฐ˜๋“œ์‹œ ์ปค๋ฐ‹ SHA ๋“ฑ ๋ถˆ๋ณ€ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฌํ˜„์„ฑ๊ณผ ๋กค๋ฐฑ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•จ.

7-5. CI/CD ํŒŒ์ดํ”„๋ผ์ธ

7-5-1. ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ ๋ณ€ํ™”

  • Devths๋Š” ํ˜„์žฌ CI๋Š” GitHub Actions, CD๋Š” AWS CodeDeploy๋กœ ์šด์˜ํ•จ.
  • ๋”ฐ๋ผ์„œ, Docker ๋„์ž…์€ CodeDeploy๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ, CodeDeploy๊ฐ€ ๋‹ค๋ฃจ๋Š” ๋ฐฐํฌ ๋‹จ์œ„๋ฅผ ํŒŒ์ผ/ํ”„๋กœ์„ธ์Šค์—์„œ ๋ถˆ๋ณ€ ์ด๋ฏธ์ง€๋กœ ์ „ํ™˜ํ•˜์—ฌ ๋ฐฐํฌ์˜ ์žฌํ˜„์„ฑ๊ณผ ๋ณต๊ตฌ ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์„ค๊ณ„ํ•จ.

7-5-2. ํŒŒ์ดํ”„๋ผ์ธ ๋‹จ๊ณ„ ์ƒ์„ธ

  1. ๋นŒ๋“œ (GitHub Actions)
    • GitHub์—์„œ Code Checkout
    • Multi-stage Build: ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋Ÿ‰ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
    • ์ด๋ฏธ์ง€ ํƒœ๊ทธ ์ƒ์„ฑ ๋ฐ ECR๋กœ Push
  2. ๋ฐฐํฌ ํŠธ๋ฆฌ๊ฑฐ
    • appspec.yml๊ณผ ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ๋งŒ S3์— ์—…๋กœ๋“œ(deploy.sh, docker-compose.yml )
    • AWS CodeDeploy์— ๋ฐฐํฌ ๋ช…๋ น ์ „๋‹ฌ
  3. ๋ฐฐํฌ(EC2 ๋‚ด๋ถ€)
    • ECR์—์„œ ์ด๋ฏธ์ง€ Pull
      • docker pull [์ด๋ฏธ์ง€์ฃผ์†Œ]:[ํƒœ๊ทธ] ์‹คํ–‰
    • ์ปจํ…Œ์ด๋„ˆ ๊ต์ฒด ๋ฐ ์‹คํ–‰
      • docker-compose up -d
    • ๋ถˆํ•„์š”ํ•œ ๊ตฌ ๋ฒ„์ „ ์ด๋ฏธ์ง€ ์‚ญ์ œ
      • docker image prune

7-5-3. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฃผ์ž… ์ „๋žต

  • .env ํŒŒ์ผ์„ ํ˜ธ์ŠคํŠธ ๋””์Šคํฌ์— ์ƒ์„ฑํ•˜์—ฌ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์€ ๊ธฐ๋ก์„ ๋‚จ๊ฒจ ์ถ”ํ›„ ๋ณด์•ˆ ์‚ฌ๊ณ  ์‹œ ํƒˆ์ทจ ์œ„ํ—˜์ด ์žˆ์Œ
  • ํ˜ธ์ŠคํŠธ์—์„œ ๋„์ปค ์‹คํ–‰ ์‹œ์ ์— ์ฃผ์ž… ํ•˜๋Š” ๊ฒฝ์šฐ ์—ญ์‹œ ์‰˜ ํžˆ์Šคํ† ๋ฆฌ๋กœ ๋‚จ์„ ์ˆ˜ ์žˆ์Œ
  • ps ๋ช…๋ น์–ด(ํ”„๋กœ์„ธ์Šค ๋ฆฌ์ŠคํŠธ)๋ฅผ ํ†ตํ•ด ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์žˆ์Œ
  • ๋ณด์•ˆ์ƒ ์ทจ์•ฝ์ ์„ ๋งŒ๋“ค์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ์„ค๊ณ„์™€ ๋™์ผํ•˜๊ฒŒ ์•ฑ ์‹คํ–‰์„ ์œ„ํ•œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ œ์™ธ, AWS SDK๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ด
  • ์•ฑ ์‹คํ–‰์„ ์œ„ํ•œ ํ•„์ˆ˜ ์ •๋ณด ์ผ๋ถ€๋Š” deploy.sh ๋ฅผ ํ†ตํ•ด ์ฃผ์ž…ํ•˜์—ฌ ์‰˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๊ณ  ์ฃผ์ž… (SPRING_PROFILES_ACTIVE , AWS_REGION , SERVER_PORT ๋“ฑ )

7-6. ๋กค๋ฐฑ ๊ณ„ํš

  • ์ฆ‰์‹œ ๋กค๋ฐฑ: CodeDeploy์˜ โ€˜๋ฐฐํฌ ์‹คํŒจ ์‹œ ๋กค๋ฐฑโ€™ ์˜ต์…˜ ํ™œ์„ฑํ™”
  • ์ˆ˜๋™ ๋กค๋ฐฑ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
    • ๋ฐฐํฌ ์„ฑ๊ณต ์‹œ์ ์˜ ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋ฅผ ํ™•์ธ
    • CodeDeploy์—์„œ ํ•ด๋‹น ๋ฒ„์ „ ์žฌ๋ฐฐํฌ ํŠธ๋ฆฌ๊ฑฐ(์ด๋ฏธ์ง€๊ฐ€ ์บ์‹œ ๋˜์–ด์žˆ์–ด ๋น ๋ฅธ ๋ณต๊ตฌ ๊ฐ€๋Šฅ)
    • ์ด๋ฏธ์ง€ Pull ํ›„ ์ฆ‰์‹œ ๋ณต๊ตฌ ๊ฐ€๋Šฅ

8. ์šด์˜ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ์ „๋žต

์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์˜ ๋™์  ํŠน์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„, ์žฅ์•  ๊ฐ์ง€๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ ๊ตฌ์ถ• ํ•„์š”


8-1. ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์„ค์ •

8-1-1. ๋ฆฌ์†Œ์Šค ์ œํ•œ

  • AI ์„œ๋น„์Šค(FastAPI)

    • cpus: "1:0" : CPU 1์ฝ”์–ด ์ด์ƒ ์ ์œ  ๊ธˆ์ง€ํ•˜์—ฌ ํƒ€ ์„œ๋น„์Šค์˜ ๋ฆฌ์†Œ์Šค ๊ณ ๊ฐˆ ๋ฐฉ์ง€

    • mem_limit: "2g" : ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์‹œ์˜ OOM ์œ ๋„ํ•˜์—ฌ ์ „์ฒด ์‹œ์Šคํ…œ ๋‹ค์šด ๋ฐฉ์ง€

    • GPU ์‚ฌ์šฉ ์‹œ docker-compose.yml ํŒŒ์ผ ๋‚ด๋ถ€์— ์ž์›์„ ๋ช…์‹œํ•˜์—ฌ ์—ฐ๊ฒฐ

      services:
        ai-service:
          image: devths/ai-service:v1
          deploy:
            resources:
              reservations:
                devices:
                  - driver: nvidia
                    count: 1 
                    capabilities: [gpu]
  • BE ์„œ๋น„์Šค(Spring Boot)

    • mem_limit: "1g" : JVM Heap Size ๊ณ ๋ คํ•˜์—ฌ ์„ค์ • ํ•„์š”
  • gpu ์„ค์ •


8-1-2. ์žฌ์‹œ์ž‘ ์ •์ฑ…

  • ์ผ์‹œ์  ์˜ค๋ฅ˜, OOM Kill๋กœ ์ธํ•œ ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ ๋ฐœ์ƒ์‹œ, ๋น ๋ฅธ ์žฌ์‹œ์ž‘์œผ๋กœ ๋ณต๊ตฌํ•˜์—ฌ ๊ฐ€์šฉ์„ฑ ์œ ์ง€ ํ•„์š”
  • restart: always ์˜ต์…˜ ์„ค์ • ํ•„์š”

8-1-3. ๊ธฐ์กด ์ด๋ฏธ์ง€ ์ •๋ฆฌ ์ •์ฑ…

  • ๋งค ๋ฐฐํฌ ์‹œ์ ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋ฅผ Pull ํ•ด์˜ค๋ฉด ์ด๋ฏธ์ง€ ๋ˆ„์ ์œผ๋กœ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ฒŒ ๋จ
  • ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ ๋งˆ์ง€๋ง‰์— ๋ˆ„์  ์ด๋ฏธ์ง€ pruning ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ Disk Full ์žฅ์•  ๋ฐฉ์ง€
  • docker system prune -a -f --volumes

8-1-4. ํ—ฌ์Šค์ฒดํฌ

  • ์ปจํ…Œ์ด๋„ˆ ๋ณต๊ตฌ, ๋ฐฐํฌ ํ›„ ํŠธ๋ž˜ํ”ฝ ์ „๋‹ฌ์„ ์œ„ํ•ด ๊ฐ๊ฐ ๋‹ค๋ฅธ ํ—ฌ์Šค ์ฒดํฌ ๋ฐฉ์‹์„ ์‚ฌ์šฉ
๊ตฌ๋ถ„ Internal Health Check (Docker) ALB Health Check (External)
์ฃผ์ฒด Docker Daemon (์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€) AWS ALB (์™ธ๋ถ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ)
์งˆ๋ฌธ ๊ฐœ๋ณ„ ์ปจํ…Œ์ด๋„ˆ์˜ ์ •์ƒ ์‹คํ–‰ ์—ฌ๋ถ€ ํŠธ๋ž˜ํ”ฝ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅ
์‹คํŒจ ์‹œ ํ–‰๋™ Autoheal์ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•จ.
(์ž์ฒด ๋ณต๊ตฌ)
ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋กœ ํŠธ๋ž˜ํ”ฝ ์ „์†ก ์ค‘๋‹จ.
(์‚ฌ์šฉ์ž ๋ณดํ˜ธ)
ํ•„์š”์„ฑ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋“ฑ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ "์ข€๋น„"๊ฐ€ ๋˜์—ˆ์„ ๋•Œ, ์žฌ๋ถ€ํŒ… ์„œ๋ฒ„๊ฐ€ ์ฃฝ์—ˆ์„ ๋•Œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์—๋Ÿฌ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ํŠธ๋ž˜ํ”ฝ ์ „ํ™˜

8-2. ๋กœ๊ทธ ๊ด€๋ฆฌ

์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋Š” ํ•จ๊ป˜ ์‚ฌ๋ผ์ง€๊ฒŒ ๋จ.

๋กœ๊ทธ์˜ ๋ถ„์„๋ฐ ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ๋กœ๊ทธ ์˜์†ํ™” ์ „๋žต์ด ํ•„์š”


8-2-1. ์ €์žฅ ๋ฐฉ์‹: Bind Mount ๋ฐฉ์‹ ์‚ฌ์šฉ

  • PLG ์Šคํƒ์„ ํ†ตํ•ด ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜์ง€๋งŒ, Loki ์„œ๋ฒ„ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ (๋กœ๊ทธ ์ „์†ก ๋Œ€๊ธฐ, ๋กœ๊ทธ ์œ ์‹ค)
  • ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋กœ๊ทธ ํ™•์ธ ๋ถˆ๊ฐ€ํ•˜๋ฉด ๋””๋ฒ„๊น… ๋ฐ ์žฅ์•  ๋Œ€์‘ ๋ถˆ๊ฐ€
  • ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ /logs ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ˜ธ์ŠคํŠธ ์ธ์Šคํ„ด์Šค์˜ /var/log/apps/{BE/AI} ์— ๋งˆ์šดํŠธํ•˜์—ฌ ์ €์žฅ
  • ์ดํ›„ ๋กœ๊ทธ ์ˆ˜์ง‘๊ธฐ(Promtail)์ด ํŒŒ์ผ์„ ์ฝ์–ด Loki๋กœ ์ „์†ก

8-2-2. ๋กœ๊ทธ ๋กœํ…Œ์ด์…˜

  • ํ˜ธ์ŠคํŠธ ์ธ์Šคํ„ด์Šค EC2์˜ logrotate ์œ ํ‹ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ณ„ ์••์ถ• ๋ฐ 14์ผ ๊ฒฝ๊ณผ ์‹œ ์‚ญ์ œ.

  • ๋กœ๊ทธ ๋กœํ…Œ์ดํŠธ ์„ค์ • ์Šคํฌ๋ฆฝํŠธ /ect/logrotate.d/devth-apps

    #๊ฒฝ๋กœ๋‚ด ๋ชจ๋“  ๋กœ๊ทธ ํŒŒ์ผ ๋Œ€์ƒ
    /home/ubuntu/logs/**/*.log {
        daily             # ๋งค์ผ ์‹คํ–‰
        rotate 14         # 14์ผ์น˜ ๋ณด๊ด€
        missingok         # ํŒŒ์ผ ์—†์–ด๋„ ์—๋Ÿฌ ๋ฌด์‹œ
        notifempty        # ๋นˆ ํŒŒ์ผ์€ ๋กœํ…Œ์ด์…˜ ์•ˆ ํ•จ
        compress          # ์••์ถ• (gzip)
        delaycompress     # ์••์ถ•์„ ํ•˜๋ฃจ ๋ฏธ๋ฃธ (ํ˜„์žฌ ์“ฐ๊ณ  ์žˆ๋Š” ํŒŒ์ผ ๋ณดํ˜ธ)
        copytruncate      # ํŒŒ์ผ์„ ๋ณต์‚ฌ ํ›„ ์›๋ณธ์„ ๋น„์›€ (์•ฑ ์žฌ์‹œ์ž‘ ์—†์ด ๋กœ๊ทธ ๋ถ„๋ฆฌ)
        create 0644 ubuntu ubuntu
    }

8-3. ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๊ฐ€์‹œ์„ฑ

8-3-1. ์š”๊ตฌ์‚ฌํ•ญ

  • ์ œํ•œ ๋œ ์ธํ”„๋ผ ๋ฆฌ์†Œ์Šค ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๊ฐ€ ์ž์› ๊ฐ„์„ญ์„ ์ผ์œผํ‚ค์ง€ ์•Š๊ณ , ์ •์ƒ์ ์œผ๋กœ ์‘๋‹ตํ•˜์—ฌ UX๋ฅผ ๋ณด์žฅํ•ด์•ผํ•จ.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•„์š”(API ์‘๋‹ต, ์—๋Ÿฌ์œจ, ์‘๋‹ต ์‹œ๊ฐ„ ๋“ฑ)
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ฐ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์— ๋Œ€ํ•œ ๋ชจ๋‹ˆํ„ฐ ( ์š”์ฒญ ๋Œ€๋น„ ์„ฑ๊ณต๋ฅ , ์ถ”ํ›„ MQ ๋„์ž… ์‹œ ์Œ“์ธ ๋ฉ”์‹œ์ง€ ์ˆ˜, DLQ ์ˆ˜)
  • ์šด์˜ ํšจ์œจ์„ฑ ๋ฐ ๋น„์šฉ (๋กœ๊ทธ ๊ด€๋ฆฌ ์ค‘์•™ํ™”, ๋น„์šฉ ๋ชจ๋‹ˆํ„ฐ๋ง)

8-3-2. ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ์ˆ  ์Šคํƒ

  • PLG(Prometheus + Loki + Grafana)
  • ELK ๋Œ€๋น„ ์ ์€ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ์œ„ํ•œ ๋ฆฌ์†Œ์Šค ์ตœ์†Œํ™”

8-3-3. ์ฃผ์š” ์ง€ํ‘œ

  1. ์ธํ”„๋ผ: EC2 ์ธ์Šคํ„ด์Šค ๋ณ„ CPU, Memory, Disk I/O ์‚ฌ์šฉ๋Ÿ‰ , Network ์†ก์ˆ˜์‹ ๋“ฑ ๋ฉ”ํŠธ๋ฆญ
  2. ์ปจํ…Œ์ด๋„ˆ
    • ์ปจํ…Œ์ด๋„ˆ๋ณ„ CPU/๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์‹œ๊ฐํ™”
    • ์ง€ํ‘œ: AI CPU%, AI RSS, BE P95 latency, WS ๋™์‹œ ์—ฐ๊ฒฐ ์ˆ˜, OOM Kill ํšŸ์ˆ˜, ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘ ํšŸ์ˆ˜
  3. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
    • ์ง€ํ‘œ: API ์‘๋‹ต ์†๋„, HTTP P95 Latency , Error Rate(5xx) ํšŸ์ˆ˜ ๋ฐ ๋น„์œจ , DB ์—ฐ๊ฒฐ ์ˆ˜

8-3-4. ์•Œ๋ฆผ

  • ์ž„๊ณ„์น˜ ์ดˆ๊ณผ ์‹œ Discord Webhook์œผ๋กœ ์ฆ‰์‹œ ํ†ต๋ณด(์šด์˜์ž๊ฐ€ โ€œ์ง€๊ธˆ ๋ญ๊ฐ€ ๋ฌธ์ œ์ธ์ง€โ€ ๋ฐ”๋กœ ํŒ๋‹จ)
  • ์žฅ์•  ๋ฐœ์ƒ ํ›„์—๋งŒ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์žฅ์•  ์ง•ํ›„ ๋ฐœ๊ฒฌ ์‹œ ๋ฏธ๋ฆฌ ์•Œ๋ฆผ
  • ๋‹ค์–‘ํ•œ ์ง€ํ‘œ ์•Œ๋ฆผ์„ ํ†ตํ•ด ์˜ค๋ฅ˜ ๋Œ€๋น„ ๋ฐ Failover๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
  • ๋ฉ”๋ชจ๋ฆฌ 80%๋„๋‹ฌ์‹œ ๊ฒฝ๊ณ , 90% ๋„๋‹ฌ์‹œ Critical ์•Œ๋ฆผ

8-3-5. ์•Œ๋ฆผ ์ง€ํ‘œ ์ƒ์„ธ

  • ๊ฐ€์šฉ์„ฑ
    • ์žฌ์‹œ์ž‘ ํšŸ์ˆ˜: 1์‹œ๊ฐ„ ๋‚ด ์žฌ์‹œ์ž‘ 3ํšŒ ์ด์ƒ์‹œ ์•Œ๋ฆผ
    • HealthCheck: unhealthy ์ƒํƒœ ์ง€์† 1๋ถ„ ์ด์ƒ ์‹œ ์•Œ๋ฆผ
  • ์„ฑ๋Šฅ
    • API ์‘๋‹ต ์†๋„: 2์ดˆ ์ด์ƒ ์‹œ ์•Œ๋ฆผ(์‹œ์Šคํ…œ ๊ณผ๋ถ€ํ•˜ ๊ฒฝ๊ณ )
    • CPU ์‚ฌ์šฉ๋ฅ  80% ์ด์ƒ 5๋ถ„ ์ด์ƒ ์ง€์† (์Šค์ผ€์ผ ์•„์›ƒ ๋Œ€๋น„)
  • ์—๋Ÿฌ
    • HTTP 5xx: 1๋ถ„๊ฐ„ ์—๋Ÿฌ์œจ 1% ์ด์ƒ ์‹œ ์•Œ๋ฆผ (์„œ๋น„์Šค ์žฅ์• , ์™ธ๋ถ€ API ์žฅ์• , DB ์žฅ์•  ๊ฐ€๋Šฅ์„ฑ)
    • ํŠน์ • Log KeyWord: ์ฆ‰์‹œ ๋Œ€์‘ ํ•„์š”ํ•œ ๋กœ๊ทธ ์•Œ๋ฆผ ํ‚ค์›Œ๋“œ ์„ค์ • (OutOfMemory , Deadlock ๋“ฑ)

8-4. ๋ณด์•ˆ ๋ฐ ๋ฐฑ์—…

8-4-1. ๋ณด์•ˆ

์ปจํ…Œ์ด๋„ˆํ™” ๊ณ„์ธต์ด ์ถ”๊ฐ€๋œ ๋งŒํผ, ์ถ”๊ฐ€์ ์ธ ๋ณด์•ˆ ์‚ฌ๊ณ  ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ๋ฐฉ์•ˆ ํ•„์š”

  • Non-root User๋กœ ์‹คํ–‰: ์ž˜๋ชป๋œ ๋ณด์•ˆ ์„ค์ •์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ํƒˆ์ถœ์„ ํ†ตํ•ด ํ˜ธ์ŠคํŠธ ์ธ์Šคํ„ด์Šค์˜ ๋ฃจํŠธ ๊ถŒํ•œ ํš๋“์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•จ
  • ์ด๋ฏธ์ง€ ์Šค์บ”: ECR์˜ Basic Scanning ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™” ํ•˜์—ฌ ์ด๋ฏธ์ง€ Push ์‹œ์ ์— OS ํŒจํ‚ค์ง€ ์ทจ์•ฝ์  ์ ๊ฒ€

8-4-2. ๋ฐฑ์—…

๊ฐ์ข… ์ปจํ…Œ์ด๋„ˆ, ์„œ๋น„์Šค, DB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฑ์—…ํ•˜์—ฌ ์•ˆ์ •์„ฑ ํ™•๋ณด

๋Œ€์ƒ ๋ฐฑ์—… ๋ฐฉ์‹ ๋ฐฑ์—… ์ฃผ๊ธฐ / ๋ณด๊ด€ ๊ธฐ๊ฐ„ ๋ณต๊ตฌ ์‹œ๋‚˜๋ฆฌ์˜ค (RTO)
DB (RDS) AWS Automated Backup (Snapshot) ๋งค์ผ 1ํšŒ / 7์ผ ๋ณด๊ด€ + PITR(5๋ถ„ ์ „ ์‹œ์  ๋ณต๊ตฌ ๊ฐ€๋Šฅ) DB ์ธ์Šคํ„ด์Šค ์‚ญ์ œ ์‹œ ์Šค๋ƒ…์ƒท์œผ๋กœ ์ƒˆ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ (30๋ถ„ ์†Œ์š”)
VectorDB(๋ฏธ์ •) EBS Snapshot (DLM) ๋งค์ผ 1ํšŒ / 7์ผ ๋ณด๊ด€ (ํ˜ธ์ŠคํŠธ ๋ณผ๋ฅจ ์ „์ฒด ๋ฐฑ์—…) EC2 ์žฅ์•  ์‹œ ์Šค๋ƒ…์ƒท์œผ๋กœ ๋ณผ๋ฅจ ๋ณต์› ํ›„ ์ปจํ…Œ์ด๋„ˆ ์žฌ๋งˆ์šดํŠธ
Redis (ElastiCache) ์ž๋™ ๋ฐฑ์—… ๋” (ํ•„์š” ์‹œ ์ˆ˜๋™) ๋ฐฑ์—… ์•ˆ ํ•จ (์„ธ์…˜/์บ์‹œ๋Š” ํœ˜๋ฐœ๋˜์–ด๋„ ์„œ๋น„์Šค ์žฌ๋กœ๊ทธ์ธ์œผ๋กœ ๋ณต๊ตฌ ๊ฐ€๋Šฅ) ์ƒˆ ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑ (๋ฐ์ดํ„ฐ๋Š” ๋‚ ์•„๊ฐ, ์„œ๋น„์Šค๋Š” ์œ ์ง€)
Images ECR Immutability ์žฅ๊ธฐ ๋ณด๊ด€ (Lifecycle๋กœ 90์ผ ์ง€๋‚œ ์ด๋ฏธ์ง€๋งŒ ์‚ญ์ œ) ECR์—์„œ ์ด์ „ ํƒœ๊ทธ ์ด๋ฏธ์ง€ Pull

9. ๊ฒฐ๋ก 

ํ”„๋กœ์„ธ์Šค ๊ธฐ๋ฐ˜ Docker ๊ธฐ๋ฐ˜
์•ˆ์ •์„ฑ AI/์ฑ„ํŒ… ๋ถ€ํ•˜๊ฐ€ ๊ฐ™์€ ์ž์›์„ ๊ณต์œ ํ•ด ์žฅ์•  ์ „์ด ์‰ฌ์›€. ์žฌ๊ธฐ๋™/๋ณต๊ตฌ๋„ ์‚ฌ๋žŒ ์†์ด ๋งŽ์ด ํƒ ์ปจํ…Œ์ด๋„ˆ๋ณ„ CPUยท๋ฉ”๋ชจ๋ฆฌ ์ƒํ•œ์œผ๋กœ ์ „์ด ์ฐจ๋‹จ, ํ—ฌ์Šค์ฒดํฌ/์žฌ์‹œ์ž‘ ์ž๋™ํ™”๋กœ MTTRโ†“
๋ณด์•ˆ ์„œ๋ฒ„์— ํŒจํ‚ค์ง€/ํˆด์ด ๋ˆ„์ ๋˜์–ด ๊ณต๊ฒฉ๋ฉด ์ฆ๊ฐ€. ์ˆ˜๋™ SSH ์šด์˜์ด ์žฆ์•„์งˆ์ˆ˜๋ก ๋ฆฌ์Šคํฌโ†‘ ์ตœ์†Œ ์ด๋ฏธ์ง€+๋ถˆ๋ณ€ ์‚ฐ์ถœ๋ฌผ๋กœ ๊ณต๊ฒฉ๋ฉดโ†“. ๋‚ด๋ถ€๋ง ํ†ต์‹ /SSM/๊ถŒํ•œ ์ตœ์†Œํ™”๋กœ ์šด์˜ ๋ณด์•ˆโ†‘
์šด์˜ ํšจ์œจ ๋ฐฐํฌ๊ฐ€ ๋А๋ฆฌ๊ณ  ํŽธ์ฐจ๊ฐ€ ์ปค ๊ธด๊ธ‰ ๋Œ€์‘์— ์ทจ์•ฝ ๋™์ผ ์ด๋ฏธ์ง€ ์žฌ๋ฐฐํฌ/๋กค๋ฐฑ์ด ๋‹จ์ˆœํ•ด ๋ฐฐํฌ ์†๋„ยท์‹ ๋ขฐ๋„ ๋™์‹œ ๊ฐœ์„ 
  • ๊ฒฐ๋ก ์ ์œผ๋กœ Docker๋Š” Devths์—์„œ ๋‹จ์ˆœ ํŽธ์˜๊ฐ€ ์•„๋‹ˆ๋ผ, ํŠธ๋ž˜ํ”ฝ ๊ธ‰์ฆ ์‹œ์—๋„ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์•ˆ์ •์ ์œผ๋กœ ์ œ๊ณตํ•˜๊ณ  ์šด์˜ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์‹คํ–‰ ๋‹จ์œ„ ํ‘œ์ค€ํ™” ์ „๋žต์œผ๋กœ ์ •์˜ํ•จ.
โš ๏ธ **GitHub.com Fallback** โš ๏ธ