Lambda reserved-concurrency ceilings far above observed peaks (checked, but never billed)
What does ZopNight detect here?
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.
Signal and threshold
| Field | Value |
|---|---|
| Rule IDs | RC-157 |
| Category | rightsizing |
| Severity | low |
| Metric | none — pure configuration read |
| Source | lambda_concurrency.go |
Where it applies
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 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
aws lambda get-function-concurrency --function-name my-fnaws 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 MaximumA 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, 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.