ЁЯПл The SchoolтА║ЁЯЦея╕П EC2тА║ЁЯСп рдзрдбрд╛ 09 тАФ Auto Scaling: рджрд┐рд╡рд╕рднрд░ рдбреЗрд╕реНрдХрдЪреА рдпреЛрдЧреНрдп рд╕рдВрдЦреНрдпрд╛
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯСп рдзрдбрд╛ 09 тАФ Auto Scaling: рджрд┐рд╡рд╕рднрд░ рдбреЗрд╕реНрдХрдЪреА рдпреЛрдЧреНрдп рд╕рдВрдЦреНрдпрд╛

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 09 ┬╖ рдорд╛рдЧреАрд▓: lesson-08-pricing ┬╖ рдкреБрдвреАрд▓: lesson-10-load-balancing


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбреЗ 01тАУ08, рдЖрдгрд┐ Auto Scaling group (ASG): min, max рдЖрдгрд┐ desired рдбреЗрд╕реНрдХ, рд╕рд░рд╛рд╕рд░реА CPU рд╡рд░ target tracking, warm-up, рд╣рд│реВ рдЖрдгрд┐ рдХрд╛рд│рдЬреАрдкреВрд░реНрд╡рдХ scale-in, рдЖрдгрд┐ health-check replacement тАФ рд╣реЗ рд╕рдЧрд│реЗ ec2/fleet.py рдордзреАрд▓ asg() рдорд┐рдирд┐рдЯрд╛рдорд┐рдирд┐рдЯрд╛рдиреЗ simulate рдХрд░рддреЗ.

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рдЕрднреНрдпрд╛рд╕рд┐рдХреЗрдд рдПрдХ рдХрд╛рд│рдЬреАрд╡рд╛рд╣рдХ ЁЯСп рдЖрд╣реЗ, рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ clipboard рд╡рд░ рддреАрди рдЖрдХрдбреЗ рдЖрд╣реЗрдд: рдХрдзреАрд╣реА 2 рдкреЗрдХреНрд╖рд╛ рдХрдореА рдбреЗрд╕реНрдХ рдирд╛рд╣реАрдд, рдХрдзреАрд╣реА 6 рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдирд╛рд╣реАрдд, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╕реНрдХ рд╕рд╛рдзрд╛рд░рдг рдирд┐рдореНрдорд╛ рд╡реНрдпрд╕реНрдд рдареЗрд╡рд╛ (50%).

рдЧрд░реНрджреА рдЖрд▓реА рдЖрдгрд┐ рдбреЗрд╕реНрдХ 80% рд╡реНрдпрд╕реНрдд рдЭрд╛рд▓реЗ рдХреА рдХрд╛рд│рдЬреАрд╡рд╛рд╣рдХ recipe card (рдзрдбрд╛ 03) рд╡рд░реВрди рдЖрдгрдЦреА рдбреЗрд╕реНрдХ рдЖрдгрддреЛ. рдирд╡реНрдпрд╛ рдбреЗрд╕реНрдХрдирд╛ рдореЛрдЬрдгреАрдд рдпреЗрдгреНрдпрд╛рдЖрдзреА рддрдпрд╛рд░ рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА (warm-up) рджреЛрди-рддреАрди рдорд┐рдирд┐рдЯреЗ рд▓рд╛рдЧрддрд╛рдд тАФ рдореНрд╣рдгреВрди рдШрд╛рдмрд░реВрди рдбреЗрд╕реНрдХрдорд╛рдЧреВрди рдбреЗрд╕реНрдХ рдорд╛рдЧрд╡рдгреНрдпрд╛рдРрд╡рдЬреА рдХрд╛рд│рдЬреАрд╡рд╛рд╣рдХ рдкреБрдиреНрд╣рд╛ рдирд┐рд░реНрдгрдп рдШреЗрдгреНрдпрд╛рдкреВрд░реНрд╡реА рддреНрдпрд╛рдВрдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рддреЛ.

