37장. Auto Scaling Group과 스케일링 정책
이 장에서 말하고자 하는 것
이제 우리는 트래픽을 ALB가 받아
여러 서버로 분산하는 모양까지 그렸다.
그런데 다음 질문이 남는다.
서버를 미리 몇 대 띄워둘까?
트래픽이 늘면 누가 더 만들어줄까?
이 질문에 답하는 도구가
Auto Scaling Group (ASG)
이다.
ASG는 EC2 인스턴스를 자동으로 늘리고 줄인다.
컨테이너 환경의 ECS Service Auto Scaling도
같은 사고방식 위에 있다.
1. 왜 자동 스케일링이 필요한가
미리 큰 서버 한 대를 띄우면
평소: 5% 사용 → 자원 낭비
피크: 100% → 더 큰 게 필요
미리 여러 대를 띄우면
평소에도 여러 대가 켜져 있음 → 비용
해결은 단순하다.
트래픽에 맞춰 자동으로 서버 수를 바꾼다
이게 클라우드의 핵심 강점 중 하나다.
2. ASG의 기본 구성
ASG는 세 가지 숫자로 운영된다.
최소 (Minimum) : 항상 이만큼은 떠 있어야 한다
원하는 (Desired): 지금 이만큼 떠 있어야 한다
최대 (Maximum) : 이 이상으로는 안 늘어난다
Min 2 Desired 4 Max 10
- 평소: 4대 운영
- 트래픽 폭증: 최대 10대까지 자동 증가
- 트래픽 줄면: 2대까지 자동 축소
3. ASG는 무엇을 보고 결정하는가
ASG는 CloudWatch 지표 를 본다.
- CPU 사용률
- 네트워크 입출력
- ALB로 받는 요청 수
- 커스텀 지표
이 지표가 임계를 넘으면 서버를 늘리거나 줄인다.
4. 스케일링 정책의 세 가지 방식
방식 1. Target Tracking — 가장 단순하고 권장
CPU 사용률 평균 50%를 유지해라
ASG가 알아서 늘리고 줄인다.
운영의 90%는 이걸로 해결된다.
방식 2. Step Scaling — 단계별로
CPU 70% 넘으면 +1
CPU 90% 넘으면 +3
CPU 30% 미만이면 -1
세밀한 제어가 필요할 때.
방식 3. Scheduled — 시간 기반
매일 오전 9시에 desired = 10
매일 오후 11시에 desired = 2
트래픽 패턴이 시간에 명확히 묶일 때 (예: 출근 시간).
5. 헬스 체크와의 협력
ASG는 ALB의 헬스 체크와 연동된다.
1. ASG가 새 EC2를 띄운다
2. ALB의 타깃 그룹에 자동 등록된다
3. 헬스 체크 통과 → 트래픽 받기 시작
4. 만약 실패 → ASG가 그 EC2를 죽이고 새로 띄운다
ASG는 단순히 수만 맞추는 게 아니라
죽은 인스턴스를 자동 교체하는 자가 치유 메커니즘이기도 하다
6. ECS에서의 자동 스케일링
ECS에서는 두 단계의 스케일링이 있다.
1. 서비스 안의 태스크 수 자동 조정 (Service Auto Scaling)
2. (EC2 기반일 때만) 클러스터의 EC2 인스턴스 수 자동 조정 (ASG)
Fargate를 쓰면 2번이 사라진다. 태스크 수만 조정하면 끝난다.
이 책의 척추 구조는 Fargate를 기본으로 가정하므로
ASG보다는 Service Auto Scaling을 더 자주 만지게 된다.
다만 사고방식은 같다.
7. 우리 서비스에서
척추 그림에서 자동 스케일링이 동작하는 위치다.
[ALB]
↓
[ECS Service: orders] ← Service Auto Scaling
├─ task 1
├─ task 2
└─ (트래픽 늘면 자동으로 task 3, 4 …)
- CPU > 60% → 태스크 +1
- 한 시간간 CPU < 30% → 태스크 -1
- 최소 2개, 최대 10개
이 규칙 하나로
“낮에는 자동으로 커지고 밤에는 자동으로 줄어드는 서비스”
가 된다.
8. 직접 확인해보기 — CLI
ASG 보기
aws autoscaling describe-auto-scaling-groups
원하는 인스턴스 수 변경
aws autoscaling set-desired-capacity \
--auto-scaling-group-name my-asg \
--desired-capacity 5
ECS Service Auto Scaling 등록
aws application-autoscaling register-scalable-target \
--service-namespace ecs \
--resource-id service/cluster-name/service-name \
--scalable-dimension ecs:service:DesiredCount \
--min-capacity 2 \
--max-capacity 10
9. 코드로는 이렇게 생겼다 — Terraform
ECS Service Auto Scaling을 Target Tracking으로 거는 모양이다.
resource "aws_appautoscaling_target" "ecs" {
service_namespace = "ecs"
resource_id = "service/${aws_ecs_cluster.main.name}/${aws_ecs_service.orders.name}"
scalable_dimension = "ecs:service:DesiredCount"
min_capacity = 2
max_capacity = 10
}
resource "aws_appautoscaling_policy" "ecs_cpu" {
name = "cpu-target-50"
service_namespace = "ecs"
resource_id = aws_appautoscaling_target.ecs.resource_id
scalable_dimension = aws_appautoscaling_target.ecs.scalable_dimension
policy_type = "TargetTrackingScaling"
target_tracking_scaling_policy_configuration {
target_value = 50.0
predefined_metric_specification {
predefined_metric_type = "ECSServiceAverageCPUUtilization"
}
}
}
이걸 띄우면
“CPU 평균 50% 부근을 유지해라”
라는 규칙이 적용된다.
10. 이렇게 쓰면 망한다 — 안티패턴
안티패턴 1. 최소를 1로 둔다
Min 1
한 대가 죽는 순간 서비스가 0대가 된다.
운영 서비스는 최소 2대로 시작한다.
안티패턴 2. 최대를 너무 크게 둔다
Max 100
비용 사고가 난다.
악성 트래픽 한 번에 수십 ~ 수백 인스턴스가 떠서 청구서가 폭발한다.
Max는 “정상 트래픽 + 여유분” 정도로 제한한다
그 위로는 사람이 의식적으로 늘려야 한다
안티패턴 3. 헬스 체크 실패를 무시한 채 스케일링한다
ASG가 자꾸 인스턴스를 새로 띄우는데도
헬스 체크가 계속 실패하면 새 인스턴스도 계속 죽는다.
“왜 ASG가 끝없이 인스턴스를 만들고 죽이나” 면
스케일링 문제가 아니라 헬스 체크 문제다
안티패턴 4. Sticky Session을 켜고 자동 스케일링도 켠다
신규 인스턴스가 들어와도 기존 사용자는 계속 옛 인스턴스로 간다.
새 인스턴스는 한가하고 옛 인스턴스만 죽도록 바쁘다.
자동 스케일링과 sticky는 본질적으로 안 어울린다
한쪽을 선택하면 다른 쪽을 양보한다
11. 한 줄로 정리
Auto Scaling은 트래픽에 맞춰 서버 수를 자동으로 조정하면서
죽은 인스턴스까지 자동 교체하는 자가 치유 메커니즘이다
12. 이 장의 핵심 정리
- ASG는 Min · Desired · Max 세 숫자로 인스턴스 수를 관리한다.
- Target Tracking이 가장 단순하고 권장되는 정책이다.
- ALB 헬스 체크와 ASG는 함께 동작해 자가 치유를 이룬다.
- ECS에서는 Service Auto Scaling이 비슷한 역할을 한다.
- Fargate에서는 클러스터 ASG 자체가 사라지고 태스크 수만 조정한다.
- Max는 비용 사고를 막기 위해 의식적으로 제한한다.