Bedrock Custom Model Orphan
What does ZopNight detect here?
Bedrock custom models referenced by no Provisioned Throughput and no active on-demand deployment incur standing storage charges for nothing. ZopNight cross-references every PT and Active deployment ARN, fails closed on incomplete listings, and prices the full monthly storage cost (the synced Storage SKU rate or the verified $1.95 per model fallback) as recoverable savings.
Signal and threshold
| Field | Value |
|---|---|
| Rule IDs | RC-1604 |
| Category | orphan |
| Severity | medium |
| Metric | none — pure configuration read |
| Source | bedrock_custom_model_orphan.go |
Where it applies
Proving no throughput or deployment references the model
- resource.Type: bedrock-custom-model
- metadata: usedByPT (bool): set by the discoverer’s cross-reference pass (stampCustomModelPTUsage), mapping every PT’s modelArn/foundationModelArn and every Active Custom Model Deployment’s modelArn to the custom-model arns they reference; fires when usedByPT=false. A model served only by an on-demand Custom Model Deployment (no PT) is still usedByPT=true, but only while that deployment’s status is Active. A deployment stuck Creating or Failed is not actually serving inference and is excluded, so it cannot mask a genuinely orphaned model. Missing flag → silent (conservative). Partial-failure guard: the cross-reference runs whenever any Bedrock list call succeeds, so a transient failure of ListProvisionedModelThroughputs or ListCustomModelDeployments yields an incomplete reference set. A positive match is authoritative even then (usedByPT=true), but a non-match is stamped false only when both reference-source lists succeeded (referencesComplete); otherwise the flag is left absent so the rule fails closed rather than recommending deletion of every priced custom model on a transient list error.
- pricing: per-model standing storage cost (calcBedrockModelStorage, the synced AmazonBedrock ‘Storage’ SKU rate else the verified $1.95/model/mo fallback; bedrock-custom-model is Billable). Abstains when absent or ≤0.
Why an orphan model refunds its whole storage charge
concrete-or-abstain. The storage cost is quantified: deleting an orphan custom model (no PT referencing it) eliminates the entire standing per-model storage charge, so savings = full monthly cost, optimized = 0. The rule abstains (returns nil) when pricing is absent, and never emits a $0 or fabricated saving. (The prior “$0 informational, size not exposed” claim is gone: the flat-rate storage calc does not need the artifact size.)
Archiving artifacts before deleting the model
- Confirm no future use case for this fine-tuned model
- Export model artifacts to S3 if archival is needed
- Delete the custom model via the Bedrock console
- Audit fine-tuning pipelines to prevent unused-model accumulation
Why no CloudWatch series is needed
None (metadata-driven)