All cheat sheets
Serverless & AIcheat sheet

App Runner Automatic Pausing

App Runner Automatic Pausing scales your service to zero when idle — you stop paying for provisioned compute and trade it for a 2–5s cold start on the first request. Business-hours apps save 60–70%, sporadic ones 80–95%.

Last reviewed: July 14, 2026

TL;DR: App Runner normally bills provisioned compute 24/7 whether or not anyone hits it. Turn on Automatic Pausing and an idle service scales to zero — code stays deployed, config preserved, compute charge stops — waking in 2–5 seconds on the next request. It converts App Runner from always-on rental into Lambda-style pay-per-use. Business-hours apps drop 60–70%; sporadic ones 80–95%. The whole cost is that first-request cold start.

The numbers

Traffic shape Compute you pay for Typical saving
Steady 24/7 ~168 hrs/wk little — rightsize instead
Business hours (idle nights/weekends) ~50 hrs/wk 60–70%
Sporadic (silent for hours/days) near-zero 80–95%
  • With pausing you pay for provisioned instances only during active periods, plus a small per-request fee and build time.
  • Field examples: a 12-person team's business-hours support dashboard went from 168 to ~50–60 billed hours/week (~65% cut, zero code change). An investor-demo app used ~5×/week for 20 min dropped from ~$50/mo to under $5/mo (>98%).

Do this

  1. Enable it in the console (or API/CDK): check "Pause service when inactive." That's the whole switch.
  2. Tune the inactivity timeout (default ~5 min): spiky/webhook bursts → shorter (1–3 min) so you don't pay through the lulls; steady-with-gaps → longer (5–10 min) to avoid pause/resume thrashing; mostly idle → shorter.
  3. Turn it on everywhere non-prod by default — there is almost no reason a dev or staging service runs 24/7.
  4. Segment production by latency tolerance: internal tools, admin panels, webhook receivers, batch APIs → pause; customer-facing latency-SLA paths → leave provisioned.
  5. Watch resume time in CloudWatch — if cold starts creep past ~5s, your container image is too large; slim it down.

Gotchas

  • The cold start is real: the first request after idle waits 2–5s while an instance spins up. Requests aren't dropped (no 503, no standby tier) — they're held. Fine for internal tools; a dealbreaker for checkout and real-time paths.
  • Steady 24/7 traffic saves almost nothing — the service rarely enters the paused state, so you pay for compute nearly all the time anyway.
  • Pairs with autoscaling, doesn't replace it: App Runner scales 1→N during active periods; pausing just adds the →0 step when idle.

Skip this if

  • The service is customer-facing with a strict latency SLA (payments, real-time chat, live dashboards) — keep it provisioned and instead rightsize the instance class and tune min/max instances.
  • Traffic is genuinely steady 24/7 — pausing never triggers; rightsizing is your lever.
  • You want the simpler pay-only-when-active endpoint model without a container — see AWS Lambda Function URLs.

Run this audit with your AI assistant

Paste this into Claude, ChatGPT, or any agent that can run the AWS CLI with read-only credentials. It audits your account for exactly the waste this sheet describes — and changes nothing.

You are auditing an AWS account's App Runner services for scale-to-zero
(Automatic Pausing) savings. Use the AWS CLI with READ-ONLY credentials.
Do not create, modify, or delete anything — report findings and
recommended (unapplied) fixes only.

1. Inventory: aws apprunner list-services, then describe-service on each
   — capture ServiceName, Status, whether the service is customer-facing
   (from tags/naming: prod/dev/staging/internal), instance
   configuration (Cpu/Memory), and current AutoScalingConfiguration.
2. Traffic shape per service: pull CloudWatch AWS/AppRunner Requests
   (Sum, 1h period, 14 days). Classify each: steady 24/7, business-hours
   (idle nights/weekends), or sporadic (long silent gaps).
3. Pausing candidates: any service that is NOT customer-facing/latency-
   critical AND shows idle stretches — dev, staging, admin, internal
   tools, webhook receivers, demos. Estimate savings: idle_hours/168 ×
   current provisioned compute $/mo.
4. Rightsizing note: for steady-24/7 or dealbreaker-latency services
   (pausing off), flag over-provisioned Cpu/Memory and min-instance
   counts instead.

Report a table: service | env | traffic shape | pausing fit (yes/segment/
no) | est. idle hours/wk | est. $/mo saved. Note the cold-start caveat
(2–5s first request). Change nothing.
Works with any assistant that can run shell commands.

Want the guided version?

The App Runner Automatic Pausing walkthrough covers this topic interactively — it asks about your setup, branches to what’s relevant, and quizzes you on the tricky parts. Free and anonymous.

Start the walkthrough