Imported Bedrock models paying storage for zero invocations
What does ZopNight detect here?
Custom Model Import bills two ways: an active per-CMU-minute charge that scales to zero on its own, and a storage charge of $1.95 per Custom Model Unit per month that never does. ZopNight flags imported models with no invocations across 30 days, where deleting the model recovers exactly that standing storage cost.
Signal and threshold
| Field | Value |
|---|---|
| Rule IDs | RC-1605 |
| Category | idle |
| Severity | medium |
| Metric | none — pure configuration read |
| Source | bedrock_imported_model_idle.go |
Where it applies
The charge that does not stop when the traffic does
An imported model’s compute charge is genuinely serverless: no invocations, no per-minute billing. Its storage charge is not: while the model artifact sits in the account, AWS bills $1.95 per Custom Model Unit per month, invoked or not. That asymmetry is the whole finding. An imported model nobody calls has already scaled its compute to zero by itself; the storage line is the only remaining cost, and only deletion removes it.
Where the dollar figure is honest and where it is conservative
The recommendation prices the saving from the aggregator’s standing-storage cost for the specific model, never a guess. One caveat is inherited from discovery: the model’s CMU count is not currently captured (the list API does not expose it), so pricing treats each model as one CMU. A large multi-CMU model is therefore understated. A 1-CMU model at $1.95/mo will typically fall below the $5 minimum-savings floor and be suppressed. Under-claiming is the deliberate direction; the rule never rounds a small model up to make a card.
How idleness is established
Among the count metrics Bedrock emits, a model with zero invocations produces no series at all, so a missing Invocations series, on a metrics fetch that succeeded for the org, is itself the idle evidence. Any recorded activity in the full metric suppresses the finding, and a total metrics outage (an empty map) makes the rule abstain wholesale rather than declare the entire fleet idle at once. Absent pricing also abstains: no cost, no card.
Reproduce the traffic check
aws cloudwatch get-metric-statistics \ --namespace AWS/Bedrock --metric-name Invocations \ --dimensions Name=ModelId,Value=<imported-model-arn> \ --start-time "$(date -u -v-30d +%Y-%m-%dT%H:%M:%SZ)" \ --end-time "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ --period 86400 --statistics SumBefore deleting
Keep the source artifacts in S3: re-importing later is straightforward as long as the original weights exist, so deletion is reversible in effect even though the imported-model object itself is gone. The pattern worth fixing is the pipeline that imports every fine-tune experiment and never cleans up; a lifecycle policy on experiments costs one meeting and ends the accumulation.