# Lambda Reserved Concurrency Too High

> Reserved concurrency above 100 with an observed peak leaving over half of it idle is a real over-allocation, yet AWS charges $0 for reserved concurrency; only the provisioned kind bills. With no dollar to recover, ZopNight evaluates every gate and then abstains rather than emit a zero-savings cost card.

Source: https://zop.dev/integrations/aws/recommendations/lambda-reserved-concurrency-too-high
Updated: 2026-08-19

---

## A rule whose conclusion is that there is nothing to charge for

Every gate in this rule runs. The function's reserved concurrency must exceed 100; [the
native concurrent-executions metric](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-metrics.html) must be present with adequate coverage; the observed
peak must leave more than half the reservation idle; the function must carry a known
positive cost. And then, with over-allocation genuinely established, the rule returns
nothing, because reserved concurrency is free. AWS bills *provisioned* concurrency (the
pre-warmed kind); a reservation is just a cap and a carve-out from the account pool, and
lowering it changes no invoice line. A cost-shaped recommendation with no recoverable
dollar is either a fabricated fraction or a $0 card, and the rule declines both.

## Why an oversized reservation still deserves a look

The account has one regional concurrency pool (default 1,000), and every reservation
carves its slice out of what all other functions share. A function reserving 500 it never
uses is not wasting money; it is starving *neighbours*. Other functions throttle at peak
because the pool was hoarded. That is an operational-capacity issue, and it is the real
reason to trim reservations even though no bill changes.

## Judge a reservation against its peak

```bash
aws lambda get-function-concurrency --function-name my-fn
aws cloudwatch get-metric-statistics \
  --namespace AWS/Lambda --metric-name ConcurrentExecutions \
  --dimensions Name=FunctionName,Value=my-fn \
  --start-time "$(date -u -v-30d +%Y-%m-%dT%H:%M:%SZ)" \
  --end-time "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
  --period 3600 --statistics Maximum
```

A reservation several times the highest hourly peak is the over-allocation shape; size to
peak plus real headroom, not to hope.

## The neighbouring setting that does cost money

Confusion between the two concurrency knobs is common enough to flag: provisioned
concurrency [bills per GB-second whether the function runs or not](https://aws.amazon.com/lambda/pricing/), and an oversized *provisioned*
figure is a genuine cost finding with real dollars. If a review of reservations turns up
provisioned configs alongside, those are where the invoice actually moves. Check
`aws lambda list-provisioned-concurrency-configs --function-name my-fn` while you are
there. This page's rule stays scoped to the free kind, and stays silent about it by
design.