рдЧрд░реНрджреА рдЧреЗрд▓реА рдХреА рдХрд╛рд│рдЬреАрд╡рд╛рд╣рдХ рдбреЗрд╕реНрдХ рдПрдХреЗрдХ рдХрд░реВрди, рд╣рд│реВрд╣рд│реВ рдХрд╛рдврддреЛ, рдХрд╛рд░рдг рдЦреВрдк рдШрд╛рдИрдиреЗ рдХрд╛рдврд▓реЗ рддрд░ рд░рд╛рдВрдЧ рдкреБрдиреНрд╣рд╛ рд▓рд╛рдЧрддреЗ.

рдЖрдгрд┐ рдПрдЦрд╛рджрд╛ рдбреЗрд╕реНрдХ рдореЛрдбрд▓рд╛ рддрд░ рдХрд╛рд│рдЬреАрд╡рд╛рд╣рдХ рддреЛ рджреБрд░реБрд╕реНрдд рдХрд░рдд рдирд╛рд╣реА: рддреЛ рдмрд╛рд╣реЗрд░ рдиреЗрд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ recipe card рд╡рд░реВрди рдмрдирд╡рд▓реЗрд▓рд╛ рдирд╡рд╛ рдбреЗрд╕реНрдХ рддреНрдпрд╛рдЪреА рдЬрд╛рдЧрд╛ рдШреЗрддреЛ.

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart LR
    lt["ЁЯУЗ launch template"]
    asg["ЁЯСп Auto Scaling group<br/>min 2 ┬╖ max 6 ┬╖ target 50% CPU"]
    cw["ЁЯУИ average CPU of serving desks"]
    out["ЁЯУИ CPU 80% тЖТ launch 2<br/>warm up 2 min before they count"]
    inn["ЁЯУЙ CPU 33% тЖТ remove ONE desk<br/>then wait тАФ slowly, on purpose"]
    heal["ЁЯТе a desk fails its health check<br/>тЖТ terminated, a fresh one launches"]
    lt --> asg
    cw -->|"1 above target"| out --> asg
    cw -->|"2 below target"| inn --> asg
    heal -->|"3 replace, never repair"| asg
    azs["ЁЯПв desks spread over AZ-a, AZ-b, AZ-c"]
    asg --> azs

ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/ec2/lesson-diagrams.html#l09

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

рдХрд╛рд░рдг peak рд╕рд╛рдареА рдЖрдХрд╛рд░рд▓реЗрд▓рд╛ fleet рд░рд╛рддреНрд░рднрд░ рдкреИрд╕реЗ рд╡рд╛рдпрд╛ рдШрд╛рд▓рд╡рддреЛ, рдЖрдгрд┐ рд╕рд░рд╛рд╕рд░реАрд╕рд╛рдареА рдЖрдХрд╛рд░рд▓реЗрд▓рд╛ fleet рджреБрдкрд╛рд░рдЪреНрдпрд╛ рдЬреЗрд╡рдгрд╛рдЪреНрдпрд╛ рд╡реЗрд│реА рдХреЛрд╕рд│рддреЛ. ASG рдбреЗрд╕реНрдХрдЪреА рд╕рдВрдЦреНрдпрд╛ рдорд╛рдЧрдгреАрдорд╛рдЧреЗ рдЪрд╛рд▓рд╛рдпрд▓рд╛ рд▓рд╛рд╡рддреЛ тАФ рдЖрдгрд┐ рддрд┐рддрдХреЗрдЪ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдореНрд╣рдгрдЬреЗ, рдХреЛрдгрд╛рд▓рд╛рд╣реА page рди рдХрд░рддрд╛ рдореЛрдбрд▓реЗрд▓реЗ рдбреЗрд╕реНрдХ рдирд╛рд╣реАрд╕реЗ рдХрд░рддреЛ.

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

