EKS - 100-hours-a-week/3-team-ssammu-wiki GitHub Wiki
๋ณธ ๋จ๊ณ์์๋ ๊ธฐ์กด kubeadm ๊ธฐ๋ฐ ์๋ ํด๋ฌ์คํฐ๋ฅผ ๋์ด, AWS์ ๋งค๋์ง๋ Kubernetes ์๋น์ค(EKS)๋ฅผ ๋์ ํ์ฌ ์ด์์ ์๋ํ, ํ์ฅ์ฑ, ์์ ์ฑ์ ํ๋ณดํฉ๋๋ค.
- Kubernetes์ ๊ณ ๋ํ๋ ๊ธฐ๋ฅ์ ํตํด ๋ณต์กํ ์๋น์ค ๊ตฌ์กฐ ์ด์
- ์คํ ์ค์ผ์ผ๋ง, ํฌ์ค์ฒดํฌ, ๋กค๋ง ์ ๋ฐ์ดํธ ๋ฑ ์ด์ ์๋ํ ๊ธฐ๋ฅ ๋์
- EKS์ CI/CD, ๋ณด์, ์คํ ๋ฆฌ์ง, ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ ์ฐ๊ณ
- ๋ค์ค AWS ๊ณ์ (Dev/Prod) ๋ถ๋ฆฌ ๋ฐ ๋ฉํฐ VPC ๋คํธ์ํฌ(Transit Gateway) ๊ตฌ์ฑ
- GPU ๋ ธ๋/AI ์ํฌ๋ก๋ ๋ณ๋ ๋ถ๋ฆฌ ๋ฐ PVC ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์ง์์ฑ ํ๋ณด
ํญ๋ชฉ | Kubeadm (EC2 ์๋ ๊ตฌ์ฑ) | EKS (Fully-managed Kubernetes) |
---|---|---|
ํด๋ฌ์คํฐ ๊ด๋ฆฌ | ์๋ ์ ๊ทธ๋ ์ด๋ / ๊ด๋ฆฌ ๋ถ๋ด ํผ | AWS์์ ์๋ ํจ์น ๋ฐ ๊ด๋ฆฌ |
๊ณ ๊ฐ์ฉ์ฑ | Master Node ์ฅ์ ์ ์๋ ์กฐ์น ํ์ | Control Plane ์๋ ๋ค์คํ (HA ๊ตฌ์ฑ) |
Auto Scaling | ์ง์ ๋ ธ๋ ๊ทธ๋ฃน ๊ตฌ์ฑ ํ์ | Managed Node Group ๋ฐ HPA ์ง์ |
๋คํธ์ํฌ ๊ตฌ์ฑ | VPC ๋ด ์๋ ์ค์ ํ์ | VPC-CNI ํ๋ฌ๊ทธ์ธ ๋ฐ ALB ์ฐ๋ ์ง์ |
๋ณด์ ๋ฐ IAM ํตํฉ | ์ธ์ฆ ์ฒด๊ณ ๋ณ๋ ๊ตฌ์ฑ ํ์ | IAM, RBAC, OIDC ์ฐ๋ ๋ด์ฅ |
- AI ๋ฉด์ ํผ๋๋ฐฑ, CS ๋ฌธ์ ๋ํ ์ด์ ๋ฑ ์ค์๊ฐ ๊ฐ์ฉ์ฑ์ด ๋งค์ฐ ์ค์
- ๋ณต์กํ ๋ฐฑ์๋ + AI ์ํฌ๋ก๋๋ฅผ ๋ง์ดํฌ๋ก์๋น์ค ๋จ์๋ก ๊ด๋ฆฌ ํ์
- ํฅํ GPU ๋ ธ๋ ํ์ฅ ๋ฐ ๋น์ฉ ์ต์ ํ(Spot, Fargate) ํ์
- ๋ก๊ทธ ์ฅ๊ธฐ ์ ์ฅ ๋ฐ ์ฅ์ ๋์ ์ฒด๊ณ ๊ตฌ์ถ ํ์
ํญ๋ชฉ | ECS | EKS |
---|---|---|
์ํ๊ณ ์ฐ๋์ฑ | AWS ๋ค์ดํฐ๋ธ ๋๊ตฌ ์ค์ฌ | CNCF ํ์ค, ArgoCD/Helm/Kustomize ์ฐ๋ |
๋ฉํฐ ํด๋ผ์ฐ๋ ์ด์์ฑ | AWS ์ข ์์ | GKE, AKS, ์จํ๋ ๋ฏธ์ค K8s ํธํ์ฑ |
๋ณด์ ๊ฒฉ๋ฆฌ | Task ์์ค | ๋ค์์คํ์ด์ค + RBAC + NetworkPolicy |
๋น์ฉ ๊ตฌ์กฐ | ๋จ์ ๊ณผ๊ธ | Spot/Fargate ํผํฉ ์ ์ฐ |
๋ฐฐํฌ ์ ๋ต | ๋จ์ Task ์ฌ์์ | Rolling, Blue-Green, Canary (Argo Rollouts) |
- ํด๋ฌ์คํฐ:
careerbee-cluster
- ๋ค์์คํ์ด์ค:
sys
,frontend
,backend
,ai
,monitoring
- ๋ฉํฐ IAM ๊ณ์ ์ ๋ต: shared(dev), prod ๋ถ๋ฆฌ
- GPU ์ ์ฉ Node Group: AI ์ํฌ๋ก๋์ฉ (FastAPI)
- ์ผ๋ฐ Node Group(Worker Node): FE(Next.js), BE(SpringBoot)
- ๋ค์ค VPC ๊ตฌ์ฑ: Dev VPC, Prod VPC ๋ถ๋ฆฌ ์ด์
- Public Subnet โ ALB (Ingress Controller)
- Ingress ๋ฆฌ์์ค โ Blue/Green Service โ Blue/Green Pods
- CoreDNS๋ฅผ ํตํ Service Discovery (
<svc>.<ns>.svc.cluster.local
) - ๋ด๋ถํต์ : FE โ BE โ AI ์์ฐจ ํธ์ถ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ: RDS(Prod/Dev ๊ฐ๊ฐ ์ด์)
- Kubernetes์์ Pod ๊ฐ ๋คํธ์ํฌ ํต์ ์ ์ ์ดํ๋ ์ ์ฑ
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ Pod๋ ์๋ก ํต์ ์ด ๊ฐ๋ฅํ์ง๋ง, NetworkPolicy๋ฅผ ์ ์ฉํ๋ฉด ํน์ ํต์ ๋ง ํ์ฉ
- ๋ณด์ ๊ฐํ, ์๋น์ค ๋ถ๋ฆฌ, ์ต์ ๊ถํ ์์น ์ ์ฉ์ ํ์์
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-backend-to-db
namespace: backend
spec:
podSelector:
matchLabels:
role: db
ingress:
- from:
- podSelector:
matchLabels:
role: backend
- ์ด ์์๋ "role=backend"์ธ Pod๋ง "role=db"์ธ Pod๋ก ์ ๊ทผ์ ํ์ฉ
- ํ๋ก ํธ์๋์์ DB์ ์ง์ ์ ๊ทผํ๋ ๊ฒ์ ์ฐจ๋จํ๊ณ , ๋ฐฑ์๋๋ง ์ ๊ทผํ๊ฒ ๋ง๋๋ ๋ณด์ ๊ตฌ์กฐ๋ฅผ ๊ตฌํ ๊ฐ๋ฅ
์ข ๋ฅ | ๊ธฐ๋ฅ | ์ค๋ช |
---|---|---|
HPA (Horizontal Pod Autoscaler) | Pod ์ ์๋ ์กฐ์ | CPU, Memory, Custom Metrics ๊ธฐ๋ฐ์ผ๋ก Pod ๋๋ฆฌ๊ณ ์ค์ |
VPA (Vertical Pod Autoscaler) | Pod ๋ฆฌ์์ค ์์ฒญ/์ ํ ์๋ ์กฐ์ | Pod CPU/Memory ์์ฒญ๋์ ๋์ ์ผ๋ก ์กฐ์ (๋จ, ์ฌ์์ ํ์) |
CA (Cluster Autoscaler) | ๋ ธ๋ ์ ์๋ ์กฐ์ | ์ ์ฒด ํด๋ฌ์คํฐ ๋ ธ๋(EC2 ์ธ์คํด์ค) ์๋ฅผ ์๋ ํ์ฅ/์ถ์ |
KEDA (Event-driven Autoscaler) | ์ธ๋ถ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ค์ผ์ผ๋ง | Kafka, SQS, Redis ๋ฑ ์ด๋ฒคํธ ํธ๋ํฝ๋ ๊ธฐ๋ฐ Pod ์ ์กฐ์ ๊ฐ๋ฅ |
HPA Custom Metrics | ์ฌ์ฉ์ ์ ์ ์งํ ๊ธฐ๋ฐ ์ค์ผ์ผ๋ง | ์: Redis ํ ๊ธธ์ด, DB ์ปค๋ฅ์ ์ ๋ฑ์ผ๋ก ์ค์ผ์ผ๋ง ๊ฐ๋ฅ |
โ EKS์์๋ ๋ชจ๋ ๊ตฌํ ๊ฐ๋ฅ
โ Custom Metrics๋ ๋ณ๋ ์ด๋ํฐ ์ค์น(Prometheus Adapter ๋ฑ)๊ฐ ํ์ (FluentBit, CloudWatch๋ง์ผ๋ก๋ ๋ถ์กฑ)
- PVC โ PV โ EBS ๊ตฌ์กฐ
- AI ๋ฐ์ดํฐ ๋ฐ ๋ชจ๋ธ ์์์ฑ ๋ณด์ฅ
PVC ์์:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: chroma-data-pvc
namespace: ai
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi
storageClassName: gp2
- Deployment, HPA, ConfigMap, Secret, PVC๋ฅผ ๊ฐ ๋ค์์คํ์ด์ค๋ณ๋ก ๋ฐฐํฌ
- Monitoring ๋ค์์คํ์ด์ค์ FluentBit DaemonSet + ConfigMap + ServiceAccount ์ด์
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
namespace: backend
spec:
replicas: 3
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: backend
image: 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/careerbee-be:prod-1.0.0
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: backend-hpa
namespace: backend
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: backend
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
apiVersion: v1
kind: ConfigMap
metadata:
name: backend-config
namespace: backend
data:
SPRING_PROFILES_ACTIVE: prod
DB_HOST: rds.careerbee.ap-northeast-2.rds.amazonaws.com
- GitHub Actions
- Docker Build โ ECR Push
- Helm values.yaml ์ ๋ฐ์ดํธ โ Git Push
- ArgoCD
- GitOps ๊ฐ์ง โ EKS ํด๋ฌ์คํฐ ์๋ Sync
- Slack ์๋ฆผ: ๊ฐ๋ฐ์์๊ฒ Slack์ ํตํ ๋น๋/๋ฐฐํฌ ์ฑ๊ณต ์ฌ๋ถ ์๋ฆผ ์ ์ก
- ๋ก๊ทธ ์์ง: FluentBit DaemonSet์ผ๋ก ๊ฐ ๋ ธ๋์์ ๋ก๊ทธ ์์ง โ CloudWatch Logs๋ก ์ ์ก
- ๋ก๊ทธ ์คํธ๋ฆฌ๋ฐ: CloudWatch Logs โ Kinesis Firehose โ S3 ๋ฒํท์ ์ ์ฌ (์ฅ๊ธฐ ๋ณด๊ด ๋ฐ ๋ถ์)
- ๋ฉํธ๋ฆญ ์์ง: Kubernetes ๋ฉํธ๋ฆญ ์๋ฒ + Prometheus Operator ์ค์น โ Pod, Node, HPA ์ํ ์์ง
- ์๋: CloudWatch Alarm ์ฐ๋ โ Slack ์๋ฆผ
- ๋ธ๋ฃจ์ ๊ทธ๋ฆฐ ํ๊ฒฝ์ ๋ณ๋ ฌ๋ก ์ด์ํด ๋ฌด์ค๋จ์ผ๋ก ์ ๋ฒ์ ์ ๋กค์์ํ๋ ๋ฐฐํฌ ๋ฐฉ์
ํญ๋ชฉ | Rolling Update | Blue-Green Deployment | Canary Deployment |
---|---|---|---|
๊ฐ์ | ๊ธฐ์กด Pod๋ฅผ ์์ฐจ์ ์ผ๋ก ๊ต์ฒด | ๊ธฐ์กด(Blue)๊ณผ ์ ๊ท(Green)์ ๋ณ๋ ฌ ์ด์ ํ ์ ํ | ์ ๊ท ๋ฒ์ ์ ์ผ๋ถ ํธ๋ํฝ์๋ง ์ ์ฉ ํ ์ ์ง ํ๋ |
์ฅ์ | ๋ฆฌ์์ค ์ ์ฝ, ๋ค์ดํ์ ์ต์ํ | ์๋ฒฝํ ๋กค๋ฐฑ ๊ฐ๋ฅ, ์ฅ์ ๋์ ๋น ๋ฆ | ์ธ๋ฐํ ํ์ง ๊ฒ์ฆ, ์ํ ์ต์ํ |
๋จ์ | ๊ต์ฒด ์ค ์ค๋ฅ ์ ๋กค๋ฐฑ ๋ณต์ก | ๋ฆฌ์์ค ๋ ๋ฐฐ ํ์ (Blue/Green ์ ์ง) | ํธ๋ํฝ ๋ถ๋ฐฐ/๋ชจ๋ํฐ๋ง ์ฒด๊ณ ํ์ |
-
๋ฌด์ค๋จ ์ฌ์ฉ์ ๊ฒฝํ ๋ณด์ฅ: ๊ธฐ์กด ๋ฒ์ ์ ๊ทธ๋๋ก ์ ์งํ๋ฉด์ ์ ๊ท ๋ฒ์ ์ ๋ฐฐํฌํ๋ฏ๋ก ํธ๋ํฝ ์ ๋ฐ ์ด์์ด ํญ์ ์ ์ ํ๊ฒฝ(Blue ๋๋ Green)์ ํตํด ์ฒ๋ฆฌ
- ์ฃผ์ ์๋น์ค ์ค๋จ ์์ด ์ ๊ท ๊ธฐ๋ฅ์ ํ ์คํธํ ์ ์์ด SLA(Service Level Agreement, ์๋น์ค ์ ๊ณต์๊ฐ ๊ณ ๊ฐ์๊ฒ ์ฝ์ํ๋ ๊ฐ์ฉ์ฑยท์ฑ๋ฅยท์ง์ ์์ค ๋ฑ ํ์ง ๊ธฐ์ค) ํ๋ณด์ ์ ๋ฆฌํ๋ค
-
์ฆ๊ฐ์ ๋กค๋ฐฑ ์ง์: ์๋ก์ด ๋ฐฐํฌ์์ ๋ฌธ์ ๊ฐ ๋ฐ๊ฒฌ๋ ๊ฒฝ์ฐ, ๋ก๋ ๋ฐธ๋ฐ์ ์ค์ ๋ง์ผ๋ก ํธ๋ํฝ์ ์ด์ ํ๊ฒฝ์ผ๋ก ๋๋ ค ์ฆ์ ๋ณต๊ท ๊ฐ๋ฅ
- ๋ฌธ์ ํ์ ๋ฐ ๋ณต๊ตฌ ์๋๋ฅผ ๊ทน๋ํํด ์ด์ ๋ฆฌ์คํฌ๋ฅผ ์ต์ํ
-
๋ฒ์ ๋ณ ํธ๋ํฝ ๋ถ๋ฆฌ: Blue/Green ํ๊ฒฝ์ ๊ฐ๊ฐ ๋ณ๋์ ๋ฒ์ ์ ์ด์ํด ๋ก๊ทธยท๋ชจ๋ํฐ๋ง ์งํ๋ฅผ ๋
๋ฆฝ ์์งํ๋ค
- ์ ๊ท ๋ฒ์ ์์ ์ฑ์ ๊ฒ์ฆํ ๋ค ์ ์ง์ ์ผ๋ก ํธ๋ํฝ ์ ํํ๋ฉด์ ํผํฌ๋จผ์ค๋ฅผ ๊ฒํ
-
์ ์ธ์ ์ธํ๋ผ ๊ด๋ฆฌ: Git์ ๋ชจ๋ ๋งค๋ํ์คํธ๋ฅผ ์ ์ฅํ๊ณ ๋ณ๊ฒฝ ์ด๋ ฅ์ ๋ฒ์ ๊ด๋ฆฌ
- Git ์ํ๊ฐ ๊ณง ํด๋ฌ์คํฐ ์ํ๊ฐ ๋์ด ์ผ๊ด์ฑ์ ๋ณด์ฅ
-
์๋ ๋๊ธฐํ ๋ฐ Drift ๋ณต๊ตฌ
- Drift(๊ตฌ์ฑ ๋๋ฆฌํํธ)๋ Git์ ์ ์ธ๋ ๋ฆฌ์์ค ์ํ์ ์ค์ ํด๋ฌ์คํฐ ๋ด ๋ฆฌ์์ค ์ํ ๊ฐ ๋ถ์ผ์น๋ฅผ ์๋ฏธ
- ArgoCD๋ ์ด ๋ถ์ผ์น๋ฅผ ์๋ ํ์งํ๊ณ Git ์ํ๋ก ๋ณต๊ตฌํ์ฌ, ์ํ๋ ์ ์ธ์ ์ํ๋ฅผ ์ง์์ ์ผ๋ก ์ ์ง
-
์ฝ๊ณ ์์ ํ ๋กค๋ฐฑ: ๋ชจ๋ ๋ฐฐํฌ ์ด๋ ฅ์ด Git ์ปค๋ฐ ๋จ์๋ก ๋จ์ ์์ด, ํน์ ์ปค๋ฐ์ผ๋ก ์ฆ์ ๋กค๋ฐฑ
- CI ํ์ดํ๋ผ์ธ๊ณผ ์ฐ๋ํด PR์ด ๋จธ์ง๋๊ธฐ ์ ์ค์ ์ ์ฉ ๊ฒฐ๊ณผ๋ฅผ ๋ฏธ๋ฆฌ ๊ฒ์ฆํด ์ถฉ๋, ์ค๋ฅ, ๋ฆฌ์์ค ๋ณ๊ฒฝ ์ํฅ์ ์ฌ์ ์ ํ์ ํ๊ณ ํด๊ฒฐ
- ๋ฉํฐ ํด๋ฌ์คํฐ ๊ด๋ฆฌ: ๋จ์ผ ArgoCD ์ธ์คํด์ค๋ก ์ฌ๋ฌ ํด๋ฌ์คํฐ(EKS, GKE ๋ฑ)๋ฅผ ํตํฉ ๊ด๋ฆฌํ ์ ์์ด, ๋ฉํฐ ํด๋ฌ์คํฐ ์ด์ ๋ณต์ก๋๋ฅผ ๋ํญ ๊ฐ์
careerbee-chart/
โโโ Chart.yaml # ์ฐจํธ ๋ฉํ๋ฐ์ดํฐ
โโโ values.yaml # ๊ธฐ๋ณธ ๊ฐ ์ ์
โโโ templates/
โ โโโ deployment.yaml # Deployment ๋ฆฌ์์ค ํ
ํ๋ฆฟ
โ โโโ service.yaml # Service ๋ฆฌ์์ค ํ
ํ๋ฆฟ
โ โโโ hpa.yaml # HPA ํ
ํ๋ฆฟ
โ โโโ ingress.yaml # Ingress ๋ฆฌ์์ค
โ โโโ _helpers.tpl # ํ
ํ๋ฆฟ ํฌํผ ํจ์
apiVersion: v2
name: careerbee
description: CareerBee ์๋น์ค Helm ์ฐจํธ
version: 0.1.0
appVersion: "1.0.0"
replicaCount: 3
image:
repository: 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/careerbee-be
tag: prod-1.0.1
service:
type: LoadBalancer
port: 80
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
hpa:
enabled: true
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 70
ingress:
host: careerbee.dev.example.com
yaml
๋ณต์ฌํธ์ง
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "careerbee.fullname" . }}
labels:
app: {{ include "careerbee.name" . }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ include "careerbee.name" . }}
template:
metadata:
labels:
app: {{ include "careerbee.name" . }}
spec:
containers:
- name: {{ include "careerbee.name" . }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: 8080
resources:
limits:
cpu: {{ .Values.resources.limits.cpu }}
memory: {{ .Values.resources.limits.memory }}
requests:
cpu: {{ .Values.resources.requests.cpu }}
memory: {{ .Values.resources.requests.memory }}
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
apiVersion: v1
kind: Service
metadata:
name: {{ include "careerbee.fullname" . }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: 8080
protocol: TCP
selector:
app: {{ include "careerbee.name" . }}
{{- if .Values.hpa.enabled }}
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: {{ include "careerbee.fullname" . }}-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ include "careerbee.fullname" . }}
minReplicas: {{ .Values.hpa.minReplicas }}
maxReplicas: {{ .Values.hpa.maxReplicas }}
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: {{ .Values.hpa.targetCPUUtilizationPercentage }}
{{- end }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ include "careerbee.fullname" . }}
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: {{ .Values.ingress.host }}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: {{ include "careerbee.fullname" . }}
port:
number: {{ .Values.service.port }}
values.yaml ์์ ingress.host ๊ฐ๋ ์ถ๊ฐ๋ผ ์์ด์ผ ์ ์ ๋์
{{/*
Generate a name for resources
*/}}
{{- define "careerbee.name" -}}
careerbee
{{- end }}
{{/*
Generate a fullname for resources
*/}}
{{- define "careerbee.fullname" -}}
{{ .Release.Name }}-{{ include "careerbee.name" . }}
{{- end }}
๊ตฌ์ฑ ์์ | ์์ ๋น์ฉ (์๊ฐ) | ์ค๋ช |
---|---|---|
EC2 t3.medium (Worker Node, FE/BE) X 4 | ์ฝ $60~65 | EKS ํด๋ฌ์คํฐ Worker Node๋ก ์ฌ์ฉ (FE/BE ๋ง์ดํฌ๋ก์๋น์ค ์ด์) |
EC2 t3.micro (OpenVPN) | ์ฝ $5 | ๊ฐ๋ฐ์ ์ ์ฉ VPN ์๋ฒ (Private Subnet ์ ๊ทผ์ฉ) |
EKS(Cluster) X 2 | ์ฝ $36 | Dev/Prod ๋ณ๋ก EKS ํด๋ฌ์คํฐ 2๊ฐ ์ด์ (Control Plane ๊ด๋ฆฌ๋น: $0.10/์๊ฐ) |
ECR ์คํ ๋ฆฌ์ง | ์ฝ $3 | Docker ์ด๋ฏธ์ง ์ ์ฅ์ (ECR GB๋น ๊ณผ๊ธ) |
S3 (์ ์ ๋ฆฌ์์ค ์ ์ฅ) | ์ฝ $1~3 | ์ด๋ฏธ์ง, ๋ก๊ทธ ๋ฐฑ์ ์ฉ S3 ๋ฒํท (์ ์ฅ๋/ํธ๋ํฝ์ ๋ฐ๋ผ ๊ฐ๋ณ) |
VPC X 3 + NAT Gateway + Transit Gateway | ์ฝ $90 | Dev/Prod/Shared์ฉ VPC 3๊ฐ + Transit ์ฐ๊ฒฐ์ฉ ๊ธฐ๋ณธ ๋น์ฉ |
Elastic Load Balancer(ALB) X 2 | ์ฝ $30~40 | Public ALB 2๊ฐ (Dev/Prod์ฉ Ingress Controller ์๋จ ๋ฐฐ์น) |
EC2 GPU ์ธ์คํด์ค(AI) X 2 | ์ฝ $267 | g5g.2xlarge, FastAPI inferencing ์๋ฒ + AI ๋ชจ๋ธ |
NAT Gateway | ์ฝ $40 | Private Subnet์ ์ธํฐ๋ท ํต์ ์ฉ (์๊ฐ๋น + ํธ๋ํฝ๋น ์๊ธ) |
Transit Gateway | ์ฝ $50 | Dev VPC - Prod VPC - ์ธ๋ถ๋ง ์ฐ๋ ํธ๋ํฝ ๋ผ์ฐํ |
RDS(MySQL) X 2 | ์ฝ $200 | ์ด์์ฉ RDS (Multi-AZ ํ์ฑํ), Dev/Prod ๊ฐ 1๊ฐ |
๐ก ์์ ์ดํฉ (์): ์ฝ $790 ์์ค(์ฃผ 45์๊ฐ ์ด์ ๊ธฐ์ค)
๐ ๋ณธ ํ์ด์ง๋ 2025๋ 4์ 29์ผ์ ๋ง์ง๋ง์ผ๋ก ์ ๋ฐ์ดํธ๋์์ต๋๋ค.