Concept 07. By Nicolas Dao · Last reviewed

Pay for the work, or pay to be ready?

Should this part of the system cost nothing when it's idle, or run all the time so it's always ready?

What you'll be able to decide

Whether each component should scale to zero, stay up, or stay up on a commitment; how to read its floor and peak from its metrics; and where the line sits, with the site's own break-even numbers.

Every service has a cost shape: a floor (what it costs doing nothing) and a slope (what each unit of work adds). Scale-to-zero has no floor and the steepest slope, plus a wait after a quiet spell. Always-on has a floor and a flatter slope. A commitment discounts the floor for years. Read two numbers, the load at 3 am and the average against the peak: near zero at night means pay per use; high all day means pay to be ready, then commit to the floor once it's proven.

In short

The options

  1. A. Pay for the work

    No floor: you pay per request, per second or per GB, and nothing in between. The first request after a quiet spell may wait.

  2. B. Pay to be ready

    A floor every month, whatever the traffic, and a lower price for each unit of work once it's busy. Always instant.

  3. C. Pay to be ready, in advance

    The same floor bought for one to three years at a discount, once three months of usage show where it is.

The rule of thumb

Buy for the floor, not the average: the lowest hourly spend of recent months.

From Savings Plans and Reserved Instances

How the answer changes with scale

  1. New, small or spiky

    Everything scales to zero. A floor is the biggest line on a small bill.

  2. About 10 or more in flight all night, and a bill past about $500 a month for that function

    Pay to be ready: move that function's steady HTTP work to a container.

  3. Three months of steady usage

    Commit to the floor you saw, in small layers.

The problem, in plain words

Every cloud service has a cost shape made of two parts. The floor is what it costs doing nothing: the monthly bill at zero traffic. The slope is what each unit of work adds: each request, each second, each GB.

Services that scale to zero have no floor and a steeper slope. You pay only for the work, at a higher price per unit, and the first request after a quiet spell may have to wait while something starts. Services that are always on have a floor and a flatter slope. You pay to be ready, and each unit of work costs less once they're busy.

Neither is cheaper. Which one wins depends on the shape of your load, and the load has a shape you can read.

The picture

The same HTTP function, priced both ways. Lambda has no floor and climbs with every request in flight; the smallest highly available Fargate service starts at its floor and climbs slowly.

One HTTP function, two cost shapes

Sydney, Arm, a 1 GB Lambda at 200 ms per request against the smallest highly available Fargate service (two tasks, a load balancer, public IPv4), growing with the load at a tenth of each request on the CPU: the cost model behind Lambda, Fargate or EC2?. Both axes are logarithmic. The shaded band is the published rule for moving.

  • Lambda: pay for the work
  • Fargate: pay to be ready
The numbers behind the chart
Average requests in flight, all month125102050
Lambda: pay for the work$38$75$188$377$753$1.9k
Fargate: pay to be ready$73$73$73$108$190$437

On the bill alone, the lines cross at about 2 requests in flight. The shaded band starts at 10, because below it the saving doesn't pay for owning a load balancer, health checks and deploys.

The options

Pay for the work. Lambda costs nothing between requests. A Fargate scheduled task bills only while it runs: a two-hour nightly job on 2 vCPU and 4 GB is about $5.70 a month, against about $69 for the same task left running. Neon scales to zero after a few idle minutes. A Runpod GPU stopped when idle costs only its volume. The price of all that is the wait: a few hundred milliseconds for Neon to wake, about 15 seconds for a paused Aurora (30 or more after a day), a capacity error from a SageMaker endpoint scaled to zero.

Pay to be ready. A Fargate service in its smallest highly available form (two tasks, two zones, a load balancer) costs about $73 a month before it serves a request. Aurora Serverless v2 kept at 0.5 ACU is about $73. An on-demand Kinesis stream is about $36, idle. In return, one container serves many requests at once, and nothing ever has to wake up.

Pay to be ready, in advance. Savings Plans and reserved instances buy that floor for one to three years at a discount, which is much bigger on containers than on Lambda.

The floors that hide in the plumbing. A NAT gateway is about $43 a month for every zone, before data. RDS Proxy is at least about $26 a month, and a Serverless v2 cluster behind a proxy never pauses. These floors don't show up on the service you chose. They show up on the bill.

