Dev/Test Aurora -- Switch to Serverless v2
What does ZopNight detect here?
Dev and test Aurora clusters named dev, test, qa, staging, or sandbox get an off-hours pause schedule instead of a vague Serverless v2 advisory. ZopNight prices savings as member-instance compute times the measured idle fraction, clamped to 1. Storage keeps billing while paused, so only compute counts.
Signal and threshold
| Field | Value |
|---|---|
| Rule IDs | RC-191 |
| Category | schedule |
| Severity | medium |
| Metric | none — pure configuration read |
| Source | aurora_serverless.go |
Where it applies
Gates a dev or test Aurora cluster must clear
- resource.Status: from DescribeDBClusters (rds_cluster.go); abstains when set and not available (covers stopped and transitional states such as creating/deleting/backing-up/failed). A stopped or transitional cluster runs no compute, cannot be meaningfully scheduled, and (per AWS) is billed only for storage/snapshots while stopped, so both actionability and the pricing baseline are wrong until it’s available again. Empty/unknown status does not suppress (fail-open on unknown, parity with RC-190).
- Metadata: engine_mode; abstains when already serverless (MetadataStateMatches; the old hasTag(Tags,“engine_mode”,…) guard was inert because the discoverer writes engine_mode to Metadata). Serverless v2 is also skipped (isAuroraServerlessV2): SV2 keeps engine_mode provisioned but already scales to near-minimum ACUs when idle, so an off-hours pause is the wrong lever.
- resource.Name: dev/test pattern (dev, test, qa, staging, sandbox), and not a production pattern (prod, production, live, prd).
- ScheduleData (aggregator heatmap, RC-093 path) keyed by UID; carries the measured off-hours idle fraction.
- member-instance compute cost: members resolved via ParentUID over evalCtx.Resources and priced from the injected pricing map (abstains when that basis is unavailable or ≤0).
Why only member compute drops when the cluster pauses
concrete-or-abstain, re-keyed from the prior $0 “switch to Serverless v2” advisory to the schedule lever (pause/resume off-hours). Member-compute basis (misattribution fix): the aggregator prices a provisioned Aurora cluster row as storage only (calcRDSCluster; member compute lives on the child rds rows), and Aurora storage keeps billing while a cluster is paused, so savings = memberCompute × clamp(ScheduleData.IdlePercentage, 0, 1) (not pricing[cluster_uid] × IdlePercentage, which credited a cost component that does not drop with the pause). The idle fraction is upper-clamped to 1 so a malformed heatmap value can never push the saving above the pauseable member compute, making the guarantee savings ≤ memberCompute explicit, the same ceiling the service-layer per-UID clamp would enforce if this rec were booked on the member UID. CurrentCostUSD = memberCompute + cluster storage price when known; only the compute share scales with the schedule. Abstains when ScheduleData is absent, IdlePercentage ≤ 0, or the member-compute basis cannot be established (no fleet view / no member rows / members unpriced). No fabricated flat fraction, no $0/advisory rec. (The Serverless v2 migration is mentioned only as secondary remediation guidance.)
Applying the off-hours pause schedule
- Review the recommended off-hours schedule (Start/Stop/Timezone from ScheduleData)
- Apply it from this recommendation to pause/resume the Aurora cluster automatically
- For bursty workloads, also evaluate migrating to Aurora Serverless v2 so capacity scales to near-zero ACUs during inactivity
Why the schedule heatmap replaces metrics
None (uses ScheduleData)