
ASG는 EC2 용량을 자동으로 늘리고 줄이며(스케일링), 고가용성을 유지. 핵심은 Launch Template, Min/Max/Desired, Health Check, Scaling Policy 네 가지 축
Client → ALB/NLB → Target Group ↔ ASG(EC2들)
CPUUtilization = 50%, ALB RequestCountPerTarget = 100.Instance Refresh: 롤링 방식으로 Launch Template 변경분(AMI 패치, 커널 교체 등) 무중단 교체.
Mixed Instances Policy: 여러 Instance Type을 섞고 On-Demand/Spot 비율을 정의.
OnDemandBaseCapacity, OnDemandPercentageAboveBaseCapacity, Spot Allocation Strategy(capacity-optimized 권장).Capacity Rebalance(Spot): Spot 회수 신호 감지 시 미리 보충 → 중단 내성↑.
Lifecycle Hooks: Launching/Terminating 단계에서 초기화/드레인 스크립트 실행(예: ALB Deregistration Delay 이후 종료).
Warm Pools: 미리 예열된 인스턴스를 풀에 보관(Stopped/Running) → 급격한 스케일 아웃 지연 감소.
Scale-In Protection & Standby: 특정 인스턴스를 축소에서 보호하거나, Standby로 빼서 유지보수.
GroupDesiredCapacity, GroupInServiceInstances, GroupTotalInstances.CPUUtilization, RequestCountPerTarget, TargetResponseTime, SQS ApproximateNumberOfMessagesVisible.# (1) Launch Template 생성
aws ec2 create-launch-template \
--launch-template-name lt-web \
--launch-template-data '{
"ImageId":"ami-xxxxxxxx",
"InstanceType":"t3.medium",
"SecurityGroupIds":["sg-xxxx"],
"UserData":"'"$(base64 -w0 userdata.sh)"'"
}'
# (2) ASG 생성 (다중 AZ, TG 연결)
aws autoscaling create-auto-scaling-group \
--auto-scaling-group-name asg-web \
--launch-template LaunchTemplateName=lt-web,Version='$Latest' \
--min-size 2 --max-size 20 --desired-capacity 4 \
--vpc-zone-identifier "subnet-azA,subnet-azB" \
--target-group-arns arn:aws:elasticloadbalancing:...:targetgroup/tg-web/...
# (3) Target Tracking 정책 (CPU 50%)
aws autoscaling put-scaling-policy \
--auto-scaling-group-name asg-web \
--policy-name cpu50-tt \
--policy-type TargetTrackingScaling \
--target-tracking-configuration '{
"PredefinedMetricSpecification":{"PredefinedMetricType":"ASGAverageCPUUtilization"},
"TargetValue":50.0,
"DisableScaleIn":false
}'
# (4) Instance Refresh 시작 (롤링 교체)
aws autoscaling start-instance-refresh \
--auto-scaling-group-name asg-web \
--preferences MinHealthyPercentage=90,InstanceWarmup=120 \
--strategy Rolling
# (5) Mixed Instances (요약 설정 예)
aws autoscaling update-auto-scaling-group \
--auto-scaling-group-name asg-web \
--mixed-instances-policy '{
"LaunchTemplate":{
"LaunchTemplateSpecification":{"LaunchTemplateName":"lt-web","Version":"$Latest"},
"Overrides":[{"InstanceType":"t3.medium"},{"InstanceType":"t3.large"}]
},
"InstancesDistribution":{
"OnDemandBaseCapacity":2,
"OnDemandPercentageAboveBaseCapacity":50,
"SpotAllocationStrategy":"capacity-optimized"
}
}'
Resources:
LT:
Type: AWS::EC2::LaunchTemplate
Properties:
LaunchTemplateData:
ImageId: ami-xxxxxxxx
InstanceType: t3.medium
SecurityGroupIds: [sg-xxxx]
UserData: {{ base64 of userdata }}
ASG:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
VPCZoneIdentifier: [subnet-azA, subnet-azB]
MinSize: '2'
MaxSize: '20'
DesiredCapacity: '4'
LaunchTemplate:
LaunchTemplateName: !Ref LT
Version: $Latest
TargetGroupARNs: [arn:aws:elasticloadbalancing:...:targetgroup/tg-web/...]
HealthCheckType: ELB
HealthCheckGracePeriod: 300
CpuPolicy:
Type: AWS::AutoScaling::ScalingPolicy
Properties:
AutoScalingGroupName: !Ref ASG
PolicyType: TargetTrackingScaling
TargetTrackingConfiguration:
PredefinedMetricSpecification:
PredefinedMetricType: ASGAverageCPUUtilization
TargetValue: 50