ec2/fleet.py рдордзреАрд▓ asg(load, target, min_size, max_size, capacity, warmup, fail_at, scale_in_cooldown) рджрд░ рдорд┐рдирд┐рдЯрд╛рдЪреА рдорд╛рдЧрдгреА рдШреЗрддреЗ (рдПрдХ рдбреЗрд╕реНрдХ 100 units рд╕реЗрд╡рд╛ рджреЗрддреЛ), рдлрдХреНрдд рд╕реЗрд╡рд╛ рджреЗрдгрд╛рд▒реНрдпрд╛ рдбреЗрд╕реНрдХрд╡рд░ CPU рдореЛрдЬрддреЗ, min рдЖрдгрд┐ max рдЪреНрдпрд╛ рдЖрдд desired рд▓рд╛ ceil(serving ├Ч CPU / target) рдареЗрд╡рддреЗ, warm up рд╣реЛрдгрд╛рд░реЗ рдбреЗрд╕реНрдХ launch рдХрд░рддреЗ, рдерд╛рдВрдмрдд рдерд╛рдВрдмрдд рдПрдХреЗрдХ рдбреЗрд╕реНрдХ рдХрд╛рдврддреЗ, рдЖрдгрд┐ рдирд┐рд╡рдбрд▓реЗрд▓реНрдпрд╛ рдорд┐рдирд┐рдЯрд╛рд▓рд╛ рдПрдЦрд╛рджрд╛ рдбреЗрд╕реНрдХ рдирд╛рдкрд╛рд╕ рдХрд░реВ рд╢рдХрддреЗ. ec2/demo.py рдордзреАрд▓ scaling() 15 рдорд┐рдирд┐рдЯрд╛рдВрдЪреА рд╕рдХрд╛рд│ рдЪрд╛рд▓рд╡рддреЗ, рдЬреНрдпрд╛рдд рдорд┐рдирд┐рдЯ 9 рд▓рд╛ рдПрдХ рдмрд┐рдШрд╛рдб рд╣реЛрддреЛ. Test L09 рддрдкрд╛рд╕рддреЗ рдХреА group рдХрдзреАрд╣реА 2тАУ6 рдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рдЬрд╛рдд рдирд╛рд╣реА.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

python3 ec2/demo.py scaling
python3 - <<'EOF'
import sys; sys.path.insert(0, "ec2"); import fleet
# a lunchtime rush, with a higher target (70%) and a slower warm-up (3 min)
rush = [100, 100, 250, 400, 400, 400, 150, 100, 100, 100, 100, 100]
for r in fleet.asg(rush, target=70, warmup=3):
    print(f"min {r['minute']:>2} demand {r['demand']:>3} ┬╖ desks {r['desks']} ({r['serving']} serving) ┬╖ CPU {r['cpu']:>3}%  {r['note']}")
EOF

рдЦрд▒реНрдпрд╛ account рд╡рд░ (AWS credentials, рдзрдбрд╛ 03 рдордзрд▓рд╛ school-web launch template рдЖрдгрд┐ рддреБрдордЪреЗ рд╕реНрд╡рддрдГрдЪреЗ subnet IDs рд▓рд╛рдЧрддрд╛рдд; instances рдЪрд╛рд▓реВ рдЕрд╕реЗрдкрд░реНрдпрдВрдд рдмрд┐рд▓ рд▓рд╛рдЧрддреЗ тАФ рдХрд╛рдо рдЭрд╛рд▓реНрдпрд╛рд╡рд░ min, max рдЖрдгрд┐ desired 0 рдХрд░рд╛, рдХрд┐рдВрд╡рд╛ group delete рдХрд░рд╛):

aws autoscaling create-auto-scaling-group --auto-scaling-group-name school-web \
    --launch-template 'LaunchTemplateName=school-web,Version=$Latest' \
    --min-size 2 --max-size 6 --desired-capacity 2 --default-instance-warmup 120 \
    --vpc-zone-identifier "subnet-0aaa1111,subnet-0bbb2222,subnet-0ccc3333"
