Why AWS went from about $50 a day to $275–$752 a day, and the three biggest ways to bring it down.
2026-10-07 · gross, before credits · builds on CI cost study (CICD, Oct 6)
Short version: on Sep 29 CI moved from GitHub's machines to ours, so its bill moved from GitHub to AWS. CI overall got cheaper: $2.52 per merged PR before, about $0.96 now. AWS also feels worse because the $5,000 AWS credit is basically used up, so since about Oct 4 the bill is real money.
The "$105 a day in September" figure was the wrong baseline. Apart from a short trial, AWS ran no CI then. CI cost $260–$1,040 a day on GitHub, and that bill fell to $18–37 a day once CI moved.
Now (Oct 6, $275): CI runners $246 (90%), everything else $29. No app servers, no idle or orphaned machines.
The $752 peak (Oct 2): 64-core machines ran the full suite on every merge batch ($184), full-price machines cost $370, and batches restarted 5.1 times per merge. All three have been cut since.
Top three cuts (all already with CICD):
Even with all three, a weekday stays near $150–200; getting lower needs fewer runs per PR.
| Day | AWS total | EC2 machines | CI-tagged | Not CI | GitHub Actions | Merged PRs |
|---|---|---|---|---|---|---|
| Sep 15 | 557 | 62 | n/a | (Config $378) | 267 | 158 |
| Sep 22–28 | 28–63 | 0–8 | ~0 | 28–63 | 260–1,043 | 112–466 |
| Sep 29 | 347 | 243 | 291 | 56 | 307 | 351 |
| Sep 30 | 450 | 339 | 395 | 56 | 24 | 398 |
| Oct 1 | 412 (+59 tax) | 299 | 369 | 42 | 21 | 582 |
| Oct 2 | 752 (+11 tax) | 609 | 695 | 57 | 25 | 438 |
| Oct 3 | 429 | 324 | 380 | 48 | 37 | 468 |
| Oct 4 (Sun) | 154 | 96 | 118 | 36 | 18 | 152 |
| Oct 5 | 338 | 245 | 298 | 40 | 33 | 343 |
| Oct 6 | 275 | 208 | 246 | 29 | 37 | 295 |
"CI-tagged" means every resource the runner stacks label Purpose=ci: machines, disks, IP addresses, logs, and the runner control plane. "Not CI" is DynamoDB, Lambda, GuardDuty, Config, ECS and similar. It runs $29–57 a day and has not grown. The Sep 13–17 spike was AWS Config recording every runner, already fixed (RCA). Sep 13–21 was a first RunsOn trial at $33–98 a day of EC2. It was off Sep 22–28.
Credits: $309 used in Aug, $4,012 in Sep, $678 in Oct, about $5,000 in total. Credits covered $99–415 a day from Oct 1–3, then only $5–25 a day from Oct 4–6. That points to the pool being spent (an inference from the credit line, not from a balance page).
| Day | EC2 $ | full price $ (sized only) | 2-cpu | 4-cpu | 8-cpu | 16-cpu | 64-cpu | vCPU-h | vCPU-h per merge |
|---|---|---|---|---|---|---|---|---|---|
| Sep 29 | 236 | 157 | 86 | 0 | 150 | 0 | 0 | 8.7k | 25 |
| Sep 30 | 331 | 227 | 176 | 0 | 130 | 24 | 0 | 10.2k | 26 |
| Oct 1 | 296 | 107 | 94 | 79 | 122 | 0 | 0 | 11.8k | 20 |
| Oct 2 | 591 | 352 | 52 | 159 | 196 | 0 | 184 | 27.7k | 63 |
| Oct 3 | 311 | 124 | 31 | 93 | 76 | 0 | 110 | 17.8k | 38 |
| Oct 5 | 236 | 11 | 40 | 76 | 49 | 0 | 71 | 14.3k | 42 |
| Oct 6 | 200 | 43 | 31 | 30 | 81 | 33 | 24 | 9.7k | 33 |
Size buckets and the full-price column leave out instance-less lines such as CPU credits, so they read a little lower than the totals (full price incl. those: $370 on Oct 2, $51 on Oct 6). Everything is arm except a few x86 2-cpu spot machines. Three runner fleets: the main us-east-1 stack, a 6-zone "flex" stack (since Oct 1) and us-west-2 (since Oct 1). On Oct 6 full-price machines cost $31 in the main stack, $10 in flex and $9 in west. Spot ran $157.
Did the machine count or size go up? Yes, at the queue launch. Work per merged PR went from ~25 vCPU-hours to 63 on Oct 2. It is back to 33 as of Oct 6. The thin queue (Oct 4) moved the 64-core full suite out of most batches. Price per vCPU-hour fell to about $0.02 as more ran on spot. PR sharding (#16955, merged Oct 6 10:42 UTC) has not shown up as a cost rise yet: the 4-cpu bucket, where PR unit tests run, fell from $76 to $30 between Oct 5 and Oct 6. Oct 7 is its first full day.
What CI costs besides machines (Oct 6, about $38): public IPv4 addresses $10 (about 100 runners live at once, half a cent per hour each), disks $9, CloudWatch log ingestion and vended logs about $8, data out $7, runner control plane (API Gateway, DynamoDB, SQS) about $7.
| Period | CI $/day (GitHub + AWS CI) | Merged/day | $ per merged PR |
|---|---|---|---|
| GitHub runners, Sep 22–26 weekdays | 738 | 293 | 2.52 |
| Oct 2 (peak) | 720 | 438 | 1.64 |
| Oct 3 | 417 | 468 | 0.89 |
| Oct 5 | 331 | 343 | 0.97 |
| Oct 6 | 283 | 295 | 0.96 |
Merged PRs are counted by UTC day from GitHub search. The GitHub-era row comes from the CI cost study.
Factory Cost tab, queue machine time at spot price, last 7 days (about $114/day): CI Checks $45/day (863 jobs, 3,220 vCPU-h), Guard pins $40/day (4,612 jobs, 2,890 vCPU-h), Unit Tests (affected) $9, full set on one machine $8, full set $6.5, fail-fast $3. 51.5% of queue machine time is waste, about $59/day.
AWS Cost Explorer daily unblended cost, record type Usage (credits and tax excluded unless named), grouped by service, usage type, instance type, purchase type, and the stack and Purpose cost-allocation tags. EC2 describe calls for live instances, volumes, addresses, NAT gateways and endpoints in us-east-1 and us-west-2, read-only, with nothing changed. GitHub billing usage API (actions, gross). GitHub search for merged PRs. The factory Cost tab for per-job queue figures. The engineering bridge thread (Oct 6–7) for what CICD already owns. Per-workflow AWS cost is not available, because the runner tags runs-on-workflow-name / runs-on-workflow-job-name are not activated as cost-allocation tags. Turning them on would give exact per-job dollars, but it is an account setting, so that decision is left to Fede/Gera.