Docker - 100-hours-a-week/9-team-Devths-WIKI GitHub Wiki
๋ชฉ์ฐจ (ํผ์น๊ธฐ/์ ๊ธฐ)
- 0. Docker ์ปจํ ์ด๋ํ ๋ฐฐํฌ ์ค๊ณ
- 1. ํ์ฌ Devths ์๋น์ค์ ๋ฐฐ๊ฒฝ ๋ฐ ๋ฌธ์ ์ ์
- 2. Docker ๋์ ํต์ฌ ๋ ผ๋ฆฌ
- 3. Docker ๊ธฐ๋ฐ ์ํคํ ์ฒ ๊ตฌ์ฑ๋
- 4. ์ปจํ ์ด๋ ๊ตฌ์กฐ ์ค๊ณ
- 5. ์ปจํ ์ด๋ํ ๋ฒ์ ๋ฐ ๊ตฌ์กฐ ์ค๊ณ
- 6. ์ ์ฒด ์ํคํ ์ณ ์ค๊ณ
- 7. ์ปจํ ์ด๋ ๊ธฐ๋ฐ ๋ฐฐํฌ ์ ๋ต
- 8. ์ด์ ๋ฐ ๋ชจ๋ํฐ๋ง ์ ๋ต
- 9. ๊ฒฐ๋ก
๐ก ์ปจํ ์ด๋๋? ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ๋ณ ํ๊ฒฝ์ ์๊ด์์ด ์ด๋์๋ ๋๊ฐ์ด ์คํํ ์ ์๋๋ก ํจํค์งํ๋ ๋๊ตฌ์ ๋๋ค.
Devths๋ AI ์๋ฆผ ๋ฐ ์ทจ์
์ง์ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ด๋ ฅ์์ ํฌํธํด๋ฆฌ์ค ๊ฐ์ ์ฌ์ฉ์์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃธ. ๋ฐ๋ผ์ ์ธํ๋ผ ์ค๊ณ ์ ์์ ์ฑ(๋ฐฐํฌยท๋ณต๊ตฌยทํ์ฅ)๊ณผ ๋ณด์์ ์ต์ฐ์ ๊ฐ์น๋ก ์ค์ ํ์ฌ ๊ตฌ์ถํจ.
์๋น์ค ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ทจ์ ์ค๋น ์ํ๋ฅผ ์ ๋ ํ์ธยท์์ ํ๊ธฐ ์ด๋ ต๊ณ , ์ด๋ ฅ์ยทํฌํธํด๋ฆฌ์ค์๋ ๊ฐ์ธ์ ๋ณด๋ฟ ์๋๋ผ ๋์ธ๋น ์์ค์ ๋ด์ฉ์ด ํฌํจ๋ ์ ์์ด ๋ฌด๋จ ์ ๊ทผ๊ณผ ์ ์ถ์ ๋ฐฉ์งํ๋ ๋ณด์์ด ํ์์.
ํ์ฌ ์๋น์ค์ ์ฑ์ฅ์ธ๊ฐ ๊ฐํ๋ฅด์ง๋ง, ์ฅ์ ๊ฐ ๋ฐ๋ณต๋๋ฉด ์ฌ์ฉ์๋ ์๋น์ค ์ ๋ขฐ๋ฅผ ์๊ณ ๋น ๋ฅด๊ฒ ์ดํํ ์ ์์.
- ๋จ์ผ ์ธ์คํด์ค ๋ฐ ๋ค์ค ์ธ์ด ์คํ(Sprint Boot + Python AI + Next.js)์ผ๋ก ๊ตฌ์ฑ๋จ.
- AI ๋ถ์ ๊ธฐ๋ฅ์ CPU/RAM์ ์ง์ค์ ์ผ๋ก ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค ๋ ์ ์ํ์ด ์กด์ฌํจ.
- ์ธ๋ถ API(OAuth, LLM) ์์กด๋๊ฐ ๋์ ์ธ๋ถ ์ง์ฐ์ด ์์คํ ์ ์ฒด๋ก ์ ์ด๋ ์ ์์.
- ์ฑํ ๊ธฐ๋ฅ์ WebSocket ๊ธฐ๋ฐ ์ฅ๊ธฐ ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ฉฐ, ์ฐ๊ฒฐ ์ ์ฆ๊ฐ์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ/๋คํธ์ํฌ/CPU ์ฆ๊ฐ๋์ด ์ ํ์ ์ผ๋ก ์ฆ๊ฐํจ.
ํ์ฌ ์๋น์ค๋ MAU๊ฐ 30๋ง์ผ๋ก ์ด์ฉ์ ์๊ฐ ๊ธ๊ฒฉํ๊ฒ ์ฆ๊ฐ ์ค์ด๊ธฐ์, ์๋น์ค ํ์ฅ์ด ํ์ํ ์ํฉ
-
๋ฌธ์ 1 (์ฑํ ํธ๋ํฝ์ ํ์ฅ ์๊ตฌ)
WebSocket ๊ธฐ๋ฐ ์ฑํ ์ ์ฐ๊ฒฐ์ด ์ค๋ ์ ์ง๋๋ ํน์ฑ์ ์ฌ์ฉ์๊ฐ ๋์ด๋ ์๋ก ๋์ ์ฐ๊ฒฐ๋งํผ ๋ฉ๋ชจ๋ฆฌ ์ ์ ๊ฐ ๋์ ๋จ.
๋จ์ผ ์๋ฒ/๋จ์ผ ํ๋ก์ธ์ค ๊ตฌ์กฐ์์๋ ๋์์ ์ ์์ฒญ ์ฆ๊ฐ ์ ๋ฉ๋ชจ๋ฆฌ ํ๊ณ๋ก ์ฑ๋ฅ ์ ํ๋ ์ฐ๊ฒฐ ๋๊น์ด ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ฑํ ํ์ง ์ ํ๋ก ์ง๊ฒฐ๋จ.
๋ฐ๋ผ์ ์ฑํ ์ ์ฌ์ฉ๋ ์ฆ๊ฐ์ ๋ง์ถฐ ์ํ ํ์ฅ(Scale-out)์ ์ ์ ๋ก ์ค๊ณํ ํ์๊ฐ ์์.
-
๋ฌธ์ 2 (๋จ์ผ ์๋ฒ ๊ตฌ์กฐ์์์ ์ฐ์ ์ฅ์ ์ํ)
AI ๋ถ์ ์์ฒญ์ CPU/RAM์ ์ง์ค์ ์ผ๋ก ์ฌ์ฉํ๋ฏ๋ก ํธ๋ํฝ์ด ๋ชฐ๋ฆฌ๋ฉด ๋์ผ ์๋ฒ์์ ๋์ํ๋ ๋ค๋ฅธ ๊ธฐ๋ฅ(์ด๋ ฅ์ ์กฐํ/์ ์ฅ ๋ฑ)๊น์ง ์๋ต ์ง์ฐยทํ์์์์ด ๋ฐ์ํ ์ ์์.
ํน์ ๊ธฐ๋ฅ์ ๋ถํ๊ฐ ์ ์ฒด ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฌด๋๋จ๋ฆฌ๋ ์ฐ์ ์ฅ์ ๋ก ํ์ฅ๋ ์ํ์ด ์กด์ฌํจ.
-
๋ฌธ์ 3(๋ฐฐํฌ ์์ธก ๋ถ๊ฐ)
ํ์ฌ GitHub Actions(CI) + AWS CodeDeploy(CD)๋ก ์๋ํ๋ ๊ฐ์ถฐ์ ธ ์์.
๋ค๋ง ๋ฐฐํฌ ๊ฒฐ๊ณผ๋ฌผ์ด ์๋ฒ ํ๊ฒฝ(JDK/OS ๋ผ์ด๋ธ๋ฌ๋ฆฌ/์ค์ )์ ์ํฅ์ ๋ฐ๋ ๊ตฌ์กฐ์ด๊ธฐ์, ๋์ผ ๋ฆฌ๋น์ ์ด๋ผ๋ ์๋ฒ ์ํ์ ๋ฐ๋ผ ๋ฐฐํฌ๋ ์ฑ๊ณตํ์ง๋ง ์คํ์ด ์คํจํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์.
๋จ์ ์ธ์คํด์ค ํ์ฅ์ด ์๋, ์ ์ปจํ ์ด๋์ฌ์ผ ํ๋๊ฐ?
| ์ธ์คํด์ค(ํ๋ก์ธ์ค ๋ฐฐํฌ) | ๊ฐ์ํ(VM) | ์ปจํ ์ด๋(Docker) | |
|---|---|---|---|
| ํน์ง | ํธ์คํธ OS์ ์ง์ ์ค์น/์คํ, ํ๊ฒฝ์ด ๋์ ๋จ(๋๋ฆฌํํธ) | ๊ฒ์คํธ OS ํฌํจ, ๊ฒฉ๋ฆฌ ๊ฐํ์ง๋ง ๋ฌด๊ฑฐ์ | ํ๋ก์ธ์ค+์์กด์ฑ๋ง ํจํค์ง, ๋์ผ ์ด๋ฏธ์ง๋ก ์ด๋์๋ ๋์ผ ์คํ |
| ์์ ์ฑ | ํ ํ๋ก์ธ์ค ์ฅ์ /๋ฆฌ์์ค ํญ์ฃผ๊ฐ ์ ์ฒด์ ์ ์ด๋๊ธฐ ์ฌ์ | ์ด์/๋ฐฐํฌ๊ฐ ๋๋ฆผ | cgroup/namespace๋ก ์๋น์ค๋ณ ๊ฒฉ๋ฆฌ, ํฌ์ค์ฒดํฌยท์ฌ๊ธฐ๋ ์๋ํ ์ฉ์ด |
| ๋ณด์ | ์๋ฒ์ ํจํค์ง/๋๊ตฌ๊ฐ ๊ณ์ ์์ฌ ๊ณต๊ฒฉ๋ฉด ์ฆ๊ฐ | OS ๋จ์ ๊ฒฉ๋ฆฌ๋ก ๊ฐํจ | ์ปค๋ ๊ณต์ ๋ผ VM๋งํผ ๊ฐํ ๊ฒฝ๊ณ๋ ์๋๋, ์ด๋ฏธ์ง ์ต์ํ/๊ถํ ์ถ์/๋คํธ์ํฌ ๋ถ๋ฆฌ๋ก ์ค๋ฌด ๋ณด์ ์์ค ๋ฌ์ฑ ๊ฐ๋ฅ |
| Devths ๊ฒฐ๋ก | AI ํญ์ฃผ/์ฑํ ๋์์ ์์์ ๊ฐ์ฅ ์ทจ์ฝ | ์์ ์ฑ์ ์ข์ง๋ง ์๊ท๋ชจ ํ์ ์ด์ ๋ถ๋ด ํผ | ๊ฐ์ฅ ์์ ๋น์ฉ์ผ๋ก โ์์ ๊ฒฉ๋ฆฌ+๋น ๋ฅธ ๋ฐฐํฌ+์ผ๊ด์ฑโ์ ๋์์ ๋ฌ์ฑ |
- Devths ์ธํ๋ผ ํ์ฅ ์ ์ ์กฐ๊ฑด์
์์ ์ฑ๊ณผ ๋ณด์์. ์ปจํ ์ด๋ ๋์ ์ 1-3์์ ์ ์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ
Devths๊ฐ ๊ฐ๋ฐ ๋จ๊ณ์์๋ ๋จ์ผ ์ธ์คํด์ค๋ก ๊ตฌ์ฑํ๊ธฐ์ ๊ธฐ๋ฅ๋ณ ์์์ ๋ถ๋ฆฌ๊ฐ ํ์ํจ.
- ๊ธฐ๋ฅ๋ณ ๊ฒฉ๋ฆฌ ๋ฐ ์์ ๊ฐ์ญ ์ต์ํ๊ฐ ํ์ํจ
Devths๋ AI(VLLM) ๊ณ ๋ถํ์ ์ฑํ (WebSocket) ์ฅ๊ธฐ ์ฐ๊ฒฐ์ด ๊ณต์กดํ๋ฏ๋ก, ํ ๊ธฐ๋ฅ์ ํญ์ฃผ๊ฐ ๋ค๋ฅธ ๊ธฐ๋ฅ(BE API ๋ฑ)์ผ๋ก ์ ์ด๋์ง ์๋๋ก ์คํ ๋จ์๋ฅผ ๋ถ๋ฆฌํ๊ณ ์์ ์ฌ์ฉ์ ์ ์ดํด์ผ ํจ. ์๋น์ค๋ณ ์ปจํ ์ด๋๋ก ์คํ/์ฌ๊ธฐ๋ ๋จ์๋ฅผ ๋ถ๋ฆฌํ๊ณ , ํ์ ์ CPUยท๋ฉ๋ชจ๋ฆฌ ์ํ์ ์ค์ ํด ์ฅ์ ์ ํ์ ์ฑ๋ฅ ์ ํ๋ฅผ ์ํํจ. ํ๋ก์ธ์ค์๋ cgroup ๊ธฐ๋ฐ ์์ ์ ํ์ ๊ฐ๋ฅํ์ง๋ง, Docker๋ ํ๋ก์ธ์คยทํ์ผ์์คํ ยท๋คํธ์ํฌ๊น์ง ์๋น์ค ๋จ์๋ก ๋ฌถ์ด ๊ฒฉ๋ฆฌํ๋ฏ๋ก ์ด์ ๋ณต์ก๋์ ์ฅ์ ์ ํ๋ฅผ ํจ๊ป ๋ฎ์ถ ์ ์์.
- ์ฅ์ ๋ณต๊ตฌ๋ฅผ ์๋น์ค ๋จ์๋ก ๋จ์ํํด์ผ ํจ
๋จ์ผ ๋ ธ๋์์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ์ ์ฒด ์ฌ์์์ด ์๋๋ผ, ์ํฅ ๋ฐ์ ์ปจํ ์ด๋๋ง ์ฌ๊ธฐ๋/๊ต์ฒดํ๋ ๋ฐฉ์์ด ์ด์์ ์ผ๋ก ์์ ํจ
Devths๋ MAU๊ฐ ํญ๋ฐ์ ์ผ๋ก ์ฆ๊ฐํ ๊ฒฝ์ฐ ๋จ์ผ ์ธ์คํด์ค๋ง์ผ๋ก๋ ์ฑํ (WebSocket) ๋์ ์ฐ๊ฒฐ๊ณผ AI(VLLM) ์์ฒญ๋์ ๊ฐ๋นํ๊ธฐ ์ด๋ ค์, ๋ฉํฐ ์ธ์คํด์ค(์ํ ํ์ฅ) ์ ํ์ ๊ณ ๋ คํด์ผ ํจ.
- Scale-out์ โ๋์ผํ ์คํ ๋จ์ ๋ณต์ โ๊ฐ ์ ์ ์
์ธ์คํด์ค๊ฐ ๋์ด๋ ์๋ก ์๋์ผ๋ก ๋ฐํ์์ ์ค์นํ๊ณ ์ค์ ํ๋ ๋ฐฉ์์ ์๋ฒ๋ณ ํธ์ฐจ๋ฅผ ๋ฐ์์ํค๋ฉฐ, ์ฅ์ ์์ธ์ ๋ถ์ฐ์ํด. Docker ์ด๋ฏธ์ง๋ ๋ชจ๋ ์๋ฒ์ ๋์ผํ ์คํ ๋จ์๋ฅผ ์ ๊ณตํ์ฌ, ์๋ฒ ์๊ฐ ๋์ด๋๋๋ผ๋ ์ ์ฒด ์์คํ ์ ๊ฒฐ๊ณผ๊ฐ ๊ท ์ผํ๊ฒ ์ ์ง๋๋๋ก ๋ณด์ฅํจ.
- ASG(Auto Scaling Group)์์๋ ๋ถํ
์ดํ ์ ์ฐจ๊ฐ ์งง์์ผ ํจ
์ ์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋๋ง๋ค ๋งค๋ฒ ์ค์น์ ๊ตฌ์ฑ ์์ ์ด ๊ธธ์ด์ง๋ฉด ํ์ฅ(Scaling) ์๋๊ฐ ์ ํ๋๊ณ ์คํจ ์ง์ ์ด ๋์ด๋จ. ์ปจํ ์ด๋ ๊ธฐ๋ฐ์ ์ด๋ฏธ์ง ๋ฐฉ์์ ์ฑํํ๋ฉด ๋ณต์กํ ์ด๊ธฐํ ๊ณผ์ ์ด ์๋ต๋์ด ์ธ์คํด์ค ํ์ฅ ํ๋ฆ์ด ๋จ์ํด์ง๊ณ ๋นจ๋ผ์ง.
- ๋ณด์ ๋ฐ ์์ ์ฑ์ ์ํ ์ด์ ํ์ค์ ์ผ๊ด๋๊ฒ ์ ์ฉํจ
Devths๋ ๋ฏผ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ์๋น์ค์ด๋ฏ๋ก ์คํ ๊ถํ ์ต์ํ, ์ด๋ฏธ์ง ๊ฒฝ๋ํ, ๋คํธ์ํฌ ๋ถ๋ฆฌ์ ๊ฐ์ ์ด์ ์์น์ ๋ชจ๋ ํ๊ฒฝ์ ๋์ผํ๊ฒ ์ ์ฉํด์ผ ํจ. Docker๋ ์ด๋ฌํ ์์น์ ์ด๋ฏธ์ง ์์ฒด์ ์คํ ์ค์ ์ผ๋ก ํ์คํํจ. ์ด๋ฅผ ํตํด ๋จ์ผ ์ธ์คํด์ค๋ถํฐ ๋ฉํฐ ์ธ์คํด์ค ํ๊ฒฝ๊น์ง ๋์ผํ ์์ค์ ๋ณด์ ๋ฐ ์์ ์ฑ ๊ธฐ์ค์ ์ ์งํ ์ ์์.
- ์ด์ ์ ๊ทผ์ SSM์ ๊ธฐ๋ณธ์ผ๋ก ํ์ฌ ์ธ๋ฐ์ด๋ ํฌํธ ๋ ธ์ถ์ ์ต์ํํจ.
- ๋ฐฑ์๋ ๋ฐ ๋ฐ์ดํฐ ๊ณ์ธต์ ํ๋ผ์ด๋น ์๋ธ๋ท์ ๋ฐฐ์นํ์ฌ ์ธ๋ถ ์ง์ ์ ๊ทผ์ ์ฐจ๋จํจ.
- ํ๊ฒฝ๋ณ๋ก VPC๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ด์ ๋ฐ์ดํฐ ๋ณดํธ ๋ฐ ์ฌ๊ณ ์ ํ ๋ฒ์๋ฅผ ์ ํํจ.
์ปจํ ์ด๋ ๋ฐํ์ ๋ฐ ์คํ ํ๊ฒฝ ํ๋ณด๋ฅผ daemon/daemon-less, ์ ํ๋ฆฌ์ผ์ด์ /์์คํ ์ปจํ ์ด๋ ๊ด์ ์์ ๋น๊ตํจ. ๊ธฐ์ ์ ํ ๊ธฐ์ค์
๋ณด์, ์์ ์ฑ, ๋น์ฉ, ํธํ์ฑ
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 ์ฐ๋์ด ๊ฐ์ฅ ํ๋ถํด, ์ฅ์ ๋ฐ์ ์ ํด๊ฒฐ ๊ฒฝ๋ก๊ฐ ๋น ๋ฅด๊ณ ์ด์ ํ์คํ๊ฐ ์ฌ์ ์๊ท๋ชจ ํ์์ ์์ ์ ์ผ๋ก ์ด์ํ๊ธฐ์ ์ ๋ฆฌํจ.
โ ์ธ์์ด ์ ์ ์๊ท๋ชจ ํ์ด๋ผ๋ ์ํฉ๊ณผ ํ๋ผ์ด๋น ์๋ธ๋ท ๋์ ์ ํตํ ๋ณด์ ๋ณด์, ํธํ์ฑ์ ๊ณ ๋ คํ์ฌ ๋์ปค๋ก ์ต์ข ์ ํํจ
์ฐ๋ฆฌ ์๋น์ค์ ์ปจํ ์ด๋ ์ ์ฅ์ ์ ์ ๊ธฐ์ค์
๋ณด์, ์์ ์ฑ, ๋น์ฉ, ํธํ์ฑ์ ๋๋ค.
| 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 |
- ์ฐธ๊ณ : VPC PrivateLink / NAT Gateway / ECR VPC Endpoint ๊ณต์๋ฌธ์
- Docker Hub๋ฅผ ํ๋ผ์ด๋น ์๋ธ๋ท์์ ์ฐ๋ ค๋ฉด NAT Gateway๋ฅผ ํตํ ์์๋ฐ์ด๋ ์ธํฐ๋ท ๊ฒฝ๋ก๊ฐ ํ์ํ์ง๋ง, ์ธ๋ถ๋ง์ ํ๋ ๊ฒ์ ๋ณด์์ ์ธ ์ด์๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ ์กด์ฌ.
- PrivateLink๋ฅผ ํตํด ๋ฐ์ดํฐ๊ฐ ์ธํฐ๋ท์ ์ ๋ ํ์ง ์๊ณ ๋ด๋ถ๋ง์ผ๋ก๋ง ํต์ ๋๊ธฐ์, ๋ณด์์ฑ์ ๋์ผ ์ ์์.
- Docker Hub ๋ฐฉ์๋ณด๋ค ์ฝ 3๋ฐฐ ์ ๋ ดํจ.
- ๋ณด์์ฑ(ํ์๋ง), ๋น์ฉ(NAT ๋๋น 60% ์ ๊ฐ), ๊ด๋ฆฌ ํธ์์ฑ, AWSํธํ์ฑ์ ๋ชจ๋ ๊ณ ๋ คํ์ฌ AWS ECR์ ์ ํํจ.
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"]
- ์ด๋ค ์๋น์ค๊น์ง ์ปจํ ์ด๋ํ ํ์ฌ ๋ฐฐํฌํ ๊ฒ ์ธ์ง ๊ฒฐ์
- ๋์: ์๋น์ค(FE, BE, AI), DB(PostgreSQL, NoSQL DB, VectorDB), MQ ๋ฑ ์๋น์ค ์ด์์ ์ํ ์ ์ฒด ๋ฐฐํฌ ๋์ ๊ฒํ ํ์
- ์ธํ๋ผ ๊ตฌ์กฐ, ๋คํธ์ํฌ ์ค๊ณ, ์ฑ๋ฅ, ๋ฐฐํฌ ๋ฐฉ์์ ํ์ฅ์ฑ ๋ฑ ๋ค์ํ ๋ถ๋ถ์ ๊ณ ๋ คํ์ฌ ์ปจํ ์ด๋ํ ์ฌ๋ถ ์ ํ
-
FE (Next.js)
- ์๊ตฌ์ฌํญ
- ์ ์ ์ฝํ ์ธ ์์ฃผ: CSR๋ก ๊ตฌ์ฑ, ๋๋ฉ ํ์ด์ง๋ SSG. ๋ธ๋ผ์ฐ์ ์์ ๋ ๋๋ง ์งํ
- ์ ์ ๋น๋ ๋ฐ ๋ฐฐํฌ ํ์ . ์๋ฒ ํ์ ์์
- ๋ฌธ์ ์ํฉ ์์ธก
- ๋ถํ์ํ ๋ฆฌ์์ค ๋ญ๋น: ์ ์ ํ์ผ ์๋น์ ์ํด EC2, Nginx ๋ฑ ์น ์๋ฒ๋ฅผ ์คํํ๊ฑฐ๋, ์ปจํ ์ด๋ํ ํ์ฌ ์คํํ๋ฉด ์ปดํจํ ์์ ์ถ๊ฐ ์๋ชจ ํ์
- ๊ด๋ฆฌ ์์ ์ฆ๊ฐ: ํธ๋ํฝ ์ฆ๊ฐ ์ ์ ์ ํ์ผ ์๋น์ ์ํ ์๋ฒ๋ ์ค์ผ์ผ๋ง ํ์
- ๊ฒฐ๋ก : ์ปจํ
์ด๋ํX, S3 + Cloud Front
- ์๋ฒ๊ฐ ํ์ ์๋ ์ํคํ ์ฒ์ด๋ฏ๋ก S3 + CF ์ ์ฉํ์ฌ Serverless ๊ตฌ์กฐ๋ก ์งํ
- ์ปดํจํ ์์ ํญ์ ์คํ์ด ํ์ ์์ผ๋ฏ๋ก ๋น์ฉ ์ ๊ฐ
- CDN์ ํตํ ์บ์ฑ๊ณผ ์๋น์ผ๋ก ๋น ๋ฅธ ์๋ ๋ณด์ฅ
- ์๊ตฌ์ฌํญ
-
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 ๋ฏธ์ ์ผ๋ก ์ค๊ณ ๋ณด๋ฅ
-
-
MQ (Apache Kafka): AWS MSK
- ์๊ตฌ์ฌํญ
- ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ ๋ฐ ์์ ๋ณด์ฅ: ์ฑํ ๋ฉ์์ง์ ์์ ํ ์ ์ฅ๊ณผ, ์ ์ฅ ์์ ๋ณด์ฅ์ ์ํ ์ญํ
- ๋น๋๊ธฐ ์ฒ๋ฆฌ: ์ฐ๊ธฐ ์ง์ฐ, ์๋ฆผ ๋ฐ์ก ๋ฑ์ ๋ถ๊ฐ์ ๋ก์ง์ผ๋ก ์ธํ ์ฑํ ํ๋ก์ธ์ค ์ง์ฐ ๋ฐฉ์ง
- ๋ฌธ์ ์ํฉ ์์ธก
- ์ด์ ๋ณต์ก๋: ์ง์ ๊ตฌ์ถ ํ ๊ฒฝ์ฐ ๋ณต์กํ ์ค์ ๋ฐ ๋ธ๋ก์ปค ๊ฐ์ ์ฐ๊ฒฐ ๊ด๋ฆฌ, ํํฐ์ ๋ฆฌ๋ฐธ๋ฐ์ฑ ๋ฑ ์ง์ ์ค์
- ์คํ ๋ฆฌ์ง ๊ด๋ฆฌ์ ์ด๋ ค์: ๋ก๊ทธ๊ฐ ์์ผ ๊ฒฝ์ฐ Kafka ์คํ ์ค๋จ. ์ด์ ์ค ๋์คํฌ ์ฆ์ค์ ์ด๋ ค์
- ๊ฒฐ๋ก
- ์ฑ๋ฅ ๋ฐ ์์ ์ฑ, ์์ ๋ณด์ฅ์ ์ํด kafka ์ ํ ๋จ
- Kafka ํด๋ฌ์คํฐ ๊ตฌ์ถ๊ณผ ์ด์์ ์ง์ ํ๊ธฐ ์ํด์๋ ๊ณผ๋ํ ๋ฆฌ์์ค ์๋ชจ
- MSK ์ฌ์ฉ์ผ๋ก ์ธํ๋ผ ๊ด๋ฆฌ ๋ถ๋ด์ AWS ์์, ํ ํฝ ์ค๊ณ ๋ฐ ๋ชจ๋ํฐ๋ง์ ์ง์ค
- ์๊ตฌ์ฌํญ
- BE ์๋น์ค (Spring Boot)
- ์๊ตฌ์ฌํญ
- ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์คํ. ์์ ์ฑ ํ์
- ์ด์ ์ ๊ธฐ๋ฅ ์ถ๊ฐ์ ์ฆ์ ๋ฒ๊ทธ ์์ ์ผ๋ก ๋น๋ฒํ ๋ฐฐํฌ์ ํธ๋ํฝ์ ๋ฐ๋ฅธ ํ์ฅ ๋ฐ์
- ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์์ ๊ฒฝํฉ ์ ์ด๋ ค์ด ์ ์ด, ๋ณต์กํ ์ค์
- ๋ฌธ์ ์ํฉ ์์ธก
- ์ค์ผ์ผ ์์ ์ง์ฐ: ํธ๋ํฝ ํญ์ฆ ์ํฉ ์ EC2๋ฅผ ์๋ก ์คํํ๊ณ ํ๊ฒฝ ์ค์ ํ ์๋ฒ๋ฅผ ์คํํ๋ ๋ฐฉ์์ ์ค๋ ์๊ฐ ์์
- ํ๊ฒฝ ๋ถ์ผ์น ๋ฌธ์ : ๊ฐ๋ฐ์ ๋ก์ปฌ์์๋ ์คํ๋๋ ๋ก์ง์ด ์๋ฒ ํ๊ฒฝ์์๋ ์คํ๋์ง ์์ ์ ์์
- ๊ฒฐ๋ก : ์ปจํ
์ด๋ํ
- ๋ถ๋ณ ์ธํ๋ผ ๊ตฌ์ถ: OS, JDK, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด๋ฏธ์ง๋ก ํจํนํ์ฌ ํ๊ฒฝ ์ผ๊ด์ฑ ํ๋ณด
- ๋น ๋ฅธ ํ์ฅ: ๋น๋๋ ์ด๋ฏธ์ง Pull, ์คํ์ ํตํด ๋น ๋ฅธ ํ์ฅ ์คํ ๊ฐ๋ฅ
- ์๊ตฌ์ฌํญ
- AI (FastAPI)
- ์๊ตฌ์ฌํญ
- ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ ๋ณต์ก
- ๋ถ์ ์์ฒญ์ ๋ฐ๋ฅธ CPU, ๋ฉ๋ชจ๋ฆฌ ๋ถํ ๊ธ์ฆ
- ๋ฌธ์ ์ํฉ ์์ธก
- ํธ๋ํฝ ์ฆ๊ฐ๋ก ์ธํ AI ๋ถ์ ์์ฒญ ์ฆ๊ฐ
- AI ์๋ฒ์ ์์ ์ฆ๊ฐ๋ก ์ธํ ๋์ผ ์ธ์คํด์ค ๋ด BE๊น์ง ๊ฐ์ด ๋๋ ค์ง๋ ์์ ๊ฐ์ญ ๋ฌธ์ ๋ฐ์ ์์
- ์๋ฒ OS ๋ ๋ฒจ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ ์ฐจ์ด๋ก ์ธํ ์คํ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ์ฑ
- ๊ฒฐ๋ก : ์ปจํ
์ด๋ํ
- AI ์๋ฒ๋ฅผ ๋ณ๋์ ์ปจํ ์ด๋๋ก ๊ฒฉ๋ฆฌํ์ฌ ์์์ ์ ํ, ํ ์๋น์ค์ ์์ ์ ์คํ ๋ณด์ฅ
- ํ์ฅ์ฑ ๋ฐ ์ด์์ฑ ํ๋ณด: ํธ๋ํฝ ์ฆ๊ฐ ๋ฑ ํ์์ ์ปจํ ์ด๋๋ง ๊ณ ์ฌ์ ๋ ธ๋๋ก ์ฎ๊ธฐ๊ฑฐ๋ ํ์ฅ ์ํด ์ปจํ ์ด๋ํ ํ์, ๋ง์ด๊ทธ๋ ์ด์ ๋น์ฉ ์ ์ฝ
- ์๊ตฌ์ฌํญ
| ๊ตฌ๋ถ | ์ธ์คํด์ค ํ์ | 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% ์ด์ ๋จ์ถ
์ด์ ํ๊ฒฝ์ ๋ฏผ๊ฐ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๊ณ ์ฅ์ ์ํฅ ๋ฒ์๊ฐ ํฌ๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฐ/์คํ ์ด์ง๊ณผ ๋คํธ์ํฌ ๊ฒฝ๊ณ๋ฅผ ๋ถ๋ฆฌํ์ฌ ์์ ์ฑ๊ณผ ๋ณด์์ ๋์์ ํ๋ณดํจ.
1. ๋จ์ผ VPC ์ฌ์ฉ ์ ๋ฐ์ํ๋ ๋ฌธ์
- ์ด์ ๋ฐ์ดํฐ๋ ์๊ฒฉํ ๋ณดํธ๋์ด์ผ ํ์ง๋ง, ๋จ์ผ VPC ๋ด์์๋ ๋ด๋ถ ๋คํธ์ํฌ ์ค์บ๋์ ํตํด ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ด์ ํ๊ฒฝ์ผ๋ก์ ์ ๊ทผ ๊ฐ๋ฅ์ฑ ์กด์ฌ
- ๊ฐ๋ฐ์๊ฐ ํ ์คํธ ๋ฐ ๊ฐ๋ฐ ๊ณผ์ ์์ ๋ผ์ฐํ ํ ์ด๋ธ ๋๋ ๋ณด์ ๊ทธ๋ฃน ๋ณ๊ฒฝ ์ค์๊ฐ ์ด์ ํ๊ฒฝ๊น์ง ์ํฅ์ ์ค ์ ์์.
- PRODํ๊ฒฝ์์๋ ์ธ๋ถ API(OAuth, Gemini, OpenAPI, Google Calendar) ํธ์ถ์ด ๋ง์ ์๋น์ค ํน์ฑ์ ๊ณ ๋ คํ์ฌ ๋ณ๋ชฉ์ด ๋ฐ์ํ์ง ์๋๋ก, ์์ ํ๊ฒ NAT Gateway๋ฅผ Prod VPC์ ์ค์ ํจ.
- ํ๋ผ์ด๋น ์๋ธ๋ท์ ์ธ์คํด์ค๊ฐ ์ธ๋ถ๋ก ๋๊ฐ ๋๋ง NAT๋ฅผ ํตํด ํต์ ํ๋๋ก ๊ตฌ์ฑํ์ฌ ํ๋ผ์ด๋น ์๋ธ๋ท์ ๋ ธ์ถ์ ์ฐจ๋จํจ.
- NON-PROD๋ ํธ๋ํฝ์ด ์ผ์ ํ์ง ์๊ณ ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ ์ง์ ์๋ง ์ฃผ๋ก ์ฐ์. NAT Gateway์ ๋์ ๊ณ ์ ๋น๋ฅผ ์ง๋ถํ๋ ๋์ , EC2(t3.micro ๋ฑ)๋ฅผ ํ์ฉํ์ฌ ๊ฐ๋ฐ์๊ฐ ํ ์คํธ๋ฅผ ํตํด ์ ๋์ ์ผ๋ก NAT ์ฑ๋ฅ์ ์กฐ์ ํจ.
- PrivateLink์ Nat Gateway๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ ์ด์
- ์ธ๋ฐ์ด๋๋ ALB๋ก ๋จ์ผํํ์ฌ ๋ณด์์ ๊ฐํํ๊ณ , ์์๋ฐ์ด๋๋ ๋ชฉ์ ์ง์ ๋ฐ๋ผ ๋ด๋ถ๋ง(PrivateLink)๊ณผ ์ธ๋ถ๋ง(NAT Gateway)์ผ๋ก ๋ถ๋ฆฌํด ํจ์จ์ฑ๊ณผ ์์ ์ฑ์ ๋์์ ํ๋ณดํจ.
- ๋ชจ๋ ํ๊ฒฝ VPC์ PrivateLink๋ฅผ ๊ตฌ์ฑํ ์ด์
- PrivateLink๋ฅผ ์ฌ์ฉํ๋ฉด ํธ๋ํฝ์ด VPC ๋ด๋ถ์์ AWS ๋ฐฑ๋ณธ ๋คํธ์ํฌ๋ก ์ง์ ์ฐ๊ฒฐ๋์ด, ์ธํฐ๋ท ๋ ธ์ถ์ด ์ค์ด๋ค๊ณ ๊ฒฝ๋ก๊ฐ ๋จ์ํด์ ธ ์ฅ์ ์์ธ๊ณผ ์ํฅ ๋ฒ์๋ฅผ ํต์ ํ๊ธฐ ์ฌ์
- ๋ํ, ๋ชจ๋ VPC์ ๋์ผํ๊ฒ ์ ์ฉํ๋ฉด ํ๊ฒฝ๋ณ ๋ณด์ ์์ค๊ณผ ๋ฐฐํฌ ์์ ์ฑ์ ์ผ๊ด๋๊ฒ ์ ์งํ ์ ์์
- ํ๋ผ์ด๋น ์๋ธ๋ท์๋ ๋ฐฑ์๋ ๋ฐ ๋ฐ์ดํฐ ๊ณ์ธต์ ๋ฐฐ์นํ์ฌ ์ธ๋ถ ์ง์ ์ ๊ทผ์ ์ฐจ๋จํจ.
- ๋ณด์ ๊ทธ๋ฃน์ ์ปจํ ์ด๋ ๋ฐ ์ธ์คํด์ค ๊ฐ ํ์ํ ํฌํธ๋ง ์ต์ ๋ฒ์๋ก ํ์ฉํ์ฌ ๋คํธ์ํฌ ๊ณ์ธต ๋ณด์์ ๊ฐํํจ.
- Devths๋ ์ฌ์ฉ์๊ฐ ์ด๋ ฅ์ยทํฌํธํด๋ฆฌ์คยท์ง์ ํํฉยท๋ฉด์ ์ผ์ ์ฒ๋ผ ์ทจ์ ์ค๋น์ ์ง์ ์ํฅ์ ์ฃผ๋ ์ ๋ณด๋ฅผ ์์ ๊ด๋ฆฌํ๋ ์๋น์ค์ด๋ฏ๋ก, ์ธํ๋ผ๋ ์ค๋จ์ ๋ฏผ๊ฐํจ.
- ์๋น์ค ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ๋จ์ ์ ์ ๋ถ๊ฐ๋ฅผ ๋์ด ๋ง๊ฐ ์ง์ ์ง์ ํํฉ ํ์ธ ์คํจ, ๋ฉด์ ์ผ์ ํ์ธ ์คํจ๋ก ์ด์ด์ ธ ์ฌ์ฉ์ ํ๋์ ์ฆ์ ํผํด๋ฅผ ๋ฐ์์ํด.
- Standby๋ฅผ ํตํด, ์ด์์ ์ธ ์๋๋ฅผ ๋ณด์ฅํ๋ฉด์ ๋น์ฉ์ ์ต์ ํํ๋ ๋ฐฉ์์ผ๋ก ์ค์ ํจ.
์ ํ ๊ธฐ์ค์
๋ณด์, ๋น์ฉ, ๊ฐ๋ฐ์ ํธ์์ ๋ฐํ์ผ๋ก ๋น๊ตํจ.
| ๋น๊ต ํญ๋ชฉ | Client VPN | AWS Systems Manager (SSM) | ๋ฐ์คํฐ์จ ์๋ฒ (Bastion Host) |
|---|---|---|---|
| ์ ์ ๋ฐฉ์ | ์ ์ฉ ํฐ๋๋ง์ ํตํ ๋คํธ์ํฌ ํฉ๋ฅ | ์์ด์ ํธ ๊ธฐ๋ฐ์ ๋ธ๋ผ์ฐ์ /CLI ์ ์ | ํผ๋ธ๋ฆญ ์๋ธ๋ท์ ์ค๊ณ ์๋ฒ๋ฅผ ๊ฒฝ์ ํ SSH ์ ์ |
| ๋น์ฉ | ์๊ฐ๋น ์ ์ ๊ณผ๊ธ (์ $72) |
๋ฌด๋ฃ | ์ธ์คํด์ค ์ ์ง๋น (t3.micro ๊ธฐ์ค ์ $10 ๋ด์ธ) |
| ๋ณด์ | ์ธ์ฆ์ ๋ฐ ํค ๊ด๋ฆฌ ํ์ | IAM ์ ์ฑ ์ผ๋ก ์ธ๋ฐํ ์ ๊ทผ ์ ์ด | SSH ํค ๊ด๋ฆฌ ๋ฐ 22๋ฒ ํฌํธ ๋ ธ์ถ ๋ฆฌ์คํฌ ์กด์ฌ |
| ํธ์์ฑ | ๋ก์ปฌ DB ํด ์ง์ ์ฐ๊ฒฐ ๊ฐ๋ฅ | ํฐ๋ฏธ๋ ์์ฃผ | SSH ํฐ๋๋ง ์ค์ ํ ๋ก์ปฌ ํด ์ฐ๊ฒฐ ๊ฐ๋ฅ |
| ๊ด๋ฆฌ ์ค๋ฒํค๋ | ๋์ (์ธ์ฆ์ ๊ฐฑ์ ๋ฑ) | ๋ฎ์ (๊ด๋ฆฌํ ์๋น์ค) | ์ค๊ฐ (OS ๋ณด์ ํจ์น ๋ฐ ์ฌ์ฉ์ ํค ๊ด๋ฆฌ) |
SSM์ ์ธ๋ฐ์ด๋ ํฌํธ ๋ ธ์ถ ์์ด ์ ๊ทผํ ์ ์๊ณ IAM์ผ๋ก ์ ๊ทผ ํต์ ๊ฐ ๊ฐ๋ฅํ๋ฏ๋ก ํ๋ผ์ด๋น ์๋ธ๋ท ๋ณด์์ฑ์ ๊ทน๋ํํ ์ ์์. ๋ฐ๋ผ์ SSM ๊ธฐ๋ฐ ์ ๊ทผ์ ์ฑํํจ.
- ๋จ์ผ ๋ ธ๋ ๋ด์ ํต์ ์ Docker Bridge Network๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค ๊ฐ ํต์ ์ ๋จ์ํํจ.
- ์ธ๋ถ ํต์ ์ NAT Gateway๋ฅผ ํตํด ์ํํ๋ฉฐ, OAuth ๋ฑ ์ธ๋ถ ์์กด ํธ์ถ์ ์์ ์ฑ๊ณผ ์ด์ ์ผ๊ด์ฑ์ ํ๋ณดํจ.
- ์ปจํ ์ด๋ ๋ก๊ทธ๋ ํธ์คํธ์ ์๊ตฌ ์ ์ฅํ์ง ์๊ณ stdout/stderr ๊ธฐ๋ฐ์ผ๋ก ์ถ๋ ฅํ๋ฉฐ, ๊ฐ ์ธ์คํด์ค์ promtail์ ๋ฐฐ์นํ์ฌ ๋ก๊ทธ๋ฅผ ์ค์ ๋ก๊ทธ ์คํ ์ด(Loki)๋ก ์์งํจ.
- ์ฐ๋ฆฌ ์๋น์ค๋ ์ํ ํ์ฅ์ด ์ค์ํ๊ธฐ์ ์ฌ๋ผ์ง ์๋ ์์ง๋ง,, ์ธ์คํด์ค๊ฐ ๊ต์ฒด๋๋๋ผ๋ ๋ก๊ทธ๊ฐ ์ค์์ ๋จ์ ์ฅ์ ๋ถ์๊ณผ ์ถ์ ์ด ๊ฐ๋ฅํ๋๋ก ์ค๊ณํจ.
- ๊ธฐ์กด ์๋น์ค ๊ธฐ๋ฐ์ Artifact ๋ฐฐํฌ ๋ฐฉ์ CI/CD ํ์ดํ๋ผ์ธ์ ์ปจํ ์ด๋ ๋ฐฉ์ CI/CD ํ์ดํ๋ผ์ธ์ผ๋ก ๋ณ๊ฒฝ ์ค๊ณ
- ๋ฌด์ค๋จ ๋ฐฐํฌ: ์ฌ์ฉ์๊ฐ ์๋น์ค๋ฅผ ์ด์ฉํ๋ ๋์ค ์ค๋จ์ด ๋ฐ์ํ๋ฉด ์๋ต ๋ฐ ์ฑํ ์ ์ ์ค๋ฑ์ผ๋ก UX๊ฐ ์ ํ๋ ์ฐ๋ ค ์์.
- ํ๊ฒฝ ์ผ์น: ๊ฐ๋ฐ, ์คํ ์ด์ง, ์ด์ ํ๊ฒฝ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ๋ฐํ์ ํ๊ฒฝ์ ์ผ์น์์ผ์ผ ํจ.
- ๋น ๋ฅธ ๋กค๋ฐฑ: ๋ฐฐํฌ ํ ์คํ ์คํจ ๋ฐ ์น๋ช ์ ์ค๋ฅ ๋ฐ์ ์, ์๋น์ค ๋ณต๊ตฌ๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ํํ์ฌ ์๋น์ค์ Down time์ ์ต์ํ ํ์ํจ. Down Time์ด ๊ธธ์ด์ง ๊ฒฝ์ฐ, ์ฌ์ฉ์ ๊ฒฝํ์ ์ ํ, ์๋น์ค ์ ๋ขฐ๋ ํ๋ฝ์ผ๋ก ์ธํ ์ฌ์ฉ์ ์ดํ์ฐ๋ ค ์์.
- ๋ฆฌ์์ค ํจ์จ์ ์ฌ์ฉ: ๋ฐฐํฌ ๊ณผ์ ์์ ์ด์ ์๋ฒ์ ๋ฆฌ์์ค๋ฅผ ์๋ชจํ์ง ์์์ผ ํจ.
- ๋ฐฉ์: B/G ๋ฐฐํฌ ๋ฐฉ์ ์ ์ง
- ์ ์ ๊ทผ๊ฑฐ
- ์์ ํ ๋ฆฌ์์ค ๊ฒฉ๋ฆฌ๋ก ์ธํ ์๋น์ค ๋ณดํธ ๊ฐ๋ฅ
- ASG์ ์ฐ๋ํ์ฌ ํธ๋ํฝ ํญ์ฆ์ ๋๋นํ ์ค์ผ์ผ๋ง ๊ณผ์ ์ฌ์
- AWS๊ฐ ๊ด๋ฆฌํด์ฃผ๋ ๋กค๋ฐฑ ๋ก์ง์ผ๋ก, ์์ธ ์ํฉ์ ๋ํ ๋๋น ๊ฐ๋ฅ
- ๊ตฌํ ๋ฐฉ์
- Docker-compose ํ์ผ์ ํ์ฉํ์ฌ ์ธ์คํด์ค ๋จ์๋ก ์์ฑ ํ ํธ๋ํฝ ์ ํ ๊ฐ๋ฅ
| ํ๊ฒฝ | ์ ๋ต | ์ค๋ช |
|---|---|---|
| ๊ฐ๋ฐ ์๋ฒ | ์ฌ์์(Recreate) | - ๊ธฐ์กด ์ปจํ
์ด๋ ์ค๋จ ํ ์ ์ปจํ
์ด๋ ์คํ - ๊ฐ๋ฐ ํ๊ฒฝ์ด๋ธ๋ก ์ฝ๊ฐ์ ๋ค์ดํ์ ํ์ฉ - ๋น ๋ฅธ ๋ฐฐํฌ์๋๋ฅผ ํ๋ณดํด ๊ฐ๋ฐ ์์ฐ์ฑ ํฅ์ |
| ์คํ ์ด์ง ์๋ฒ | Rolling Update | - ์ด์ ํ๊ฒฝ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋ฐฐํฌํ์ฌ, ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ๋ฐ ์ธํ๋ผ ์ค์ ๊ฒ์ฆ |
| ์ด์ ์๋ฒ | Rolling Update | - ์๋น์ค ์ค๋จ ์์ด ์ธ์คํด์ค ๋จ์๋ก ์์ฐจ์ ์
๋ฐ์ดํธ ์งํ - ALB Health Check ๊ฐ ํต๊ณผ๋ ํ ํธ๋ํฝ ์ ์ ์ ํ |
- ์ด๋ฏธ์ง ์ด๋ฆ์
[์ ์ฅ์ ์ฃผ์]/[ํ๋ก์ ํธ]/[์ด๋ฏธ์ง๋ช ]:[ํ๊ทธ]๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด๋ฉฐ, ์๋ฌธ์ ๋ฐ ํ์ดํ๋ง ์ฌ์ฉํ์ฌ ์ผ๊ด์ฑ์ ์ ์งํจ. - ๊ท์น: [AWS_Account_ID].dkr.ecr.[Region].amazonaws.com/[Service_Name]/[App_Name]:[Tag]
-
latestํ๊ทธ๋ ๊ฐ๋ ์ฑ์ ์ํด ๋ณํ ์ฌ์ฉํ๋, ์ด์ ๋ฐฐํฌ๋ ๋ฐ๋์ ์ปค๋ฐ SHA ๋ฑ ๋ถ๋ณ ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌํ์ฑ๊ณผ ๋กค๋ฐฑ ์์ ์ฑ์ ํ๋ณดํจ.
- Devths๋ ํ์ฌ CI๋ GitHub Actions, CD๋ AWS CodeDeploy๋ก ์ด์ํจ.
- ๋ฐ๋ผ์, Docker ๋์ ์ CodeDeploy๋ฅผ ์ ๊ฑฐํ๋ ๋ฐฉ์์ด ์๋๋ผ, CodeDeploy๊ฐ ๋ค๋ฃจ๋ ๋ฐฐํฌ ๋จ์๋ฅผ ํ์ผ/ํ๋ก์ธ์ค์์ ๋ถ๋ณ ์ด๋ฏธ์ง๋ก ์ ํํ์ฌ ๋ฐฐํฌ์ ์ฌํ์ฑ๊ณผ ๋ณต๊ตฌ ๊ฐ๋ฅ์ฑ์ ๋์ด๋ ๋ฐฉํฅ์ผ๋ก ์ค๊ณํจ.
- ๋น๋ (GitHub Actions)
- GitHub์์ Code Checkout
- Multi-stage Build: ์คํ ๊ฐ๋ฅํ ๊ฒฝ๋ ์ด๋ฏธ์ง ์์ฑ
- ์ด๋ฏธ์ง ํ๊ทธ ์์ฑ ๋ฐ ECR๋ก Push
- ๋ฐฐํฌ ํธ๋ฆฌ๊ฑฐ
- appspec.yml๊ณผ ๋ฐฐํฌ ์คํฌ๋ฆฝํธ๋ง S3์ ์
๋ก๋(
deploy.sh,docker-compose.yml) - AWS CodeDeploy์ ๋ฐฐํฌ ๋ช ๋ น ์ ๋ฌ
- appspec.yml๊ณผ ๋ฐฐํฌ ์คํฌ๋ฆฝํธ๋ง S3์ ์
๋ก๋(
- ๋ฐฐํฌ(EC2 ๋ด๋ถ)
- ECR์์ ์ด๋ฏธ์ง Pull
-
docker pull [์ด๋ฏธ์ง์ฃผ์]:[ํ๊ทธ]์คํ
-
- ์ปจํ
์ด๋ ๊ต์ฒด ๋ฐ ์คํ
docker-compose up -d
- ๋ถํ์ํ ๊ตฌ ๋ฒ์ ์ด๋ฏธ์ง ์ญ์
docker image prune
- ECR์์ ์ด๋ฏธ์ง Pull
-
.envํ์ผ์ ํธ์คํธ ๋์คํฌ์ ์์ฑํ์ฌ ์ฃผ์ ํ๋ ๋ฐฉ์์ ๊ธฐ๋ก์ ๋จ๊ฒจ ์ถํ ๋ณด์ ์ฌ๊ณ ์ ํ์ทจ ์ํ์ด ์์ - ํธ์คํธ์์ ๋์ปค ์คํ ์์ ์ ์ฃผ์ ํ๋ ๊ฒฝ์ฐ ์ญ์ ์ ํ์คํ ๋ฆฌ๋ก ๋จ์ ์ ์์
- ps ๋ช ๋ น์ด(ํ๋ก์ธ์ค ๋ฆฌ์คํธ)๋ฅผ ํตํด ํ๊ฒฝ๋ณ์๋ฅผ ํ์ธ ํ ์ ์๋ ๊ฒฝ์ฐ ์์
- ๋ณด์์ ์ทจ์ฝ์ ์ ๋ง๋ค์ง ์๊ธฐ ์ํด ๊ธฐ์กด ์ค๊ณ์ ๋์ผํ๊ฒ ์ฑ ์คํ์ ์ํ ํ๊ฒฝ๋ณ์ ์ ์ธ, AWS SDK๋ฅผ ํตํด ๊ฐ์ ธ์ด
- ์ฑ ์คํ์ ์ํ ํ์ ์ ๋ณด ์ผ๋ถ๋
deploy.sh๋ฅผ ํตํด ์ฃผ์ ํ์ฌ ์ ํ์คํ ๋ฆฌ๋ฅผ ๋จ๊ธฐ์ง ์๊ณ ์ฃผ์ (SPRING_PROFILES_ACTIVE,AWS_REGION,SERVER_PORT๋ฑ )
- ์ฆ์ ๋กค๋ฐฑ: CodeDeploy์ โ๋ฐฐํฌ ์คํจ ์ ๋กค๋ฐฑโ ์ต์ ํ์ฑํ
- ์๋ ๋กค๋ฐฑ ๊ธฐ๋ฅ ์ถ๊ฐ
- ๋ฐฐํฌ ์ฑ๊ณต ์์ ์ ์ด๋ฏธ์ง ํ๊ทธ๋ฅผ ํ์ธ
- CodeDeploy์์ ํด๋น ๋ฒ์ ์ฌ๋ฐฐํฌ ํธ๋ฆฌ๊ฑฐ(์ด๋ฏธ์ง๊ฐ ์บ์ ๋์ด์์ด ๋น ๋ฅธ ๋ณต๊ตฌ ๊ฐ๋ฅ)
- ์ด๋ฏธ์ง Pull ํ ์ฆ์ ๋ณต๊ตฌ ๊ฐ๋ฅ
์ปจํ ์ด๋ ํ๊ฒฝ์ ๋์ ํน์ฑ์ ๊ณ ๋ คํ์ฌ ๋ฆฌ์์ค ๋ญ๋น, ์ฅ์ ๊ฐ์ง๋ฅผ ํ ์ ์๋ ์์คํ ๊ตฌ์ถ ํ์
-
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 ์ค์
- ์ผ์์ ์ค๋ฅ, OOM Kill๋ก ์ธํ ์ปจํ ์ด๋ ์ข ๋ฃ ๋ฐ์์, ๋น ๋ฅธ ์ฌ์์์ผ๋ก ๋ณต๊ตฌํ์ฌ ๊ฐ์ฉ์ฑ ์ ์ง ํ์
-
restart: always์ต์ ์ค์ ํ์
- ๋งค ๋ฐฐํฌ ์์ ๋ง๋ค ์๋ก์ด ์ด๋ฏธ์ง๋ฅผ Pull ํด์ค๋ฉด ์ด๋ฏธ์ง ๋์ ์ผ๋ก ๋์คํฌ ๊ณต๊ฐ์ ์ฐจ์งํ๊ฒ ๋จ
- ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ๋ง์ง๋ง์ ๋์ ์ด๋ฏธ์ง pruning ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ์ฌ Disk Full ์ฅ์ ๋ฐฉ์ง
docker system prune -a -f --volumes
- ์ปจํ ์ด๋ ๋ณต๊ตฌ, ๋ฐฐํฌ ํ ํธ๋ํฝ ์ ๋ฌ์ ์ํด ๊ฐ๊ฐ ๋ค๋ฅธ ํฌ์ค ์ฒดํฌ ๋ฐฉ์์ ์ฌ์ฉ
| ๊ตฌ๋ถ | Internal Health Check (Docker) | ALB Health Check (External) |
|---|---|---|
| ์ฃผ์ฒด | Docker Daemon (์ปจํ ์ด๋ ๋ด๋ถ) | AWS ALB (์ธ๋ถ ๋ก๋๋ฐธ๋ฐ์) |
| ์ง๋ฌธ | ๊ฐ๋ณ ์ปจํ ์ด๋์ ์ ์ ์คํ ์ฌ๋ถ | ํธ๋ํฝ ์ ์์ ์ผ๋ก ์คํ ๊ฐ๋ฅ |
| ์คํจ ์ ํ๋ | Autoheal์ด ์ปจํ
์ด๋๋ฅผ ์ฌ์์ํจ. (์์ฒด ๋ณต๊ตฌ) |
ํด๋น ์ธ์คํด์ค๋ก ํธ๋ํฝ ์ ์ก ์ค๋จ. (์ฌ์ฉ์ ๋ณดํธ) |
| ํ์์ฑ | ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฑ์ผ๋ก ํ๋ก์ธ์ค๊ฐ "์ข๋น"๊ฐ ๋์์ ๋, ์ฌ๋ถํ | ์๋ฒ๊ฐ ์ฃฝ์์ ๋ ์ฌ์ฉ์์๊ฒ ์๋ฌ๋ฅผ ๋ ธ์ถํ์ง ์๊ณ ๋ค๋ฅธ ์๋ฒ๋ก ํธ๋ํฝ ์ ํ |
์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋๋ฉด ๋ด๋ถ ๋ฐ์ดํฐ๋ ํจ๊ป ์ฌ๋ผ์ง๊ฒ ๋จ.
๋ก๊ทธ์ ๋ถ์๋ฐ ๋๋ฒ๊น ์ ์ํ ๋ก๊ทธ ์์ํ ์ ๋ต์ด ํ์
- PLG ์คํ์ ํตํด ๋ชจ๋ํฐ๋ง ํ์ง๋ง, Loki ์๋ฒ ์๋ฌ ๋ฐ์ ์ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ์ฑ (๋ก๊ทธ ์ ์ก ๋๊ธฐ, ๋ก๊ทธ ์ ์ค)
- ๋ชจ๋ํฐ๋ง ํด ์ฅ์ ๋ฐ์ ์ ๋ก๊ทธ ํ์ธ ๋ถ๊ฐํ๋ฉด ๋๋ฒ๊น ๋ฐ ์ฅ์ ๋์ ๋ถ๊ฐ
- ์ปจํ
์ด๋ ๋ด๋ถ
/logs๋๋ ํ ๋ฆฌ๋ฅผ ํธ์คํธ ์ธ์คํด์ค์/var/log/apps/{BE/AI}์ ๋ง์ดํธํ์ฌ ์ ์ฅ - ์ดํ ๋ก๊ทธ ์์ง๊ธฐ(Promtail)์ด ํ์ผ์ ์ฝ์ด Loki๋ก ์ ์ก
-
ํธ์คํธ ์ธ์คํด์ค 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 }
- ์ ํ ๋ ์ธํ๋ผ ๋ฆฌ์์ค ๋ด์์ ์ฌ๋ฌ ์๋น์ค๊ฐ ์์ ๊ฐ์ญ์ ์ผ์ผํค์ง ์๊ณ , ์ ์์ ์ผ๋ก ์๋ตํ์ฌ UX๋ฅผ ๋ณด์ฅํด์ผํจ.
- ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ํ์(API ์๋ต, ์๋ฌ์จ, ์๋ต ์๊ฐ ๋ฑ)
- ๋น์ฆ๋์ค ๋ก์ง ๋ฐ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ํ ๋ชจ๋ํฐ ( ์์ฒญ ๋๋น ์ฑ๊ณต๋ฅ , ์ถํ MQ ๋์ ์ ์์ธ ๋ฉ์์ง ์, DLQ ์)
- ์ด์ ํจ์จ์ฑ ๋ฐ ๋น์ฉ (๋ก๊ทธ ๊ด๋ฆฌ ์ค์ํ, ๋น์ฉ ๋ชจ๋ํฐ๋ง)
- PLG(Prometheus + Loki + Grafana)
- ELK ๋๋น ์ ์ ๋ฆฌ์์ค ์ฌ์ฉ์ผ๋ก ๋ชจ๋ํฐ๋ง ์ํ ๋ฆฌ์์ค ์ต์ํ
- ์ธํ๋ผ: EC2 ์ธ์คํด์ค ๋ณ
CPU,Memory,Disk I/O ์ฌ์ฉ๋,Network ์ก์์๋ฑ ๋ฉํธ๋ฆญ - ์ปจํ
์ด๋
- ์ปจํ ์ด๋๋ณ CPU/๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์๊ฐํ
- ์งํ:
AI CPU%,AI RSS,BE P95 latency,WS ๋์ ์ฐ๊ฒฐ ์,OOM Kill ํ์,์ปจํ ์ด๋ ์ฌ์์ ํ์
- ์ ํ๋ฆฌ์ผ์ด์
- ์งํ:
API ์๋ต ์๋,HTTP P95 Latency,Error Rate(5xx) ํ์ ๋ฐ ๋น์จ,DB ์ฐ๊ฒฐ ์
- ์งํ:
- ์๊ณ์น ์ด๊ณผ ์ Discord Webhook์ผ๋ก ์ฆ์ ํต๋ณด(์ด์์๊ฐ โ์ง๊ธ ๋ญ๊ฐ ๋ฌธ์ ์ธ์งโ ๋ฐ๋ก ํ๋จ)
- ์ฅ์ ๋ฐ์ ํ์๋ง ์๋ฆผ์ ๋ณด๋ด๋ ๊ฒ์ด ์๋๋ผ, ์ฅ์ ์งํ ๋ฐ๊ฒฌ ์ ๋ฏธ๋ฆฌ ์๋ฆผ
- ๋ค์ํ ์งํ ์๋ฆผ์ ํตํด ์ค๋ฅ ๋๋น ๋ฐ Failover๋ฅผ ํ ์ ์๋๋ก ํจ
- ๋ฉ๋ชจ๋ฆฌ 80%๋๋ฌ์ ๊ฒฝ๊ณ , 90% ๋๋ฌ์ Critical ์๋ฆผ
- ๊ฐ์ฉ์ฑ
- ์ฌ์์ ํ์: 1์๊ฐ ๋ด ์ฌ์์ 3ํ ์ด์์ ์๋ฆผ
- HealthCheck: unhealthy ์ํ ์ง์ 1๋ถ ์ด์ ์ ์๋ฆผ
- ์ฑ๋ฅ
- API ์๋ต ์๋: 2์ด ์ด์ ์ ์๋ฆผ(์์คํ ๊ณผ๋ถํ ๊ฒฝ๊ณ )
- CPU ์ฌ์ฉ๋ฅ 80% ์ด์ 5๋ถ ์ด์ ์ง์ (์ค์ผ์ผ ์์ ๋๋น)
- ์๋ฌ
- HTTP 5xx: 1๋ถ๊ฐ ์๋ฌ์จ 1% ์ด์ ์ ์๋ฆผ (์๋น์ค ์ฅ์ , ์ธ๋ถ API ์ฅ์ , DB ์ฅ์ ๊ฐ๋ฅ์ฑ)
- ํน์ Log KeyWord: ์ฆ์ ๋์ ํ์ํ ๋ก๊ทธ ์๋ฆผ ํค์๋ ์ค์ (
OutOfMemory,Deadlock๋ฑ)
์ปจํ ์ด๋ํ ๊ณ์ธต์ด ์ถ๊ฐ๋ ๋งํผ, ์ถ๊ฐ์ ์ธ ๋ณด์ ์ฌ๊ณ ๋ฐฉ์ง๋ฅผ ์ํ ๋ฐฉ์ ํ์
- Non-root User๋ก ์คํ: ์๋ชป๋ ๋ณด์ ์ค์ ์ผ๋ก ์ปจํ ์ด๋ ํ์ถ์ ํตํด ํธ์คํธ ์ธ์คํด์ค์ ๋ฃจํธ ๊ถํ ํ๋์ ๋ฐฉ์งํด์ผ ํจ
- ์ด๋ฏธ์ง ์ค์บ: ECR์ Basic Scanning ๊ธฐ๋ฅ์ ํ์ฑํ ํ์ฌ ์ด๋ฏธ์ง Push ์์ ์ OS ํจํค์ง ์ทจ์ฝ์ ์ ๊ฒ
๊ฐ์ข ์ปจํ ์ด๋, ์๋น์ค, 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 |
| ํ๋ก์ธ์ค ๊ธฐ๋ฐ | Docker ๊ธฐ๋ฐ | |
|---|---|---|
| ์์ ์ฑ | AI/์ฑํ ๋ถํ๊ฐ ๊ฐ์ ์์์ ๊ณต์ ํด ์ฅ์ ์ ์ด ์ฌ์. ์ฌ๊ธฐ๋/๋ณต๊ตฌ๋ ์ฌ๋ ์์ด ๋ง์ด ํ | ์ปจํ ์ด๋๋ณ CPUยท๋ฉ๋ชจ๋ฆฌ ์ํ์ผ๋ก ์ ์ด ์ฐจ๋จ, ํฌ์ค์ฒดํฌ/์ฌ์์ ์๋ํ๋ก MTTRโ |
| ๋ณด์ | ์๋ฒ์ ํจํค์ง/ํด์ด ๋์ ๋์ด ๊ณต๊ฒฉ๋ฉด ์ฆ๊ฐ. ์๋ SSH ์ด์์ด ์ฆ์์ง์๋ก ๋ฆฌ์คํฌโ | ์ต์ ์ด๋ฏธ์ง+๋ถ๋ณ ์ฐ์ถ๋ฌผ๋ก ๊ณต๊ฒฉ๋ฉดโ. ๋ด๋ถ๋ง ํต์ /SSM/๊ถํ ์ต์ํ๋ก ์ด์ ๋ณด์โ |
| ์ด์ ํจ์จ | ๋ฐฐํฌ๊ฐ ๋๋ฆฌ๊ณ ํธ์ฐจ๊ฐ ์ปค ๊ธด๊ธ ๋์์ ์ทจ์ฝ | ๋์ผ ์ด๋ฏธ์ง ์ฌ๋ฐฐํฌ/๋กค๋ฐฑ์ด ๋จ์ํด ๋ฐฐํฌ ์๋ยท์ ๋ขฐ๋ ๋์ ๊ฐ์ |
- ๊ฒฐ๋ก ์ ์ผ๋ก Docker๋ Devths์์ ๋จ์ ํธ์๊ฐ ์๋๋ผ, ํธ๋ํฝ ๊ธ์ฆ ์์๋ ํต์ฌ ๊ธฐ๋ฅ์ ์์ ์ ์ผ๋ก ์ ๊ณตํ๊ณ ์ด์ ๋ณด์์ ๊ฐํํ๊ธฐ ์ํ ์คํ ๋จ์ ํ์คํ ์ ๋ต์ผ๋ก ์ ์ํจ.