aws autoscaling put-scaling-policy --auto-scaling-group-name school-web \
    --policy-name cpu-50 --policy-type TargetTrackingScaling \
    --target-tracking-configuration '{"PredefinedMetricSpecification":{"PredefinedMetricType":"ASGAverageCPUUtilization"},"TargetValue":50.0}'
aws autoscaling describe-scaling-activities --auto-scaling-group-name school-web --max-items 5
aws autoscaling delete-auto-scaling-group --auto-scaling-group-name school-web --force-delete

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

scaling рдордзреНрдпреЗ рдорд┐рдирд┐рдЯ 3 рд▓рд╛ desks 4 (2 serving) ┬╖ CPU 80% ЁЯУИ CPU 80% > target 50% тЖТ launch 2 (warming up 2 min) рджрд┐рд╕рддреЗ, рдорд┐рдирд┐рдЯ 5 рд▓рд╛ рдЖрдгрдЦреА 2 launch рд╣реЛрдКрди рдХрдорд╛рд▓ 6 рдЧрд╛рдард▓реЗ рдЬрд╛рддреЗ, рдорд┐рдирд┐рдЯ 7 рд▓рд╛ desks 6 (6 serving) ┬╖ CPU 50%, рдорд┐рдирд┐рдЯ 8 рд▓рд╛ ЁЯУЙ quiet тЖТ scale in ONE desk, рдорд┐рдирд┐рдЯ 9 рд▓рд╛ ЁЯТе a desk fails its health check тЖТ terminated; a fresh one launches and warms up (5 рдбреЗрд╕реНрдХ, 4 рд╕реЗрд╡рд╛ рджреЗрдгрд╛рд░реЗ), рдЖрдгрд┐ рдорд┐рдирд┐рдЯ 11 рд╡ 14 рд▓рд╛ рд╣рд│реВ scale-in рд╣реЛрдКрди desks 3 (3 serving) рдкрд░реНрдпрдВрдд рдпреЗрддреЗ. рддреБрдордЪреА рдЧрд░реНрджреА: рдорд┐рдирд┐рдЯ 3 рд▓рд╛ рдлрдХреНрдд 1 рдбреЗрд╕реНрдХ launch рд╣реЛрддреЛ (CPU 100% рд╡рд░ рдерд╛рдВрдмрддреЛ, рддреНрдпрд╛рдореБрд│реЗ 250 рдЪреА рдорд╛рдЧрдгреА рдХрдореА рджрд╛рдЦрд╡рддреЛ), рдорд┐рдирд┐рдЯ 4тАУ5 рддреЛ warm up рд╣реЛрдгреНрдпрд╛рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рддрд╛рдд, рдорд┐рдирд┐рдЯ 6 рд▓рд╛ рдЖрдгрдЦреА 2 launch рд╣реЛрддрд╛рдд (desks 5 (3 serving)), рдЖрдгрд┐ scale-in рдорд┐рдирд┐рдЯ 9 рд╡ 12 рд▓рд╛ рдПрдХреЗрдХ рдбреЗрд╕реНрдХ рдХрд░реВрди рд╣реЛрддреЛ.

ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ

