# Bedrock Custom Model Orphan

> 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.

Source: https://zop.dev/integrations/aws/recommendations/bedrock-custom-model-orphan
Updated: 2026-08-19

---

## 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](https://aws.amazon.com/bedrock/pricing/), 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

1. Confirm no future use case for this fine-tuned model
2. Export model artifacts to S3 if archival is needed
3. Delete the custom model via the Bedrock console
4. Audit fine-tuning pipelines to prevent unused-model accumulation

## Why no CloudWatch series is needed

None (metadata-driven)
