Four generations of deploying the same legacy app

Ten years, one legacy app, four deployment generations — from CodeDeploy to blue/green to fully-baked AMIs with instance refresh, and what each rebuild taught me.

Anatomy of a cascading incident: a PPA removal, an emergency AMI, and a four-year-old race condition

A public postmortem: four upstream repo failures in one week, an emergency AMI, and a 16-second health-check race that routed traffic to half-deployed servers.

We reinvented container image layers — with AMIs

Porting container image layering to EC2 AMIs after the incident — weekly-baked layers, failure isolation, and a php-fpm health gate.

I audited my own four-year-old deploy script before replacing it

Five latent logic bombs found in my own blue/green deploy script, and why they slept for four years.

A 60-line deploy script: SSM Parameter Store as a release pointer

A deployment system is a pointer plus convergence: SSM Parameter Store as the release pointer, instance refresh as the loop, rollback without CI.

Rollback is a feature: drills, alarm gates, and an incident mode

Rollback as a designed feature: deploy-gate alarms, auto vs manual boundaries, an incident mode that bypasses its own gates, and drills.

Capacity-adaptive instance refresh: measured numbers from a real fleet

Real measured numbers for ASG instance refresh at different fleet sizes, and the capacity-adaptive strategy those numbers forced.