рддреБрдореНрд╣реА fleet рдорд┐рдирд┐рдЯрд╛рдорд┐рдирд┐рдЯрд╛рдиреЗ рд╕рдордЬреВрди рдШреЗрдК рд╢рдХрддрд╛: рддреЛ рдЙрдбреНрдпрд╛ рдорд╛рд░рдд рдХрд╛ рд╡рд╛рдврддреЛ, warm-up рдЪреА рд╡рд╛рдЯ рдХрд╛ рдкрд╛рд╣рддреЛ, рд╣рд│реВрд╣рд│реВ рдХрд╛ рд▓рд╣рд╛рди рд╣реЛрддреЛ, рдЖрдгрд┐ рдореЛрдбрд▓реЗрд▓рд╛ рдбреЗрд╕реНрдХ рдХреЛрдгреАрд╣реА рд╣рд╛рдд рди рд▓рд╛рд╡рддрд╛ рдХрд╕рд╛ рдмрджрд▓рд▓рд╛ рдЬрд╛рддреЛ.

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдЬрд╡рд│рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ EC2 web tier рдореНрд╣рдгрдЬреЗ load balancer рдорд╛рдЧреЗ рддреАрди AZs рдордзреНрдпреЗ рдкрд╕рд░рд▓реЗрд▓рд╛ ASG, target tracking рдЖрдгрд┐ ELB health checks рд╕рд╣. рддреНрдпрд╛рдореБрд│реЗ "рдкрд╣рд╛рдЯреЗ 3 рд╡рд╛рдЬрддрд╛ server рдореЗрд▓рд╛" рд╣рд╛ рдлреЛрди рдХреЙрд▓ рди рд░рд╛рд╣рддрд╛ activity history рдордзрд▓реА рдПрдХ рдУрд│ рдмрдирддреЛ.

тПня╕П рдкреБрдвреЗ

рд╕рд╣рд╛ рдбреЗрд╕реНрдХ, рдкрд╛рд╣реБрдгреНрдпрд╛рдВрд╕рд╛рдареА рдПрдХрдЪ рдкрддреНрддрд╛. Load balancing: рдПрдХ reception, рдЖрдгрд┐ рдлрдХреНрдд рдирд┐рд░реЛрдЧреА рдбреЗрд╕реНрдХрдирд╛рдЪ рдкрд╛рд╣реБрдгреЗ рдорд┐рд│рддрд╛рдд.

git checkout lesson-10-load-balancing

ЁЯСп Lesson 09 тАФ Auto Scaling: the right number of desks, all day

ЁЯУН You are here: Lesson 09 of 12 ┬╖ Previous: lesson-08-pricing ┬╖ Next: lesson-10-load-balancing


ЁЯУж What's in this branch

Lessons 01тАУ08, plus the Auto Scaling group (ASG): min, max and desired desks, target tracking on average CPU, warm-up, slow and careful scale-in, and health-check replacement тАФ simulated minute by minute by asg() in ec2/fleet.py.

ЁЯзТ Explain like I'm 5

The study hall has a caretaker ЁЯСп with three numbers on a clipboard: never fewer than 2 desks, never more than 6, and keep each desk about half busy (50%).

When a crowd arrives and the desks are 80% busy, the caretaker wheels in more desks from the recipe card (lesson 03). New desks need a couple of minutes to be set up (warm-up) before they count тАФ so the caretaker waits for them before deciding again, instead of ordering desk after desk in a panic.

When the crowd leaves, the caretaker removes desks one at a time, slowly, because taking them away too fast just brings the queue back.

And if a desk breaks, the caretaker does not repair it: it is carried out and a fresh one from the recipe card takes its place.

ЁЯЧ║я╕П Diagram

flowchart LR
    lt["ЁЯУЗ launch template"]
    asg["ЁЯСп Auto Scaling group<br/>min 2 ┬╖ max 6 ┬╖ target 50% CPU"]
    cw["ЁЯУИ average CPU of serving desks"]
    out["ЁЯУИ CPU 80% тЖТ launch 2<br/>warm up 2 min before they count"]
    inn["ЁЯУЙ CPU 33% тЖТ remove ONE desk<br/>then wait тАФ slowly, on purpose"]
    heal["ЁЯТе a desk fails its health check<br/>тЖТ terminated, a fresh one launches"]
    lt --> asg
    cw -->|"1 above target"| out --> asg
    cw -->|"2 below target"| inn --> asg
    heal -->|"3 replace, never repair"| asg
    azs["ЁЯПв desks spread over AZ-a, AZ-b, AZ-c"]
    asg --> azs

ЁЯЧ║я╕П Drawn version + a lab: https://school-edh.pages.dev/ec2/lesson-diagrams.html#l09

тЭУ What

ЁЯдФ Why

