Blog

Cheaper GitHub Actions runners on AWS spot machines

The same job costs about an eighth on a spot machine in your own AWS account. Here is the sum, what you give up for it, and how to move a workflow across.

GitHub charges $0.012 for every minute a job spends on its 4-core Linux runner. AWS rents out a machine with the same four CPUs for about $0.0014 a minute, if you take it from its spare capacity. This post shows where that gap comes from, what you give up for it, and how to move a workflow across.

What a minute costs

GitHub’s prices are per minute and depend on the size of the runner. Each job is rounded up to a whole minute.

AWS sells machines nobody is using as spot machines. Their price moves through the day and differs from one region and zone to the next. These are the prices in us-east-1 on 8 October 2026:

CPUsGitHub-hosted, a minuteAWS spot, a minuteThe spot machine
4$0.012$0.0012c8a.xlarge
8$0.022$0.0028m8a.2xlarge
16$0.042$0.0058m8a.4xlarge
32$0.082$0.0097m8a.8xlarge

The table reads the other way too. Sixteen CPUs on a spot machine cost about what GitHub charges for two ($0.006 a minute), so the same money buys a much faster job.

A month, added up

The machine is not the whole bill. A runner needs a disk, and a public address unless it sits in a private network. For 100,000 minutes of 4-CPU Linux jobs:

WhatHowA month
GitHub’s 4-core Linux runner100,000 min × $0.012$1,200.00
AWS spot machine, 4 CPUs100,000 min × $0.001205$120.50
Its 60 GB diskgp3, for the same minutes$10.96
Its public addressfor the same minutes$8.33
On AWS, in all$139.79

That is about an eighth. Four things are not in the sum: the time a machine takes to start, which AWS bills; jobs that had to run again on a machine at the full price; data sent out of AWS; and whatever starts the machines for you.

What you give up

A spot machine can be taken back. AWS gives two minutes’ notice and then ends it. The job on it fails and has to run again. The shorter a job is, the less often it is caught.

Something has to manage the machines. When a job is queued, a machine has to be started, registered with GitHub as a runner for that one job, and ended afterwards. GitHub’s own runners do all of that for you.

GitHub may charge for it one day. Minutes on your own runners are free today. In December 2025 GitHub announced a charge of $0.002 a minute for them from March 2026, and postponed it the same week. If it returns at that price, add $200 to the AWS sum above. The total would still be under a third of GitHub’s.

Ways to do it

  • Actions Runner Controller is GitHub’s own. It runs runners in a Kubernetes cluster, so you need one, and someone to look after it.
  • The Terraform module for runners on AWS is open source. Lambda functions start EC2 machines as jobs arrive, on spot by default.
  • RunsOn installs as a CloudFormation stack in your AWS account. Commercial use needs a licence, from €300 a year.
  • Hosted runner services charge less than GitHub, but your jobs run on their machines, not in your account.
  • SuperCI, which we make, is open source under the MIT licence and costs nothing. Besides AWS it runs jobs in Cloudflare containers and Modal sandboxes, and it works with GitLab CI as well as GitHub Actions.

With SuperCI

One command opens a dashboard on your own computer:

npx @superci/cli
  1. Sign in with AWS. The dashboard puts a small control plane in your account and shows what that creates before you agree.
  2. Connect GitHub. The dashboard makes a GitHub App that is yours, and you choose its repositories.
  3. Add AWS as a runner provider.
  4. Change one line in a workflow:
jobs:
  test:
    runs-on: superci

From then on each job gets a fresh spot machine with 4 CPUs and 8 GB, and the machine is gone when the job ends. For a larger one, say so in the label: runs-on: superci-16cpu.

When AWS takes a machine back, SuperCI runs the job again, by default on a machine at the full price, so a job is not caught twice. You can cap what a provider spends in a month and how many jobs it runs at once. The getting started guide has every step, and Spot machines says exactly what happens when one is taken back.

Where it does not fit

A job may run for 70 minutes on SuperCI, and there are no macOS machines. Jobs that need more time, or macOS, belong on another runner.