Homeβ€Ί Blogβ€Ί Azure Architecture Series #69 β€” Public IPs: Basic Versus Standard, Static Versus Dynamic…
Azure Architecture Azure Architecture Series

Azure Architecture Series #69 β€” Public IPs: Basic Versus Standard, Static Versus Dynamic

Verified against current vendor documentation on 21 October 2026. Pricing, limits and API behaviour were checked against the official docs on that date. Cloud services change fast — if you are reading this much later, treat the specifics as a starting point and re-check the linked sources.

Business Challenge

A public IP looks like the simplest object in Azure networking. It is an address. You attach it to something and the something becomes reachable. In fact it carries a SKU, and the documentation is blunt about how much that one field decides:

“The SKU determines their functionality including allocation method, feature support, and resources they can be associated with.”

Three different kinds of thing, settled by one choice at creation time. And the choice has effectively already been made for you, because one of the two SKUs is gone:

“On September 30, 2025, Basic SKU public IPs were retired.”

That date is already in the past. Which would make this a short post, except that “retired” means something different here than it did in #68 — and the difference is worth putting side by side, because the same word is doing two unrelated jobs in consecutive parts of the same product.

Two retirements, two meanings, neither of them a shutdown
Default outbound access (#68)Basic SKU public IP (#69)
What changed A default value, for new VNets on new API versions Support status
Still works? Yes, in existing VNets and on older API versions Yes — “will remain operational”
What you lose Nothing, until you adopt a private subnet “unsupported and not covered by SLA guarantees”
The real risk Two pipelines quietly disagreeing Running production on something with no SLA

The full sentence is worth having, because it is the whole decision: “Basic public IPs will remain operational after September 30, 2025, giving users more time to transition to Standard SKU. Customers who choose to continue using Basic public IPs after retirement date accept the risks and acknowledge that the service is unsupported and not covered by SLA guarantees.”

So nothing breaks. You simply hold an address that Microsoft will not stand behind. For a lab that is fine. For anything with an availability commitment it is a quiet transfer of risk onto you, and it will not announce itself.

Architecture

One immutable field, two allocation methods of which Standard offers one, and a security default that flips between the SKUs.

Diagram: Azure public IP addresses in four layers. The first layer compares the Basic and Standard SKUs. Allocation is static only on Standard, while Basic allows dynamic or static for IPv4 and dynamic for IPv6. Security is the sharpest difference: Standard uses a secure by default model and is closed to inbound traffic when used as a frontend, so a network security group is required to allow traffic, whereas Basic is open by default with network security groups recommended but optional. Availability zones are supported on Standard, which can be non-zonal, zonal or zone-redundant, with Standard v2 only zone-redundant and zone redundancy requiring a region where three availability zones are live; Basic does not support zones at all and is always non-zonal. Routing preference Internet and the global tier for cross-region load balancers are supported on Standard but not on Standard v2 and not on Basic. Standard Load Balancer support covers IPv4 and IPv6 on Standard and is unsupported on Basic, and NAT Gateway and Azure Firewall support IPv4 on Standard and are unsupported on Basic. Idle timeout is identical on both: an adjustable inbound flow timeout of 4 to 30 minutes defaulting to 4 minutes, and a fixed outbound flow timeout of 4 minutes. The second layer explains the allocation methods. A dynamic address is not given at creation; it is assigned when the address is associated with a resource and released when the resource is stopped or deleted. A static address is assigned at creation and released only when the resource is deleted, after which it cannot be recovered, and you cannot choose which address you get because Azure assigns it from a pool in that location. Static is what firewall rules, DNS A records, IP-based security models and TLS certificates pinned to an address all require. The third layer lists what cannot be changed after creation: the SKU itself, the availability zone, and the domain name label scope. The fourth layer covers the retirement. Basic SKU public IPs were retired on 30 September 2025 but remain operational; continuing to use them means accepting that the service is unsupported and not covered by SLA guarantees. Upgrade paths differ by resource and Microsoft advises creating a migration plan for planned downtime: virtual machines use detach-and-upgrade scripts, a Basic load balancer requires a new load balancer SKU, VPN gateway migration converts all non-AZ SKUs to AZ SKUs, Application Gateway v1 was itself retired on 28 April 2026 and must move to v2, and uniform-model scale set per-instance IP configurations are not public IP resources at all and therefore cannot be upgraded, requiring new addresses. Finally, SKUs must match across associated resources, with no mixing of basic and standard, and Standard v2 addresses can currently only be used with the Standard v2 NAT Gateway product and nothing else.
One field decides allocation, security posture, zones and what it can attach to — and it is fixed at creation.

The comparison, with the row that matters most first

AspectStandardBasic
Security “Secure by default model and be closed to inbound traffic when used as a frontend” — an NSG is required “Open by default. Network security groups are recommended but optional”
AllocationStatic onlyIPv4 dynamic or static; IPv6 dynamic
Availability zonesNon-zonal, zonal or zone-redundant“Not supported”
Routing preferenceSupported (not on Standardv2)“Not supported”
Global tierSupported (not yet on Standardv2)“Not supported”
Standard Load BalancerIPv4 and IPv6“Not supported”
NAT Gateway / Azure FirewallIPv4 supported“Not supported”
Idle timeoutIdentical — “adjustable inbound originated flow idle timeout of 4-30 minutes, with a default of 4 minutes, and fixed outbound originated flow idle timeout of 4 minutes”

That last row is worth noticing precisely because it is the one people assume differs. The idle timeouts are word-for-word the same in both columns. If a connection is dropping after four minutes, the SKU is not the reason and upgrading will not fix it.

The security row, by contrast, is a behaviour change disguised as a SKU attribute. Basic is reachable unless you stop it; Standard is unreachable until you permit it. Which means a Basic-to-Standard migration is not like-for-like: the same VM, same rules, same everything else, becomes unreachable unless an NSG explicitly allows the traffic. Everything #64 said about needing an allow in both levels applies at exactly this moment.

What static and dynamic actually mean

Both words mean something narrower than they sound.

“Dynamic — The IP address isn’t given to the resource at the time of creation… The IP is assigned when you associate the public IP address with a resource. The IP address is released when you stop, or delete the resource.”

“Static — The resource is assigned an IP address at the time it’s created. The IP address is released when the resource is deleted and can’t be recovered.”

So dynamic does not mean “changes occasionally”; it means you lose it on a stop. And static does not mean “yours forever”; it means yours until the resource is deleted, after which it is gone irrecoverably. There is also no address picking: “When you set the allocation method to static, you can’t specify the actual IP address… Azure assigns the IP address from a pool of available IP addresses in the Azure location.”

The four documented reasons to need static are all forms of something else having written the address down — “update firewall rules… DNS name resolution, where a change in IP address would require updating A records… an IP address-based security model… TLS/SSL certificates linked to an IP address”. Each is a dependency outside Azure that a stop/start would break.

Which is why Standard being static-only is a simplification rather than a restriction. The decision tree collapses: there is no allocation choice to get wrong.

Three things fixed at creation

PropertyWhy it matters
The SKUChanging it means detach, recreate, reattach — the whole upgrade table
Availability zone“Once created, a public IP address can’t change its availability zone”
Domain Name Label Scope“can only be specified at the creation of a public IP address”

The zone one deserves a second look, because the labelling changed underneath everybody: “All formerly Standard non-zonal IPs are now zone-redundant in all regions that support availability zones. The means that IPs that show as either ‘zones 1 2 3’ or have no zones are equivalently zone-redundant.”

So a blank zone field no longer means what it used to. An auditor reading “no zones” on a Standard IP and concluding it is not zone-redundant would be wrong — while the same blank field on a Basic IP means exactly non-zonal, since “Basic SKU Public IPs don’t have any zones and are created as non-zonal.” Same display, opposite meaning, decided by the SKU.

Why This Architecture Holds Up

Because the migration is not like-for-like, and the difference is reachability

The single most consequential thing in this post: upgrading a public IP changes the default security posture of whatever it is attached to. Basic is open by default. Standard is “closed to inbound traffic when used as a frontend” with an NSG “required”.

So the upgrade sequence has an order that is not optional: the NSG rules must exist before the Standard IP is attached, or the service goes dark at the moment of cutover. Microsoft's own step list includes “Create a migration plan for planned downtime”, which is the honest framing — this is a change with an outage, not a property edit.

And it connects the whole networking phase: a Standard public IP is the first thing in this series that requires the NSG work from #64 through #66 rather than merely benefiting from it. If the subnet has no NSG at all, a Standard IP makes the resource unreachable rather than open.

Because some things cannot be upgraded at all

The upgrade table is mostly “run a script”, with one genuine dead end worth knowing before planning an estate-wide migration:

“If you have a virtual machine scale set (uniform model) with public IP configurations per instance, note these aren’t Public IP resources and as such can’t be upgraded; a new public IP address is required.”

Per-instance IP configurations on a uniform scale set are not addressable objects, so there is nothing to convert. Two other paths are redeployments rather than upgrades too: a Basic load balancer needs “a new Load Balancer SKU… required”, and VPN Gateway migration carries a side effect worth planning for — “All non-AZ SKUs become AZ SKUs”, which changes the gateway as well as the address.

And one path has its own expired deadline nested inside it: Application Gateway v1 users must move to v2, because “Microsoft retired Application Gateway v1 on April 28, 2026”. A Basic IP on a v1 gateway is therefore two retirements deep.

Because SKUs must match, so one Basic resource pins the others

This is the constraint that turns a small migration into a large one: “matching SKUs are required for load balancer and public IP resources. You can’t have a mixture of basic SKU resources and standard SKU resources.” And for tiers specifically, “If the public IP address aligns with a standard load balancer, the IP address must align with the load balancer tier.”

So you cannot migrate an address in isolation when it fronts a load balancer — the balancer moves with it, and anything else attached to the balancer moves too. The unit of migration is the connected set, not the IP. That is worth mapping before scheduling anything, because the blast radius is discovered rather than chosen.

Because Standard v2 is not simply “newer Standard”

A trap sitting right next to the obvious answer. Standard v2 looks like the natural choice on a fresh deployment, and it is almost always wrong today: “Standard v2 IPs can only be utilized with the Standard v2 NAT GW product at this time. It cannot be used with any other product or component.”

It also loses two Standard features: routing preference is “Standardv2: Not supported” and the global tier is “Standardv2: Not yet supported”. And its zone behaviour is fixed rather than chosen — “Standard v2 IPs can only be zone-redundant”.

Which makes the practical reading short: unless you are attaching it to a Standard v2 NAT Gateway, Standard v1 is the answer. “v2” here denotes a different product line, not a successor.

Because the address you did not create is the one from #68

A sentence on this page closes the loop with yesterday's post precisely: “A resource without an assigned public IP can still communicate outbound; in these instances, Azure automatically assigns an available dynamic IP address for outbound communication. This dynamically assigned address isn’t dedicated to the resource and can change over time.”

That is default outbound access, described from the public-IP side. So the two posts are two views of one mechanism: #68 is about Azure withdrawing that implicit address for new subnets, and this post is about the explicit address you attach instead. A Standard public IP on the NIC is one of the four explicit outbound methods from #68 — the per-machine one, with per-machine cost, since “Public IPv4 addresses have a nominal charge”.

Because the DNS label is a security surface, not a convenience

The domain name label looks like a nicety — it maps “domainnamelabel.location.cloudapp.azure.com” to the address, for “IPv4 addresses (32-bit A records) and IPv6 addresses (128-bit AAAA records)”, and each one “must be unique within its Azure location”.

The preview feature attached to it is the interesting part, because of what it defends against: Domain Name Label Scope “can help to prevent ‘dangling DNS names’ which can be reused by malicious actors” by inserting a subscription-derived hash into the name. Delete a resource whose label someone else can then claim, and the name keeps resolving — for them.

It is in public preview and “not recommended for production workloads”, and it “can only be specified at the creation of a public IP address” — so it is a decision you can only make at the moment you are least thinking about it. Worth knowing the subdomain-takeover risk exists even if the mitigation is not yet production-ready.

Because one SKU exception survives the retirement

Worth recording so nobody wastes time hunting a Basic IP that is legitimately still there: “this retirement won’t impact your existing or new deployments on CSES… you can still create (via non-Azure portal methods; for example, Azure CLI, PowerShell, etc.) and use Basic SKU public IPs for CSES deployments.”

Cloud Services Extended Support keeps the Basic SKU, creatable outside the portal. An inventory script that flags every Basic public IP as a violation will raise those, and they are not violations.

Key Architecture Decisions

Decision point Choose Because
SKU for anything new Standard (v1) Basic is retired and unsupported.
Reaching for Standard v2 Only with a Standard v2 NAT Gateway It cannot be used with any other component.
Allocation method on Standard No choice — static Standard supports static only.
Expecting to pick the address You can’t Azure assigns it from a regional pool.
Relying on a dynamic address Don’t, if anything records it It is released on stop, not just delete.
Deleting a resource with a static IP Expect to lose the address It can't be recovered once released.
Upgrading Basic to Standard Add the NSG rules first Standard is closed to inbound by default.
Treating the upgrade as a property edit Don’t — plan downtime Microsoft's own steps include a downtime plan.
A Basic IP fronting a load balancer Migrate the whole connected set SKUs can't be mixed, and tiers must align.
Uniform scale set per-instance IPs Create new addresses They aren't resources and can't be upgraded.
A Basic IP on a VPN gateway Expect the gateway SKU to change too All non-AZ SKUs become AZ SKUs.
A Basic IP on Application Gateway v1 Move to v2 v1 itself was retired on 28 April 2026.
A connection dropping at four minutes Don’t blame the SKU Idle timeouts are identical on both.
Needing a longer inbound idle timeout Raise it, up to 30 minutes Inbound is adjustable from 4 to 30 minutes.
Needing a longer outbound idle timeout Not possible Outbound is fixed at 4 minutes.
Reading “no zones” on a Standard IP Treat it as zone-redundant Formerly non-zonal Standard IPs now are.
Reading “no zones” on a Basic IP Treat it as non-zonal Basic has no zone support at all.
Wanting to change an IP’s zone Create a new one The zone is fixed at creation.
Auditing for Basic IPs Exempt CSES deployments They are explicitly out of scope.
Worrying about IPv6 cost Don’t Public IPv6 addresses have no charge.
Planning an IPv6-only VM Not supported — go dual-stack Every NIC needs at least one IPv4 config.

Closing Thought

Two posts, two retirements, and neither one turns anything off — which is becoming a pattern worth naming. Default outbound access was retired by changing a default for new networks. The Basic public IP SKU was retired by withdrawing support while leaving the resource running. In both cases the announcement sounds like a deadline and the reality is a slow transfer of risk: in #68 the risk that two pipelines disagree, here the risk that something load-bearing sits on a resource with no SLA behind it.

What makes the public IP version sharper is that the remedy is not free. Upgrading changes the default security posture of whatever the address fronts, from open to closed, so the cutover needs its NSG rules in place first and an outage window around it. And because SKUs cannot be mixed, the unit of work is not the address but everything attached to it — a Basic IP on a Basic load balancer drags the balancer and its backend along. That is why Microsoft's own step list contains a downtime plan rather than a command.

The small thing I would take away is the idle timeout row. It is identical on both SKUs, word for word, and it is the row people most often expect to differ — four minutes outbound, fixed, on everything. When a long-lived connection dies quietly and the SKU is the first suspect, that row is the answer, and the answer is that the SKU has nothing to do with it.

Next in this series

#70 takes the recommended explicit outbound method apart: NAT Gateway, and the SNAT port arithmetic that decides how many concurrent connections an estate can actually open before it starts failing in a way no log makes obvious.

Comments

How was your experience?
Your feedback helps improve this site.
PoorExcellent