Because a fleet sized for the peak wastes money all night, and a fleet sized for the average falls over at lunchtime. An ASG makes the number of desks follow the demand тАФ and, just as important, it makes broken desks disappear without anyone being paged.

ЁЯФз How (in this repo)

asg(load, target, min_size, max_size, capacity, warmup, fail_at, scale_in_cooldown) in ec2/fleet.py takes demand per minute (one desk serves 100 units), computes CPU over the serving desks only, sets desired to ceil(serving ├Ч CPU / target) within min and max, launches desks that warm up, removes one desk at a time with a wait, and can fail a desk at a chosen minute. scaling() in ec2/demo.py runs a 15-minute morning with a failure at minute 9. Test L09 checks the group never leaves 2тАУ6.

ЁЯзк Try it

python3 ec2/demo.py scaling
python3 - <<'EOF'
import sys; sys.path.insert(0, "ec2"); import fleet
# a lunchtime rush, with a higher target (70%) and a slower warm-up (3 min)
rush = [100, 100, 250, 400, 400, 400, 150, 100, 100, 100, 100, 100]
for r in fleet.asg(rush, target=70, warmup=3):
    print(f"min {r['minute']:>2} demand {r['demand']:>3} ┬╖ desks {r['desks']} ({r['serving']} serving) ┬╖ CPU {r['cpu']:>3}%  {r['note']}")
EOF

On a real account (needs AWS credentials, the school-web launch template from lesson 03 and your own subnet IDs; instances bill while they run тАФ set min, max and desired to 0, or delete the group, when you are done):

aws autoscaling create-auto-scaling-group --auto-scaling-group-name school-web \
    --launch-template 'LaunchTemplateName=school-web,Version=$Latest' \
    --min-size 2 --max-size 6 --desired-capacity 2 --default-instance-warmup 120 \
    --vpc-zone-identifier "subnet-0aaa1111,subnet-0bbb2222,subnet-0ccc3333"
aws autoscaling put-scaling-policy --auto-scaling-group-name school-web \
    --policy-name cpu-50 --policy-type TargetTrackingScaling \
    --target-tracking-configuration '{"PredefinedMetricSpecification":{"PredefinedMetricType":"ASGAverageCPUUtilization"},"TargetValue":50.0}'
aws autoscaling describe-scaling-activities --auto-scaling-group-name school-web --max-items 5
aws autoscaling delete-auto-scaling-group --auto-scaling-group-name school-web --force-delete

тЬЕ Verify тАФ what you should see

scaling shows minute 3 desks 4 (2 serving) ┬╖ CPU 80% ЁЯУИ CPU 80% > target 50% тЖТ launch 2 (warming up 2 min), minute 5 launching 2 more to the max of 6, minute 7 desks 6 (6 serving) ┬╖ CPU 50%, minute 8 ЁЯУЙ quiet тЖТ scale in ONE desk, minute 9 ЁЯТе a desk fails its health check тЖТ terminated; a fresh one launches and warms up (5 desks, 4 serving), and slow scale-in at minutes 11 and 14 down to desks 3 (3 serving). Your rush: minute 3 launches only 1 desk (CPU is capped at 100%, so it under-reports a demand of 250), minutes 4тАУ5 wait for it to warm up, minute 6 launches 2 more (desks 5 (3 serving)), and scale-in comes one desk at a time at minutes 9 and 12.

ЁЯПБ What you just proved

You can follow a fleet minute by minute: why it grows in jumps, why it waits for warm-up, why it shrinks slowly, and how a broken desk is replaced without anyone touching it.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: almost every EC2 web tier is an ASG across three AZs behind a load balancer, with target tracking and ELB health checks. It turns "a server died at 3 a.m." into a line in the activity history instead of a phone call.

тПня╕П Next

Six desks, one address for visitors. Load balancing: one reception, and only healthy desks get visitors.

git checkout lesson-10-load-balancing
тЖР PreviouspricingNext тЖТload balancing

This page is the lesson's README from the lesson-09-auto-scaling branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.