Skip to main content
orphan · aws

Orphaned EBS Volume

resource types
1
rule IDs covered
1
severity
low

What does ZopNight detect here?

Unattached EBS volumes recover their full priced monthly cost on deletion once they have sat in the available state for at least 7 days, the orphanSince dwell gate that suppresses mid-provisioning volumes. ZopNight abstains on Kubernetes CSI-tagged volumes, cedes ownership when an abandoned EKS cluster rec already counts the volume, and skips unpriced rows.

Signal and threshold

How ZopNight evaluates Orphaned EBS Volume.
Field Value
Rule IDsRC-002
Categoryorphan
Severitylow
Metricnone — pure configuration read
Sourceorphan_ebs.go

When an unattached volume counts as orphaned

  • resource.Status: available
  • not Kubernetes-managed (kubernetes.io/* CSI tags => abstain, since deleting would strand the pod that provisioned the PVC)
  • RC-043 cede (2026-07, cross-resource): given EvaluationContext, RC-002 skips an available volume that RC-043 already folds into an abandoned EKS cluster’s node-group rec: it backs a Released/Available eks-pv (csiVolumeHandle == vol-id) whose cluster has an abandoned node group, and it is priced (ebsVolumeCededToRC043). This makes RC-043 the single owner of that recoverable cost (no double-count with RC-043, Principle 6) and closes the static-PV gap the kubernetes.io/* tag heuristic above misses. Without context RC-043 abstains, so RC-002 stays the sole owner.
  • 7-day dwell gate (2026-07 audit, RC-212 pattern): when the discoverer stamps Metadata[“orphanSince”] (aws ebs.go sets it to the volume’s CreateTime for every unattached volume), the volume must have carried it ≥7d (orphanEBSMinDwell) before firing, which suppresses just-created / mid-provisioning volumes. Absent/unparseable timestamp => the status check alone stands (the gate only ever reduces firing). The emitted rec carries OrphanSince. Residual producer gap: AWS exposes no detach timestamp, so for a previously-attached volume orphanSince == CreateTime and an old volume detached seconds ago still passes; closing that needs a discoverer first-observed-unattached stamp under the same key.

Why deleting recovers the full volume cost

an available volume is still billed at the same per-GB-month storage rate as an attached one, so its full priced cost is recoverable on delete: SavingsUSD = pricing[uid] × 1.00, OptimizedCostUSD = 0; abstains when pricing is absent/≤0 (no $0 recs).

Snapshot first, then delete

  1. Check if any snapshots exist for this volume
  2. Create a snapshot if data may be needed later
  3. Delete the unattached volume via EC2 Console → Volumes

See it fire on your bill.

Connect an account read-only. The first findings land in minutes.

417 rule families across 353 resource types on 22 platforms. Every threshold, metric, and IAM action is documented on these pages before you grant anything.

417 rule families documented
353 resource types covered
read-only default access level
Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console· Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console·