AWS bill jump, October 2026: what drove it

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):

  1. Wasted queue runs, $59/day measured. Re-runs behind a failing PR plus machines AWS took back. Fixes landed Oct 6–7; expect $30–45/day. Low risk.
  2. Full-price machines, ~$40/day. $51 on Oct 6; the always-on pool was switched off that night. Confirm in Oct 7–8 numbers.
  3. Smaller machines for the queue's main check, $10–20/day. It runs on 16 cores ~863 times a day. Risk: slower merges.

Even with all three, a weekday stays near $150–200; getting lower needs fewer runs per PR.

1. Daily cost by service, Sep 15 to Oct 6
DayAWS totalEC2 machinesCI-taggedNot CIGitHub ActionsMerged PRs
Sep 1555762n/a(Config $378)267158
Sep 22–2828–630–8~028–63260–1,043112–466
Sep 2934724329156307351
Sep 304503393955624398
Oct 1412 (+59 tax)2993694221582
Oct 2752 (+11 tax)6096955725438
Oct 34293243804837468
Oct 4 (Sun)154961183618152
Oct 53382452984033343
Oct 62752082462937295

"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).

2. EC2 by purchase type, machine size and region
DayEC2 $full price $ (sized only)2-cpu4-cpu8-cpu16-cpu64-cpuvCPU-hvCPU-h per merge
Sep 29236157860150008.7k25
Sep 30331227176013024010.2k26
Oct 129610794791220011.8k20
Oct 259135252159196018427.7k63
Oct 3311124319376011017.8k38
Oct 52361140764907114.3k42
Oct 62004331308133249.7k33

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.

3. Cost per merged PR, before vs after
PeriodCI $/day (GitHub + AWS CI)Merged/day$ per merged PR
GitHub runners, Sep 22–26 weekdays7382932.52
Oct 2 (peak)7204381.64
Oct 34174680.89
Oct 53313430.97
Oct 62832950.96

Merged PRs are counted by UTC day from GitHub search. The GitHub-era row comes from the CI cost study.

4. Leftovers: full-price use, idle machines, network
5. Levers in detail, with the queue job breakdown

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.

  1. Queue waste ($59/day, measured). Two parts: re-runs behind a red PR, and spot machines lost mid-run. #17231 (retry a reclaimed shard inside the run) and the false-alarm fixes landed Oct 6–7. Replay-before-queue is approved. Fewer concurrent batches would also shrink the blast radius of one red. Estimate $30–45/day once these settle. Risk: fewer batches means lower merge throughput.
  2. Full-price residue (up to about $40/day). Mostly removed already, see section 4. Don't count the saving until Oct 7–8 show full-price EC2 under $10/day.
  3. Queue CI Checks on 16 cores ($45/day). That is about 2.9 runs per merge at about 3.7 vCPU-hours each. 8 cores would save $10–20/day if the job less than doubles in time. Risk: a few minutes longer per batch, which pushes against the one-hour open-to-live goal.
  4. Guard pins (4,612 jobs/day, about 15 per merge). Already halved to 3 shards of 8 cores in the queue. The one-machine shadow v2 is measuring the "share one machine" idea, and it expires Oct 8. Decide after its numbers come in, not before.
  5. Small: public IPv4 $10/day (on hold), CloudWatch logs about $8/day (shorter retention or less verbose runner logs), three runner control planes about $7/day (fold back to one once flex is the only fleet).
Method and sources

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.

PropFlow Docs