# EC2 Reserved Instance Opportunity

> Reserved Instance opportunities fire on production EC2 boxes lacking any commitment coverage. ZopNight prices the 1-year no-upfront RI at its live rate times 730 hours and recommends only when that undercuts the actual monthly cost; savings equal the difference. Dev/test environment tags veto, Spot lifecycles abstain, and the old 0.35 flat-fraction fallback is gone.

Source: https://zop.dev/integrations/aws/recommendations/ec2-reserved-instance-opportunity
Updated: 2026-08-19

---

## Env tags, spot lifecycle, and existing coverage

- resource.Status: running
- already-covered skip: evalCtx.ReservationCoverage[UID] == "Reservation"/"SavingsPlan" (billing-derived) is the primary signal; tag: ri_covered=true / tag: savings_plan=true remain as the fallback check when billing data is unavailable
- env tag (env/environment/stage/tier): prod is now established by an AUTHORITATIVE env tag via isProdEnvTag, with the prodPatterns name-substring kept only as the no-env-tag fallback; a dev/test env tag (isDevTestEnvTag) is an authoritative veto that suppresses the long-term RI commitment even on a prod-named box (item PAP002, reserved_ec2.go:83-97). The prior name-substring-only classification fired an assertive RI commitment off a customer-controlled label with no producer behind it.
- Spot lifecycle veto (verification sweep S1, 2026-07-19): the rule abstains via the shared isSpotLifecycle(resource) guard (Metadata lifecycle/purchase_type == spot, tag fallback) placed immediately after the reservation-coverage skip. RI/on-demand commitment pricing does not apply to interruptible Spot capacity; when the spot rate is absent the aggregator prices the box at the on-demand rack rate (QualityFallbackOnDemandNoSpotRate), so CommitmentBreakEven would otherwise "pass" against spend the customer is not paying and recommend a 1-year lock-in that can *increase* the bill. Siblings spot_adoption/savings_plan already carried this guard; RC-014 did not.

## The Reserved Instance break-even net

Concrete or abstain (discount/commitment). Savings are the real break-even net, nothing else. CommitmentBreakEven (W5-R02) prices the RI at [the 1-year No Upfront rate AWS publishes](https://aws.amazon.com/ec2/pricing/reserved-instances/pricing/) held for a full month (RI1yrNoUpfront×730) and recommends only when that is less than the resource's actual current monthly cost (cost, already rack-based + uptime-adjusted), so  savings = currentCostUSD − RI1yrNoUpfront×730    (positive by construction)  and the headline % is savings/cost*100 from that live net. The rule abstains (returns nil) when break-even inputs are unavailable (ok==false): since cost > 0 is already guaranteed, ok==false strictly means live RI tier rates are absent or non-positive. The prior cost × DeriveCommitmentFraction(tiers, riSavingsFraction) fallback always collapsed to the hardcoded 0.35 when the RI rate was absent or zero, a fabricated saving with no rate behind it, and is dropped: a discount (cost-driven) rec carries a real, data-backed dollar amount or none at all (user directive 2026-06-27). riSavingsFraction=0.35 is now a legacy const retained only so cross-rule test fixtures keep compiling; it is no longer used by the rule logic. Mirrors RC-1506 / RC-031 / RC-1507.

## Purchasing a 1-year Standard RI

1. Verify this instance will run for at least 12 months
2. Check AWS Cost Explorer RI recommendations
3. Purchase a 1-year Standard RI for this instance type and region
4. Consider Convertible RI for flexibility
