The azure-native:network:PublicIPAddress resource, part of the Pulumi Azure Native provider, provisions public IP addresses for Azure resources: allocation method, DNS settings, and SKU configuration. This guide focuses on three capabilities: basic IP provisioning with defaults, DNS name assignment, and static allocation with global tier configuration.
Public IPs belong to resource groups and can be attached to load balancers, VMs, or NAT gateways. The examples are intentionally small. Combine them with your own network infrastructure and resource attachments.
Create a public IP with default settings
Most deployments start with a minimal configuration, letting Azure select defaults for allocation method and SKU.
import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";
const publicIPAddress = new azure_native.network.PublicIPAddress("publicIPAddress", {
location: "eastus",
publicIpAddressName: "test-ip",
resourceGroupName: "rg1",
});
import pulumi
import pulumi_azure_native as azure_native
public_ip_address = azure_native.network.PublicIPAddress("publicIPAddress",
location="eastus",
public_ip_address_name="test-ip",
resource_group_name="rg1")
package main
import (
network "github.com/pulumi/pulumi-azure-native-sdk/network/v3"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := network.NewPublicIPAddress(ctx, "publicIPAddress", &network.PublicIPAddressArgs{
Location: pulumi.String("eastus"),
PublicIpAddressName: pulumi.String("test-ip"),
ResourceGroupName: pulumi.String("rg1"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;
return await Deployment.RunAsync(() =>
{
var publicIPAddress = new AzureNative.Network.PublicIPAddress("publicIPAddress", new()
{
Location = "eastus",
PublicIpAddressName = "test-ip",
ResourceGroupName = "rg1",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.network.PublicIPAddress;
import com.pulumi.azurenative.network.PublicIPAddressArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var publicIPAddress = new PublicIPAddress("publicIPAddress", PublicIPAddressArgs.builder()
.location("eastus")
.publicIpAddressName("test-ip")
.resourceGroupName("rg1")
.build());
}
}
resources:
publicIPAddress:
type: azure-native:network:PublicIPAddress
properties:
location: eastus
publicIpAddressName: test-ip
resourceGroupName: rg1
Azure assigns a dynamic IP from the Basic SKU by default. The location property places the IP in a specific region; publicIpAddressName sets the resource name; resourceGroupName specifies which resource group contains the IP. Without explicit configuration, you get IPv4 with dynamic allocation.
Assign a DNS name to a public IP
Applications that need stable DNS names configure a domain name label, which Azure resolves to a fully qualified domain name.
import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";
const publicIPAddress = new azure_native.network.PublicIPAddress("publicIPAddress", {
dnsSettings: {
domainNameLabel: "dnslbl",
},
location: "eastus",
publicIpAddressName: "test-ip",
resourceGroupName: "rg1",
});
import pulumi
import pulumi_azure_native as azure_native
public_ip_address = azure_native.network.PublicIPAddress("publicIPAddress",
dns_settings={
"domain_name_label": "dnslbl",
},
location="eastus",
public_ip_address_name="test-ip",
resource_group_name="rg1")
package main
import (
network "github.com/pulumi/pulumi-azure-native-sdk/network/v3"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := network.NewPublicIPAddress(ctx, "publicIPAddress", &network.PublicIPAddressArgs{
DnsSettings: &network.PublicIPAddressDnsSettingsArgs{
DomainNameLabel: pulumi.String("dnslbl"),
},
Location: pulumi.String("eastus"),
PublicIpAddressName: pulumi.String("test-ip"),
ResourceGroupName: pulumi.String("rg1"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;
return await Deployment.RunAsync(() =>
{
var publicIPAddress = new AzureNative.Network.PublicIPAddress("publicIPAddress", new()
{
DnsSettings = new AzureNative.Network.Inputs.PublicIPAddressDnsSettingsArgs
{
DomainNameLabel = "dnslbl",
},
Location = "eastus",
PublicIpAddressName = "test-ip",
ResourceGroupName = "rg1",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.network.PublicIPAddress;
import com.pulumi.azurenative.network.PublicIPAddressArgs;
import com.pulumi.azurenative.network.inputs.PublicIPAddressDnsSettingsArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var publicIPAddress = new PublicIPAddress("publicIPAddress", PublicIPAddressArgs.builder()
.dnsSettings(PublicIPAddressDnsSettingsArgs.builder()
.domainNameLabel("dnslbl")
.build())
.location("eastus")
.publicIpAddressName("test-ip")
.resourceGroupName("rg1")
.build());
}
}
resources:
publicIPAddress:
type: azure-native:network:PublicIPAddress
properties:
dnsSettings:
domainNameLabel: dnslbl
location: eastus
publicIpAddressName: test-ip
resourceGroupName: rg1
The dnsSettings block configures DNS resolution. The domainNameLabel property creates a FQDN in the format {label}.{region}.cloudapp.azure.com. This provides a human-readable name that remains stable even if the underlying IP address changes (for dynamic allocation).
Configure static allocation and global tier
Production workloads that require predictable IP addresses or cross-region load balancing use static allocation with the Standard SKU.
import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";
const publicIPAddress = new azure_native.network.PublicIPAddress("publicIPAddress", {
idleTimeoutInMinutes: 10,
location: "eastus",
publicIPAddressVersion: azure_native.network.IPVersion.IPv4,
publicIPAllocationMethod: azure_native.network.IPAllocationMethod.Static,
publicIpAddressName: "test-ip",
resourceGroupName: "rg1",
sku: {
name: azure_native.network.PublicIPAddressSkuName.Standard,
tier: azure_native.network.PublicIPAddressSkuTier.Global,
},
});
import pulumi
import pulumi_azure_native as azure_native
public_ip_address = azure_native.network.PublicIPAddress("publicIPAddress",
idle_timeout_in_minutes=10,
location="eastus",
public_ip_address_version=azure_native.network.IPVersion.I_PV4,
public_ip_allocation_method=azure_native.network.IPAllocationMethod.STATIC,
public_ip_address_name="test-ip",
resource_group_name="rg1",
sku={
"name": azure_native.network.PublicIPAddressSkuName.STANDARD,
"tier": azure_native.network.PublicIPAddressSkuTier.GLOBAL_,
})
package main
import (
network "github.com/pulumi/pulumi-azure-native-sdk/network/v3"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := network.NewPublicIPAddress(ctx, "publicIPAddress", &network.PublicIPAddressArgs{
IdleTimeoutInMinutes: pulumi.Int(10),
Location: pulumi.String("eastus"),
PublicIPAddressVersion: pulumi.String(network.IPVersionIPv4),
PublicIPAllocationMethod: pulumi.String(network.IPAllocationMethodStatic),
PublicIpAddressName: pulumi.String("test-ip"),
ResourceGroupName: pulumi.String("rg1"),
Sku: &network.PublicIPAddressSkuArgs{
Name: pulumi.String(network.PublicIPAddressSkuNameStandard),
Tier: pulumi.String(network.PublicIPAddressSkuTierGlobal),
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;
return await Deployment.RunAsync(() =>
{
var publicIPAddress = new AzureNative.Network.PublicIPAddress("publicIPAddress", new()
{
IdleTimeoutInMinutes = 10,
Location = "eastus",
PublicIPAddressVersion = AzureNative.Network.IPVersion.IPv4,
PublicIPAllocationMethod = AzureNative.Network.IPAllocationMethod.Static,
PublicIpAddressName = "test-ip",
ResourceGroupName = "rg1",
Sku = new AzureNative.Network.Inputs.PublicIPAddressSkuArgs
{
Name = AzureNative.Network.PublicIPAddressSkuName.Standard,
Tier = AzureNative.Network.PublicIPAddressSkuTier.Global,
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.network.PublicIPAddress;
import com.pulumi.azurenative.network.PublicIPAddressArgs;
import com.pulumi.azurenative.network.inputs.PublicIPAddressSkuArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var publicIPAddress = new PublicIPAddress("publicIPAddress", PublicIPAddressArgs.builder()
.idleTimeoutInMinutes(10)
.location("eastus")
.publicIPAddressVersion("IPv4")
.publicIPAllocationMethod("Static")
.publicIpAddressName("test-ip")
.resourceGroupName("rg1")
.sku(PublicIPAddressSkuArgs.builder()
.name("Standard")
.tier("Global")
.build())
.build());
}
}
resources:
publicIPAddress:
type: azure-native:network:PublicIPAddress
properties:
idleTimeoutInMinutes: 10
location: eastus
publicIPAddressVersion: IPv4
publicIPAllocationMethod: Static
publicIpAddressName: test-ip
resourceGroupName: rg1
sku:
name: Standard
tier: Global
The publicIPAllocationMethod property set to Static reserves a fixed IP address that persists across resource lifecycle changes. The sku block configures the Standard SKU with Global tier, enabling cross-region load balancing scenarios. The idleTimeoutInMinutes property controls how long idle TCP connections remain open before timing out.
Beyond these examples
These snippets focus on specific public IP features: basic provisioning and DNS configuration, and allocation methods and SKU tiers. They’re intentionally minimal rather than full networking deployments.
The examples reference pre-existing infrastructure such as Azure resource groups. They focus on configuring the public IP rather than provisioning the surrounding network infrastructure.
To keep things focused, common public IP patterns are omitted, including:
- DDoS protection policies (ddosSettings)
- Availability zones (zones)
- IP tags and extended locations
- NAT gateway and public IP prefix associations
These omissions are intentional: the goal is to illustrate how each public IP feature is wired, not provide drop-in networking modules. See the PublicIPAddress resource reference for all available configuration options.
Let's create Azure Public IP Addresses
Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.
Try Pulumi Cloud for FREEFrequently Asked Questions
Configuration & Immutability
location, publicIPAddressVersion, publicIPPrefix, publicIpAddressName, resourceGroupName, and sku.publicIPAllocationMethod to specify Static or Dynamic allocation. Static IPs are assigned immediately and remain constant, while Dynamic IPs are assigned when associated with a resource.sku property defines the SKU name (Standard or Basic) and tier (Regional or Global). The allocation method example shows Standard SKU with Global tier for cross-region scenarios.location, publicIpAddressName, and resourceGroupName.DNS Configuration
dnsSettings with a domainNameLabel to create a DNS record. For advanced scenarios, add domainNameLabelScope (e.g., TenantReuse) to control DNS label reuse behavior.domainNameLabelScope property controls DNS label reuse behavior. Setting it to TenantReuse allows the domain name label to be reused within the tenant.Advanced Configuration
idleTimeoutInMinutes property to set the idle timeout. The allocation method example shows a value of 10 minutes.pulumi package add azure-native network [ApiVersion]. The current default is 2024-05-01, with many other versions available.