프로덕션 환경에서는 단일 서버로는 안정적인 서비스를 제공하기 어렵기 때문에 트래픽 분산과 자동 확장을 구현한다.
확장성(Scalability)
수직 확장(Vertical Scaling)
- 인스턴스의 크기를 늘림
- t3.micro → t3.large → m5.xlarge
장점:
- 구현이 간단
- 애플리케이션 수정 불필요
단점:
- 확장 한계 존재
- 다운타임 발생
- 단일 장애점
Before: [t3.micro - 1GB RAM]
After: [m5.xlarge - 16GB RAM]수평 확장(Horizontal Scaling)
- 인스턴스의 개수를 늘림
- 1대 → 3대 → 10대
장점:
- 무제한 확장 가능
- 고가용성 확보
- 장애 격리
단점:
- 복잡한 설계 필요
- 로드 밸런서 필요
- 상태 관리 고려
Before: [EC2]
After: [EC2] [EC2] [EC2] [EC2] [EC2]ELB (Elastic Load Balancer)
- AWS 관리형 로드 밸런서
- 트래픽을 여러 대상으로 분산
- 자동 확장 및 고가용성 제공
ELB의 주요 기능
1. 헬스 체크
Load Balancer
↓ /health 요청
┌─────────┬─────────┬─────────┐
│ EC2 ✅ │ EC2 ✅ │ EC2 ❌ │
│ 200 OK │ 200 OK │ 500 Error│
└─────────┴─────────┴─────────┘
↑ ↑
트래픽 전송 트래픽 차단2. SSL/TLS 종료
- HTTPS 복호화를 로드 밸런서에서 처리
- EC2 인스턴스의 부담 감소
- 중앙화된 인증서 관리
3. 고정 세션(Sticky Session)
- 동일 사용자의 요청을 같은 인스턴스로 전송
- 쿠키 기반 구현
- 상태 유지가 필요한 애플리케이션에 유용
4. 다중 AZ 배포
Internet
↓
[Load Balancer]
↓
┌────────────┬────────────┐
│ AZ-A │ AZ-C │
│ [EC2] │ [EC2] │
└────────────┴────────────┘ELB 타입 비교
1. Application Load Balancer (ALB) - Layer 7
특징:
- HTTP/HTTPS 트래픽 전용
- URL 경로 기반 라우팅
- 호스트 기반 라우팅
- 웹소켓, HTTP/2 지원
라우팅 규칙 예시:
example.com/api/* → API 서버 그룹
example.com/images/* → 이미지 서버 그룹
example.com/admin/* → 관리자 서버 그룹
api.example.com → API 서버 그룹
web.example.com → 웹 서버 그룹대상 그룹(Target Group):
- EC2 인스턴스
- ECS 작업
- Lambda 함수
- IP 주소
사용 사례:
- 마이크로서비스 아키텍처
- 컨테이너 기반 애플리케이션
- 서버리스 애플리케이션
# ALB 생성
aws elbv2 create-load-balancer \
--name my-alb \
--subnets subnet-12345678 subnet-87654321 \
--security-groups sg-12345678
# 대상 그룹 생성
aws elbv2 create-target-group \
--name my-targets \
--protocol HTTP \
--port 80 \
--vpc-id vpc-12345678 \
--health-check-path /health
# 리스너 생성
aws elbv2 create-listener \
--load-balancer-arn arn:aws:elasticloadbalancing:... \
--protocol HTTP \
--port 80 \
--default-actions Type=forward,TargetGroupArn=arn:...2. Network Load Balancer (NLB) - Layer 4
특징:
- TCP/UDP 트래픽 처리
- 초당 수백만 건의 요청 처리
- 매우 낮은 지연시간 (밀리초 미만)
- 고정 IP 지원 (Elastic IP 할당 가능)
성능:
- ALB: ~50,000 요청/초
- NLB: ~수백만 연결/초
사용 사례:
- 게임 서버
- IoT 애플리케이션
- 금융 거래 시스템
- 레거시 애플리케이션 (비HTTP)
# NLB 생성
aws elbv2 create-load-balancer \
--name my-nlb \
--type network \
--subnets subnet-12345678 subnet-876543213. Gateway Load Balancer (GWLB)
특징:
- Layer 3 (IP 패킷) 수준 작동
- 보안 어플라이언스 배포 및 확장
사용 사례:
- 방화벽
- 침입 탐지/방지 시스템
- 네트워크 모니터링
4. Classic Load Balancer (CLB) - 레거시
- 2009년 출시된 구세대 로드 밸런서
- 신규 사용 권장하지 않음
- ALB 또는 NLB로 마이그레이션 권장
Cross-Zone Load Balancing
비활성화 시
AZ-A: [ELB] → [EC2-1] [EC2-2]
↓
트래픽 50%
AZ-B: [ELB] → [EC2-3]
↓
트래픽 50%
결과: EC2-3에 과부하활성화 시
[ELB] → 모든 AZ의 모든 인스턴스로 균등 분산
↓
EC2-1: 33.3%
EC2-2: 33.3%
EC2-3: 33.3%기본 설정:
- ALB: 기본 활성화 (비용 무료)
- NLB: 기본 비활성화 (AZ 간 데이터 전송 비용 발생)
- CLB: 기본 비활성화
Auto Scaling Group (ASG)
- EC2 인스턴스를 자동으로 확장/축소
- 목표: 최소/최대 인스턴스 수 유지
- 비용 최적화 + 가용성 보장
ASG 주요 구성 요소
1. Launch Template (시작 템플릿)
yaml
Launch Template:
- AMI ID
- Instance Type
- Key Pair
- Security Groups
- User Data
- IAM Role
- EBS Volumes2. 크기 설정
Minimum Capacity: 2 (최소 인스턴스)
Desired Capacity: 4 (원하는 인스턴스)
Maximum Capacity: 10 (최대 인스턴스)3. 헬스 체크
- EC2 상태 체크 (기본)
- ELB 상태 체크 (권장)
- Unhealthy 인스턴스 자동 교체
ASG 생성
# 시작 템플릿 생성
aws ec2 create-launch-template \
--launch-template-name my-template \
--version-description "Version 1" \
--launch-template-data file://template.json
# ASG 생성
aws autoscaling create-auto-scaling-group \
--auto-scaling-group-name my-asg \
--launch-template LaunchTemplateName=my-template \
--min-size 2 \
--max-size 10 \
--desired-capacity 4 \
--vpc-zone-identifier "subnet-12345678,subnet-87654321" \
--health-check-type ELB \
--health-check-grace-period 300 \
--target-group-arns arn:aws:elasticloadbalancing:...확장 정책(Scaling Policies)
1. 대상 추적 확장(Target Tracking)
가장 간단하고 권장되는 방식
목표: 평균 CPU 사용률 50% 유지
CPU < 50% → 인스턴스 제거
CPU > 50% → 인스턴스 추가# 대상 추적 정책 생성
aws autoscaling put-scaling-policy \
--auto-scaling-group-name my-asg \
--policy-name target-tracking-cpu \
--policy-type TargetTrackingScaling \
--target-tracking-configuration '{
"PredefinedMetricSpecification": {
"PredefinedMetricType": "ASGAverageCPUUtilization"
},
"TargetValue": 50.0
}'추적 가능한 지표:
- CPU 사용률
- 네트워크 입출력
- ALB 요청 수
- 사용자 정의 CloudWatch 지표
2. 단계 확장(Step Scaling)
세밀한 제어가 필요할 때 사용
CPU 사용률 기준:
30-50%: 변화 없음
50-70%: +1 인스턴스
70-90%: +2 인스턴스
90%+: +3 인스턴스# CloudWatch 경보 생성
aws cloudwatch put-metric-alarm \
--alarm-name high-cpu \
--alarm-description "CPU above 70%" \
--metric-name CPUUtilization \
--namespace AWS/EC2 \
--statistic Average \
--period 300 \
--evaluation-periods 2 \
--threshold 70 \
--comparison-operator GreaterThanThreshold
# 단계 확장 정책 생성
aws autoscaling put-scaling-policy \
--auto-scaling-group-name my-asg \
--policy-name step-scaling-cpu \
--policy-type StepScaling \
--adjustment-type PercentChangeInCapacity \
--metric-aggregation-type Average \
--step-adjustments '[
{"MetricIntervalLowerBound": 0, "MetricIntervalUpperBound": 20, "ScalingAdjustment": 1},
{"MetricIntervalLowerBound": 20, "ScalingAdjustment": 2}
]'3. 단순 확장(Simple Scaling) - 레거시
- 한 번에 하나의 조정만 수행
- 쿨다운 기간 대기 필요
- 권장하지 않음 (Step Scaling 사용 권장)
4. 예약 확장(Scheduled Scaling)
예측 가능한 트래픽 패턴에 사용
# 평일 오전 9시에 확장
aws autoscaling put-scheduled-action \
--auto-scaling-group-name my-asg \
--scheduled-action-name morning-scale-up \
--recurrence "0 9 * * 1-5" \
--desired-capacity 10
# 평일 오후 6시에 축소
aws autoscaling put-scheduled-action \
--auto-scaling-group-name my-asg \
--scheduled-action-name evening-scale-down \
--recurrence "0 18 * * 1-5" \
--desired-capacity 45. 예측 확장(Predictive Scaling)
머신러닝으로 과거 패턴을 분석하여 미리 확장
과거 데이터 분석:
매주 월요일 오전 9시 트래픽 급증
→ 월요일 오전 8시 50분에 미리 확장확장 쿨다운(Scaling Cooldown)
- 확장 작업 후 대기 시간
- 새 인스턴스가 안정화될 시간 제공
- 기본값: 300초 (5분)
작동 방식
1. CPU 80% → 인스턴스 추가
2. 쿨다운 시작 (5분)
3. 5분 동안 추가 확장 작업 차단
4. 5분 후 다시 평가최적화
- 인스턴스가 빠르게 준비되면 쿨다운 시간 단축
- AMI에 애플리케이션 미리 포함
- User Data 스크립트 최적화
실전 아키텍처 패턴
패턴 1: 기본 웹 애플리케이션
Internet
↓
[Application Load Balancer]
↓
[Auto Scaling Group]
├── [EC2-1] AZ-A
├── [EC2-2] AZ-A
├── [EC2-3] AZ-C
└── [EC2-4] AZ-C
↓
[RDS Multi-AZ]설정:
- Minimum: 2 (각 AZ에 1개)
- Desired: 4
- Maximum: 10
- Target Tracking: CPU 50%
패턴 2: 마이크로서비스
Internet
↓
[ALB - Main]
↓
├─→ /api/users → [ALB - Users] → [ASG - User Service]
├─→ /api/orders → [ALB - Orders] → [ASG - Order Service]
└─→ /api/products → [ALB - Products] → [ASG - Product Service]패턴 3: 스팟 인스턴스 혼합
[Auto Scaling Group]
├── On-Demand: 2개 (기본 용량)
└── Spot: 0-8개 (확장 용량)
└── Instance Types:
- t3.medium (40%)
- t3a.medium (30%)
- t2.medium (30%)비용 절감:
- 스팟 인스턴스로 최대 90% 절감
- 다양한 인스턴스 타입으로 가용성 확보
# 혼합 인스턴스 정책
aws autoscaling create-auto-scaling-group \
--auto-scaling-group-name my-mixed-asg \
--mixed-instances-policy '{
"LaunchTemplate": {...},
"InstancesDistribution": {
"OnDemandBaseCapacity": 2,
"OnDemandPercentageAboveBaseCapacity": 0,
"SpotAllocationStrategy": "capacity-optimized"
},
"Overrides": [
{"InstanceType": "t3.medium"},
{"InstanceType": "t3a.medium"},
{"InstanceType": "t2.medium"}
]
}'연결 드레이닝(Connection Draining)
- 인스턴스 제거 시 진행 중인 요청 완료 대기
- 새 요청은 차단하고 기존 요청만 처리
- 기본값: 300초
1. ASG가 인스턴스 제거 결정
2. ELB가 새 요청 차단
3. 기존 요청 처리 완료 대기 (최대 300초)
4. 인스턴스 종료모니터링 및 알림
CloudWatch 대시보드 구성
주요 지표:
GroupDesiredCapacity: 원하는 인스턴스 수 - GroupInServiceInstances: 서비스 중인 인스턴스 - GroupMinSize / GroupMaxSize: 최소/최대 크기 - TargetResponseTime: 응답 시간 - UnHealthyHostCount: 비정상 호스트 수
SNS 알림 설정
# ASG 알림 설정
aws autoscaling put-notification-configuration \
--auto-scaling-group-name my-asg \
--topic-arn arn:aws:sns:region:account-id:my-topic \
--notification-types \
"autoscaling:EC2_INSTANCE_LAUNCH" \
"autoscaling:EC2_INSTANCE_TERMINATE" \
"autoscaling:EC2_INSTANCE_LAUNCH_ERROR" \
"autoscaling:EC2_INSTANCE_TERMINATE_ERROR"비용 최적화 전략
1. 적절한 인스턴스 타입 선택
# AWS Compute Optimizer로 권장 사항 확인
aws compute-optimizer get-auto-scaling-group-recommendations \
--auto-scaling-group-arns arn:aws:autoscaling:...2. 스팟 인스턴스 활용
- 개발/테스트 환경: 100% 스팟
- 프로덕션: 온디맨드 + 스팟 혼합
3. 예약 인스턴스
- 최소 용량은 예약 인스턴스로 커버
- 확장 용량은 온디맨드/스팟
4. 스케줄링 최적화
근무 시간 (9시-18시): Desired 10
야간 (18시-9시): Desired 2
주말: Desired 2트러블슈팅
문제 1: 인스턴스가 계속 종료됨
원인:
- 헬스 체크 실패
- 애플리케이션 시작 시간 부족
해결:
# 헬스 체크 유예 기간 증가
aws autoscaling update-auto-scaling-group \
--auto-scaling-group-name my-asg \
--health-check-grace-period 600문제 2: 확장이 느림
원인:
- 긴 User Data 스크립트
- 큰 AMI 크기
해결:
- 애플리케이션을 AMI에 미리 포함
- 스크립트 최적화
- 워밍업 준비 (Warm Pool 사용)
문제 3: 비용 증가
원인:
- 축소 정책 부재
- 쿨다운 시간 과다
해결:
- 스케일 인(축소) 정책 추가
- CloudWatch로 사용률 모니터링
- 비정상 확장 패턴 분석
ELB와 Auto Scaling은 현대적인 클라우드 아키텍처의 필수 요소
- ALB로 Layer 7 트래픽 라우팅
- NLB로 고성능 Layer 4 처리
- ASG로 자동 확장 및 고가용성 확보
- Target Tracking이 가장 간단하고 효과적
- 스팟 인스턴스로 비용 최적화
Share article