A concrete scenario

A Sydney company runs a scheduling app for field technicians.

  • Its API is busy from 7 am to 6 pm and nearly silent at night: about 5 requests in flight on average. On Lambda that's about $188 a month; the smallest highly available Fargate service is about $73. I'd stay on Lambda: $115 a month doesn't pay for owning a load balancer, health checks and deploys.
  • Its nightly import runs for two hours, as a Fargate scheduled task: $5.70 a month. Then someone puts its tasks in private subnets with a NAT gateway in each of two zones: about $86 a month of floor around a $5.70 job, by my arithmetic. That's exactly the over-provisioning I warn clients about. The lean setup has no NAT.
  • Its database is Neon. Development, staging and preview branches scale to zero. The production branch doesn't, because a technician opening a job at 6 am shouldn't wait for the database to wake.

In year two, a partner starts syncing all night. The API's floor at 3 am climbs to about 50 in flight, and its Lambda bill to about $1,883 a month, against about $437 on Fargate. Now pay to be ready: move that steady HTTP core to a container, keep Lambda for events, queues and spikes, and after three months of steady usage, cover the new floor with a Compute Savings Plan.

The trade-offs

Pay for the work Pay to be ready Pay to be ready, in advance
Floor at zero traffic None The smallest setup, all month (about $73 for a highly available Fargate service) The same floor, discounted, for one to three years
Price per unit of work, once busy Highest Lower Lowest
First request after a quiet spell May wait: milliseconds to tens of seconds Instant Instant
Fits Spiky, event-driven, development and preview Busy all day Busy all day, for three months already
The risk A wait in front of a user Paying for idle Paying for a floor that moved

The rule of thumb

Pay for the work until the floor is real. The signal is the load at 3 am, not the peak and not a high reserved concurrency, which costs nothing. Near zero at night: scale to zero. High all day: pay to be ready. And once it has been steady for three months, commit, but only to the floor: the lowest hourly spend you saw, never the average.

When the answer changes with scale

  • Small and new: scale everything to zero. On a small bill, a floor is the biggest line.
  • Spiky, at any size: stay. A function at 2 in flight that jumps to 300 for ten minutes a day costs about $153 on Lambda; a container sized for that peak costs about $1,960.
  • Steady and growing: move one function when its overnight floor stays at about 10 or more in flight (or its average is 30% of its peak), the CPU is at most a quarter of each request, and its bill passes about $500 a month. By my arithmetic, a function's monthly bill divided by about $38 is its average requests in flight (1 GB, Arm).
  • Must answer instantly: pay to be ready even at low traffic. That's what provisioned concurrency and an always-on database branch buy: latency, not price.
  • GPUs: the answer flips when the GPU never stops. Rent by the hour for bursts; a 3-year Savings Plan puts an L4 at about $235 a month for inference around the clock (Runpod or AWS for a GPU?).

Questions that change the answer

  • What is the load at 3 am? Its floor is what an always-on service would carry.

  • How close is the daily average to the peak? A tenth or less is spiky; a third or more is steady.

  • Must the first request after a quiet hour answer instantly? That alone can justify paying to be ready.

Doesn't cover

  • How a commitment is bought and layered: that's the Savings Plans entry.

Check your call

Decide before you open each answer.

  1. An internal API used by 40 staff during business hours, silent at night and at weekends.

    Pay for the work: Lambda. Its 3 am load is zero, so any floor is money for nothing.

  2. An API that a partner syncs around the clock, at about 60 requests in flight, costing about $2,200 a month on Lambda.

    Pay to be ready: move its steady HTTP work to a Fargate service, keep Lambda for events and spikes, and cover the new floor with a Savings Plan after three months.

  3. A GPU model that answers requests around the clock, every day.

    Pay to be ready, in advance. The answer flips when the GPU never stops: a 3-year Savings Plan, not an hourly rental.

The technology on this site

Want this stack in your AWS account?

Cloudless Labs is a Sydney consultancy. We migrate on-premises systems to AWS, build serverless apps on this stack, and coach teams to ship with Claude Code and Codex.

Talk to us

Contact Us

For general inquiries, please contact us at:

For e-learning capabilities, please contact: