Skip to main content
Back to the Azure Footguns Database
CostSecurityMediumOccasionalAZF-0104

A retired Defender for Cloud plan stays on Standard and keeps billing next to the plan that replaced it

Azure marks a Defender plan deprecated with a replacedBy successor, but it never turns the old plan off. A subscription that enabled Defender for Container Registries or Defender for Kubernetes years ago is still billing for them, often alongside Defender for Containers.

Footgun ID
AZF-0104 (Azure Footgun No. 104)
Azure service
Microsoft Defender for Cloud
Resource type
Microsoft.Security/pricings
Updated
October 28, 2026

What it is

A Microsoft Defender for Cloud plan that Microsoft has retired, still set to the Standard pricing tier on a subscription and still producing charges. The canonical pair is Defender for Container Registries (ContainerRegistry) and Defender for Kubernetes (KubernetesService), both superseded by Defender for Containers. Azure flags these rows with properties.deprecated: true and names the successor in properties.replacedBy, but it does not disable them, so a subscription that turned them on in 2021 is paying for them in 2026, usually next to the successor plan that already covers the same registries and clusters.

Impact (cost)
The retired plan's meter every month on top of its successor; the retired meters are not publicly listed, while the successor (Defender for Containers) is ~$7 per vCore/month at list price
Basis: Azure list price (Retail Prices API, East US) and Azure behavior (authored assessment). Figures are estimates, not measurements.

Why it happens

Plan retirement in Defender for Cloud is a one-way door that only blocks the way in. Microsoft's documentation for the retired container plans says it plainly: if the plan is already enabled on a subscription you can keep using it, you just won't get Defender for Containers' improvements and new features, and the plan is no longer available where it isn't already on. In July 2026 Microsoft went further and made the plan-enablement API refuse new onboarding to five deprecated plans (Defender for Azure Kubernetes Service, Defender for Azure Container Registry, Defender for Key Vault, Defender for DNS, Defender for Azure Resource Manager), while stating that existing subscriptions "continue to receive product access, value, and billing" and that no retirement date has been announced. Nothing in that sequence ever flips an enabled plan to Free.

The portal does not make this visible. The Defender plans page lists what is on and off; a retired plan that is on looks like any other enabled plan, and the successor sits in the same list as a separate toggle. Teams that adopted Defender for Containers when it went GA typically enabled the new plan and never went back to disable the old ones, because the old ones were still "working."

The API tells the truth if you ask it. On Microsoft.Security/pricings (api-version 2024-01-01), deprecated is documented as "True if the plan is deprecated. If there are replacing plans they will appear in replacedBy," and replacedBy as the list of plans that replace this one, present only when the plan is deprecated. The same rows are queryable tenant-wide in Azure Resource Graph's securityresources table.

One trap when you go looking: pricingTier == 'Standard' is not proof of spend. Foundational CSPM and Discovery are always-on, no-cost plans that report Standard on every subscription. Filter on the deprecated flag, not on the tier alone.

What it costs / blast radius

The cost is the retired plan's meter, every month, for protection the successor already delivers. Defender for Containers lists at about $0.0094 per vCore-hour, roughly $7 per vCore per month at list price in East US (Azure Retail Prices API; your contract may differ), billed on the vCores of your Kubernetes worker nodes. The retired Container Registries and Kubernetes plans billed on their own meters (Microsoft's documentation for the registries plan: charged once per image scanned); those meters no longer appear in the public Retail Prices catalog, so the only honest number is the one on your invoice under the Defender for Cloud meter category for those plan names. A subscription running both the old pair and Defender for Containers is paying for the same clusters and registries twice, and the duplicate line is one nobody expects to see, so nobody questions it.

The security cost is quieter. A retired plan's detections stop improving on the day it is deprecated: Defender for Containers gained agentless registry and runtime scanning powered by Microsoft Defender Vulnerability Management, Kubernetes node vulnerability assessment, binary drift detection, and admission-time misconfiguration enforcement; none of that reaches a subscription still relying on the old plans. A team that believes "we have Defender on our containers" because two legacy toggles are green has a coverage gap it is actively paying for. (Azure behavior; authored assessment.)

See it

Find them: deprecated Defender plans still on Standard, with the successor Azure names for each
// Defender plan rows live in securityresources. The deprecated flag,
// not the Standard tier, is the signal: Foundational CSPM and Discovery
// are always-on no-cost plans that also report Standard.
securityresources
| where type == 'microsoft.security/pricings'
| where tostring(properties.pricingTier) =~ 'Standard'
| where tolower(tostring(properties.deprecated)) == 'true'
| project subscriptionId, retiredPlan = name,
replacedBy = tostring(properties.replacedBy),
enabledSince = tostring(properties.enablementTime)
| order by subscriptionId asc, retiredPlan asc
Fix: confirm the successor is on, then set the retired plans to Free in that subscription
# Run in the context of the affected subscription (az account set -s <subscriptionId>).
# 1. Confirm the successor covers you before touching the old plans.
az security pricing show --name Containers --query pricingTier -o tsv
# expect: Standard

# 2. Turn the retired plans off. Azure blocks new enablement of retired
# plans, so expect no way back: step 1 is the whole safety net.
az security pricing create --name ContainerRegistry --tier free
az security pricing create --name KubernetesService --tier free

How StratoLens helps

StratoLens inventories every Defender for Cloud plan on every subscription in your tenant and marks the ones Azure has flagged deprecated but that are still on a paid tier, as a "Retired still paid" status you can filter on and a dashboard count you can watch go to zero, next to the observed spend per plan from your cost data. The duplicate line stops hiding inside the Defender total.

Start your 14-day free trial

Every feature unlocked. Deploys to your Azure tenant. No data leaves your tenant.

When the 14 days end, billing starts on your Azure invoice at your tier. One toggle in Settings turns it off, any time.