EC2 Auto Scaling (시작 템플릿, 조정 정책, 스팟 섞기)
Auto Scaling 그룹의 구성 요소(시작 템플릿, 원하는 용량, 상태 확인), 대상 추적, 단계, 예약, 예측 조정 정책의 차이, 여러 유형과 스팟을 섞는 혼합 인스턴스 정책, 웜 풀, 수명 주기 후크, 인스턴스 새로 고침까지 실무 설정 위주로 정리합니다.
구성 요소
Auto Scaling 그룹(ASG)은 "이런 인스턴스를 이 서브넷들에 몇 대 유지하라" 는 약속입니다.
| 요소 | 뜻 |
|---|---|
| 시작 템플릿 | AMI, 인스턴스 유형, 보안 그룹, IAM 인스턴스 프로파일, 사용자 데이터, IMDS 설정. 버전 관리됨 |
| 최소, 원하는, 최대 용량 | 최소 아래로 줄지 않고 최대 위로 늘지 않음. 정책은 원하는 용량을 바꿈 |
| VPC 서브넷 | 보통 AZ 마다 하나씩 프라이빗 서브넷. ASG 가 AZ 사이 균형을 맞춤 |
| 상태 확인 | EC2 상태(하드웨어, OS) 기본. ELB 상태 확인을 켜면 대상 그룹에서 비정상인 인스턴스도 교체 |
| 조정 정책 | 지표나 일정에 따라 원하는 용량을 바꾸는 규칙 |
주의 시작 구성(launch configuration)은 오래된 방식이라 새 인스턴스 유형과 기능을 지원하지 않습니다. 새로 만들 때는 항상 시작 템플릿을 씁니다.
조정 정책 고르기
| 정책 | 동작 | 맞는 곳 |
|---|---|---|
| 대상 추적 (target tracking) | "평균 CPU 50% 유지" 처럼 목표값을 맞추도록 알아서 늘리고 줄임 | 대부분의 웹, API. 첫 선택 |
| 단계 조정 (step) | 경보 수준별로 몇 대씩 늘릴지 직접 정함 | 큐 길이처럼 목표값이 애매한 지표 |
| 예약 조정 (scheduled) | 정해진 시각에 용량을 바꿈 | 출근 시간, 정기 배치, 행사 |
| 예측 조정 (predictive) | 지난 14 일 패턴으로 다음 48 시간 부하를 예측해 미리 늘림 | 매일 반복되는 뚜렷한 패턴. 처음엔 예측만 하는 모드로 검증 |
대상 추적에는 CPU 외에 ALB 대상당 요청 수(ALBRequestCountPerTarget)를 많이 씁니다. CPU 보다 트래픽 변화에 빨리 반응하고 애플리케이션 특성을 덜 탑니다.
aws autoscaling put-scaling-policy \
--auto-scaling-group-name web-prod \
--policy-name req-per-target-800 \
--policy-type TargetTrackingScaling \
--target-tracking-configuration '{
"PredefinedMetricSpecification": {
"PredefinedMetricType": "ALBRequestCountPerTarget",
"ResourceLabel": "app/web-prod-alb/50dc6c495c0c9188/targetgroup/web-tg/943f017f100becff"
},
"TargetValue": 800,
"DisableScaleIn": false
}'인스턴스가 부팅해서 실제로 일을 받기까지 걸리는 시간을 기본 인스턴스 준비 시간(default instance warmup) 으로 그룹에 설정해 두면, 아직 준비 안 된 인스턴스의 지표 때문에 과하게 늘리는 일을 막습니다.
여러 유형과 스팟 섞기
한 유형만 쓰면 그 유형의 재고가 떨어질 때 늘릴 수 없습니다. 혼합 인스턴스 정책으로 여러 유형을 허용하고 온디맨드와 스팟 비율을 정합니다.
{
"LaunchTemplate": {
"LaunchTemplateSpecification": { "LaunchTemplateName": "web-arm64", "Version": "$Latest" },
"Overrides": [{
"InstanceRequirements": {
"VCpuCount": { "Min": 2, "Max": 4 },
"MemoryMiB": { "Min": 8192 },
"CpuManufacturers": ["amazon-web-services"],
"InstanceGenerations": ["current"]
}
}]
},
"InstancesDistribution": {
"OnDemandBaseCapacity": 2,
"OnDemandPercentageAboveBaseCapacity": 30,
"SpotAllocationStrategy": "price-capacity-optimized"
}
}InstanceRequirements(속성 기반 선택)는 "vCPU 2~4 개, 메모리 8 GiB 이상, Graviton" 처럼 조건만 주면 맞는 유형을 모두 후보로 씁니다. 새 세대가 나오면 자동으로 후보에 들어갑니다.- 스팟 할당 전략은
price-capacity-optimized가 권장값입니다. 중단 가능성이 낮은 풀 중에서 싼 것을 고릅니다. - 용량 재조정(Capacity Rebalancing) 을 켜면 스팟 중단 위험 신호가 왔을 때 미리 새 인스턴스를 띄우고 기존 것을 뺍니다.
- 기본 용량(
OnDemandBaseCapacity)은 온디맨드로 두고, 그 위만 스팟으로 채우면 스팟이 한꺼번에 사라져도 서비스가 죽지 않습니다.
웜 풀과 수명 주기 후크
부팅에 몇 분씩 걸리는 애플리케이션(큰 JVM, 모델 로딩)은 확장이 늦어서 순간 트래픽을 놓칩니다.
- 웜 풀(warm pool): 미리 초기화해 둔 인스턴스를 중지(Stopped) 상태로 보관했다가 확장할 때 바로 켭니다. 중지 상태에서는 EBS 요금만 냅니다.
- 수명 주기 후크: 인스턴스가 서비스에 들어가기 전(
autoscaling:EC2_INSTANCE_LAUNCHING)이나 빠지기 전(TERMINATING)에 멈춰 두고 스크립트를 돌립니다. 종료 전에 로그를 S3 로 내보내거나 연결을 정리(드레이닝)할 때 씁니다.
배포: 인스턴스 새로 고침
AMI 나 시작 템플릿을 바꾼 뒤 기존 인스턴스를 순서대로 교체하려면 인스턴스 새로 고침을 씁니다.
aws autoscaling start-instance-refresh --auto-scaling-group-name web-prod \
--preferences '{"MinHealthyPercentage": 90, "InstanceWarmup": 120, "SkipMatching": true, "AutoRollback": true}'MinHealthyPercentage 로 한 번에 바꾸는 비율을 조절하고, AutoRollback 을 켜면 실패할 때 이전 시작 템플릿으로 되돌립니다. 체크포인트를 두면 일부만 바꾼 뒤 멈춰서 지표를 보고 이어 갈 수 있습니다.
할당량과 비용
- ASG 자체는 무료이고 인스턴스, EBS, 데이터 전송 요금만 냅니다. 상세 모니터링(1 분 지표)을 켜면 CloudWatch 요금이 붙습니다.
- 리전당 ASG 수, 조정 정책 수에 기본 할당량이 있습니다. 대규모 조직은 Service Quotas 에서 확인합니다.
- 확장이 막히는 가장 흔한 이유는 ASG 가 아니라 EC2 vCPU 할당량과 서브넷 IP 부족입니다. /24 서브넷은 쓸 수 있는 IP 가 251 개라서 큰 그룹이나 EKS 노드가 금방 채웁니다.
증상, 원인, 해결
| 증상 | 원인 | 해결 |
|---|---|---|
| 인스턴스가 떴다가 바로 종료되기를 반복 | ELB 상태 확인 실패, 상태 확인 유예 시간이 부팅보다 짧음 | 대상 그룹 헬스 경로 확인, HealthCheckGracePeriod 늘림 |
| 원하는 용량을 올렸는데 늘지 않음 | vCPU 할당량, 용량 부족, 서브넷 IP 부족 | 활동 기록(describe-scaling-activities)의 상태 메시지 확인 |
| 트래픽이 줄었는데 안 줄어듦 | 축소 비활성, 최소 용량, 인스턴스 축소 보호 | 정책 설정과 ProtectedFromScaleIn 확인 |
| 한 AZ 에만 몰림 | 다른 AZ 의 용량 부족이나 서브넷 문제 | 여러 유형 허용, AZ 재조정 활동 확인 |