Configure Azure DNS Record Sets

The azure-native:dns:RecordSet resource, part of the Pulumi Azure Native provider, defines DNS record sets that map domain names to IP addresses, mail servers, or other Azure resources within a DNS zone. This guide focuses on two capabilities: standard DNS record types (A, AAAA, CNAME, MX, TXT) and Traffic Manager integration via alias records.

Record sets belong to DNS zones that must exist before creating records. Some configurations reference Traffic Manager profiles for intelligent routing. The examples are intentionally small. Combine them with your own DNS zones and routing infrastructure.

Create an A record for IPv4 address resolution

Most DNS configurations start with A records that map hostnames to IPv4 addresses, enabling clients to resolve domain names to server IPs.

import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";

const recordSet = new azure_native.dns.RecordSet("recordSet", {
    aRecords: [{
        ipv4Address: "127.0.0.1",
    }],
    metadata: {
        key1: "value1",
    },
    recordType: "A",
    relativeRecordSetName: "record1",
    resourceGroupName: "rg1",
    ttl: 3600,
    zoneName: "zone1",
});
import pulumi
import pulumi_azure_native as azure_native

record_set = azure_native.dns.RecordSet("recordSet",
    a_records=[{
        "ipv4_address": "127.0.0.1",
    }],
    metadata={
        "key1": "value1",
    },
    record_type="A",
    relative_record_set_name="record1",
    resource_group_name="rg1",
    ttl=3600,
    zone_name="zone1")
package main

import (
	dns "github.com/pulumi/pulumi-azure-native-sdk/dns/v3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := dns.NewRecordSet(ctx, "recordSet", &dns.RecordSetArgs{
			ARecords: dns.ARecordArray{
				&dns.ARecordArgs{
					Ipv4Address: pulumi.String("127.0.0.1"),
				},
			},
			Metadata: pulumi.StringMap{
				"key1": pulumi.String("value1"),
			},
			RecordType:            pulumi.String("A"),
			RelativeRecordSetName: pulumi.String("record1"),
			ResourceGroupName:     pulumi.String("rg1"),
			Ttl:                   pulumi.Float64(3600),
			ZoneName:              pulumi.String("zone1"),
		})
		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 recordSet = new AzureNative.Dns.RecordSet("recordSet", new()
    {
        ARecords = new[]
        {
            new AzureNative.Dns.Inputs.ARecordArgs
            {
                Ipv4Address = "127.0.0.1",
            },
        },
        Metadata = 
        {
            { "key1", "value1" },
        },
        RecordType = "A",
        RelativeRecordSetName = "record1",
        ResourceGroupName = "rg1",
        Ttl = 3600,
        ZoneName = "zone1",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.dns.RecordSet;
import com.pulumi.azurenative.dns.RecordSetArgs;
import com.pulumi.azurenative.dns.inputs.ARecordArgs;
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 recordSet = new RecordSet("recordSet", RecordSetArgs.builder()
            .aRecords(ARecordArgs.builder()
                .ipv4Address("127.0.0.1")
                .build())
            .metadata(Map.of("key1", "value1"))
            .recordType("A")
            .relativeRecordSetName("record1")
            .resourceGroupName("rg1")
            .ttl(3600.0)
            .zoneName("zone1")
            .build());

    }
}
resources:
  recordSet:
    type: azure-native:dns:RecordSet
    properties:
      aRecords:
        - ipv4Address: 127.0.0.1
      metadata:
        key1: value1
      recordType: A
      relativeRecordSetName: record1
      resourceGroupName: rg1
      ttl: 3600
      zoneName: zone1

When a client queries the hostname, DNS returns the IPv4 address specified in ipv4Address. The recordType property identifies this as an A record, while relativeRecordSetName sets the hostname within the zone. The ttl property controls how long resolvers cache the result (3600 seconds here). The metadata property adds key-value tags for organization.

Create an AAAA record for IPv6 address resolution

IPv6-enabled services require AAAA records to map hostnames to 128-bit IPv6 addresses.

import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";

const recordSet = new azure_native.dns.RecordSet("recordSet", {
    aaaaRecords: [{
        ipv6Address: "::1",
    }],
    metadata: {
        key1: "value1",
    },
    recordType: "AAAA",
    relativeRecordSetName: "record1",
    resourceGroupName: "rg1",
    ttl: 3600,
    zoneName: "zone1",
});
import pulumi
import pulumi_azure_native as azure_native

record_set = azure_native.dns.RecordSet("recordSet",
    aaaa_records=[{
        "ipv6_address": "::1",
    }],
    metadata={
        "key1": "value1",
    },
    record_type="AAAA",
    relative_record_set_name="record1",
    resource_group_name="rg1",
    ttl=3600,
    zone_name="zone1")
package main

import (
	dns "github.com/pulumi/pulumi-azure-native-sdk/dns/v3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := dns.NewRecordSet(ctx, "recordSet", &dns.RecordSetArgs{
			AaaaRecords: dns.AaaaRecordArray{
				&dns.AaaaRecordArgs{
					Ipv6Address: pulumi.String("::1"),
				},
			},
			Metadata: pulumi.StringMap{
				"key1": pulumi.String("value1"),
			},
			RecordType:            pulumi.String("AAAA"),
			RelativeRecordSetName: pulumi.String("record1"),
			ResourceGroupName:     pulumi.String("rg1"),
			Ttl:                   pulumi.Float64(3600),
			ZoneName:              pulumi.String("zone1"),
		})
		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 recordSet = new AzureNative.Dns.RecordSet("recordSet", new()
    {
        AaaaRecords = new[]
        {
            new AzureNative.Dns.Inputs.AaaaRecordArgs
            {
                Ipv6Address = "::1",
            },
        },
        Metadata = 
        {
            { "key1", "value1" },
        },
        RecordType = "AAAA",
        RelativeRecordSetName = "record1",
        ResourceGroupName = "rg1",
        Ttl = 3600,
        ZoneName = "zone1",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.dns.RecordSet;
import com.pulumi.azurenative.dns.RecordSetArgs;
import com.pulumi.azurenative.dns.inputs.AaaaRecordArgs;
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 recordSet = new RecordSet("recordSet", RecordSetArgs.builder()
            .aaaaRecords(AaaaRecordArgs.builder()
                .ipv6Address("::1")
                .build())
            .metadata(Map.of("key1", "value1"))
            .recordType("AAAA")
            .relativeRecordSetName("record1")
            .resourceGroupName("rg1")
            .ttl(3600.0)
            .zoneName("zone1")
            .build());

    }
}
resources:
  recordSet:
    type: azure-native:dns:RecordSet
    properties:
      aaaaRecords:
        - ipv6Address: ::1
      metadata:
        key1: value1
      recordType: AAAA
      relativeRecordSetName: record1
      resourceGroupName: rg1
      ttl: 3600
      zoneName: zone1

The aaaaRecords array holds IPv6 addresses in standard notation. The recordType changes to “AAAA” to indicate IPv6 resolution. Otherwise, the structure mirrors A records: relativeRecordSetName, ttl, and metadata work identically.

Create a CNAME record for domain aliasing

CNAME records create aliases that point one domain name to another, commonly used for subdomains or service endpoints.

import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";

const recordSet = new azure_native.dns.RecordSet("recordSet", {
    cnameRecord: {
        cname: "contoso.com",
    },
    metadata: {
        key1: "value1",
    },
    recordType: "CNAME",
    relativeRecordSetName: "record1",
    resourceGroupName: "rg1",
    ttl: 3600,
    zoneName: "zone1",
});
import pulumi
import pulumi_azure_native as azure_native

record_set = azure_native.dns.RecordSet("recordSet",
    cname_record={
        "cname": "contoso.com",
    },
    metadata={
        "key1": "value1",
    },
    record_type="CNAME",
    relative_record_set_name="record1",
    resource_group_name="rg1",
    ttl=3600,
    zone_name="zone1")
package main

import (
	dns "github.com/pulumi/pulumi-azure-native-sdk/dns/v3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := dns.NewRecordSet(ctx, "recordSet", &dns.RecordSetArgs{
			CnameRecord: &dns.CnameRecordArgs{
				Cname: pulumi.String("contoso.com"),
			},
			Metadata: pulumi.StringMap{
				"key1": pulumi.String("value1"),
			},
			RecordType:            pulumi.String("CNAME"),
			RelativeRecordSetName: pulumi.String("record1"),
			ResourceGroupName:     pulumi.String("rg1"),
			Ttl:                   pulumi.Float64(3600),
			ZoneName:              pulumi.String("zone1"),
		})
		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 recordSet = new AzureNative.Dns.RecordSet("recordSet", new()
    {
        CnameRecord = new AzureNative.Dns.Inputs.CnameRecordArgs
        {
            Cname = "contoso.com",
        },
        Metadata = 
        {
            { "key1", "value1" },
        },
        RecordType = "CNAME",
        RelativeRecordSetName = "record1",
        ResourceGroupName = "rg1",
        Ttl = 3600,
        ZoneName = "zone1",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.dns.RecordSet;
import com.pulumi.azurenative.dns.RecordSetArgs;
import com.pulumi.azurenative.dns.inputs.CnameRecordArgs;
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 recordSet = new RecordSet("recordSet", RecordSetArgs.builder()
            .cnameRecord(CnameRecordArgs.builder()
                .cname("contoso.com")
                .build())
            .metadata(Map.of("key1", "value1"))
            .recordType("CNAME")
            .relativeRecordSetName("record1")
            .resourceGroupName("rg1")
            .ttl(3600.0)
            .zoneName("zone1")
            .build());

    }
}
resources:
  recordSet:
    type: azure-native:dns:RecordSet
    properties:
      cnameRecord:
        cname: contoso.com
      metadata:
        key1: value1
      recordType: CNAME
      relativeRecordSetName: record1
      resourceGroupName: rg1
      ttl: 3600
      zoneName: zone1

The cnameRecord property specifies the target domain in the cname field. When clients query the alias, DNS returns the canonical name, which they then resolve separately. CNAME records cannot coexist with other record types at the same name.

Create MX records for email routing

Email delivery requires MX records that specify mail servers and their priority order.

import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";

const recordSet = new azure_native.dns.RecordSet("recordSet", {
    metadata: {
        key1: "value1",
    },
    mxRecords: [{
        exchange: "mail.contoso.com",
        preference: 0,
    }],
    recordType: "MX",
    relativeRecordSetName: "record1",
    resourceGroupName: "rg1",
    ttl: 3600,
    zoneName: "zone1",
});
import pulumi
import pulumi_azure_native as azure_native

record_set = azure_native.dns.RecordSet("recordSet",
    metadata={
        "key1": "value1",
    },
    mx_records=[{
        "exchange": "mail.contoso.com",
        "preference": 0,
    }],
    record_type="MX",
    relative_record_set_name="record1",
    resource_group_name="rg1",
    ttl=3600,
    zone_name="zone1")
package main

import (
	dns "github.com/pulumi/pulumi-azure-native-sdk/dns/v3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := dns.NewRecordSet(ctx, "recordSet", &dns.RecordSetArgs{
			Metadata: pulumi.StringMap{
				"key1": pulumi.String("value1"),
			},
			MxRecords: dns.MxRecordArray{
				&dns.MxRecordArgs{
					Exchange:   pulumi.String("mail.contoso.com"),
					Preference: pulumi.Int(0),
				},
			},
			RecordType:            pulumi.String("MX"),
			RelativeRecordSetName: pulumi.String("record1"),
			ResourceGroupName:     pulumi.String("rg1"),
			Ttl:                   pulumi.Float64(3600),
			ZoneName:              pulumi.String("zone1"),
		})
		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 recordSet = new AzureNative.Dns.RecordSet("recordSet", new()
    {
        Metadata = 
        {
            { "key1", "value1" },
        },
        MxRecords = new[]
        {
            new AzureNative.Dns.Inputs.MxRecordArgs
            {
                Exchange = "mail.contoso.com",
                Preference = 0,
            },
        },
        RecordType = "MX",
        RelativeRecordSetName = "record1",
        ResourceGroupName = "rg1",
        Ttl = 3600,
        ZoneName = "zone1",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.dns.RecordSet;
import com.pulumi.azurenative.dns.RecordSetArgs;
import com.pulumi.azurenative.dns.inputs.MxRecordArgs;
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 recordSet = new RecordSet("recordSet", RecordSetArgs.builder()
            .metadata(Map.of("key1", "value1"))
            .mxRecords(MxRecordArgs.builder()
                .exchange("mail.contoso.com")
                .preference(0)
                .build())
            .recordType("MX")
            .relativeRecordSetName("record1")
            .resourceGroupName("rg1")
            .ttl(3600.0)
            .zoneName("zone1")
            .build());

    }
}
resources:
  recordSet:
    type: azure-native:dns:RecordSet
    properties:
      metadata:
        key1: value1
      mxRecords:
        - exchange: mail.contoso.com
          preference: 0
      recordType: MX
      relativeRecordSetName: record1
      resourceGroupName: rg1
      ttl: 3600
      zoneName: zone1

The mxRecords array lists mail servers with their exchange hostnames and preference values. Lower preference numbers indicate higher priority; mail servers attempt delivery in priority order. Multiple MX records provide redundancy if the primary server is unavailable.

Create TXT records for verification and metadata

TXT records store arbitrary text data, commonly used for domain verification, SPF records, and DKIM signatures.

import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";

const recordSet = new azure_native.dns.RecordSet("recordSet", {
    metadata: {
        key1: "value1",
    },
    recordType: "TXT",
    relativeRecordSetName: "record1",
    resourceGroupName: "rg1",
    ttl: 3600,
    txtRecords: [{
        value: [
            "string1",
            "string2",
        ],
    }],
    zoneName: "zone1",
});
import pulumi
import pulumi_azure_native as azure_native

record_set = azure_native.dns.RecordSet("recordSet",
    metadata={
        "key1": "value1",
    },
    record_type="TXT",
    relative_record_set_name="record1",
    resource_group_name="rg1",
    ttl=3600,
    txt_records=[{
        "value": [
            "string1",
            "string2",
        ],
    }],
    zone_name="zone1")
package main

import (
	dns "github.com/pulumi/pulumi-azure-native-sdk/dns/v3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := dns.NewRecordSet(ctx, "recordSet", &dns.RecordSetArgs{
			Metadata: pulumi.StringMap{
				"key1": pulumi.String("value1"),
			},
			RecordType:            pulumi.String("TXT"),
			RelativeRecordSetName: pulumi.String("record1"),
			ResourceGroupName:     pulumi.String("rg1"),
			Ttl:                   pulumi.Float64(3600),
			TxtRecords: dns.TxtRecordArray{
				&dns.TxtRecordArgs{
					Value: pulumi.StringArray{
						pulumi.String("string1"),
						pulumi.String("string2"),
					},
				},
			},
			ZoneName: pulumi.String("zone1"),
		})
		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 recordSet = new AzureNative.Dns.RecordSet("recordSet", new()
    {
        Metadata = 
        {
            { "key1", "value1" },
        },
        RecordType = "TXT",
        RelativeRecordSetName = "record1",
        ResourceGroupName = "rg1",
        Ttl = 3600,
        TxtRecords = new[]
        {
            new AzureNative.Dns.Inputs.TxtRecordArgs
            {
                Value = new[]
                {
                    "string1",
                    "string2",
                },
            },
        },
        ZoneName = "zone1",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.dns.RecordSet;
import com.pulumi.azurenative.dns.RecordSetArgs;
import com.pulumi.azurenative.dns.inputs.TxtRecordArgs;
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 recordSet = new RecordSet("recordSet", RecordSetArgs.builder()
            .metadata(Map.of("key1", "value1"))
            .recordType("TXT")
            .relativeRecordSetName("record1")
            .resourceGroupName("rg1")
            .ttl(3600.0)
            .txtRecords(TxtRecordArgs.builder()
                .value(                
                    "string1",
                    "string2")
                .build())
            .zoneName("zone1")
            .build());

    }
}
resources:
  recordSet:
    type: azure-native:dns:RecordSet
    properties:
      metadata:
        key1: value1
      recordType: TXT
      relativeRecordSetName: record1
      resourceGroupName: rg1
      ttl: 3600
      txtRecords:
        - value:
            - string1
            - string2
      zoneName: zone1

The txtRecords array holds text values. Each record can contain multiple strings in the value array, which DNS concatenates during resolution. Services like Google Workspace and Microsoft 365 use TXT records to verify domain ownership before enabling features.

Route traffic through Azure Traffic Manager with alias records

Applications that need geographic distribution or failover can use alias records to point DNS names directly at Traffic Manager profiles.

import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";

const recordSet = new azure_native.dns.RecordSet("recordSet", {
    metadata: {
        key1: "value1",
    },
    recordType: "A",
    relativeRecordSetName: "record1",
    resourceGroupName: "rg1",
    targetResource: {
        id: "/subscriptions/726f8cd6-6459-4db4-8e6d-2cd2716904e2/resourceGroups/test/providers/Microsoft.Network/trafficManagerProfiles/testpp2",
    },
    ttl: 3600,
    zoneName: "zone1",
});
import pulumi
import pulumi_azure_native as azure_native

record_set = azure_native.dns.RecordSet("recordSet",
    metadata={
        "key1": "value1",
    },
    record_type="A",
    relative_record_set_name="record1",
    resource_group_name="rg1",
    target_resource={
        "id": "/subscriptions/726f8cd6-6459-4db4-8e6d-2cd2716904e2/resourceGroups/test/providers/Microsoft.Network/trafficManagerProfiles/testpp2",
    },
    ttl=3600,
    zone_name="zone1")
package main

import (
	dns "github.com/pulumi/pulumi-azure-native-sdk/dns/v3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := dns.NewRecordSet(ctx, "recordSet", &dns.RecordSetArgs{
			Metadata: pulumi.StringMap{
				"key1": pulumi.String("value1"),
			},
			RecordType:            pulumi.String("A"),
			RelativeRecordSetName: pulumi.String("record1"),
			ResourceGroupName:     pulumi.String("rg1"),
			TargetResource: &dns.SubResourceArgs{
				Id: pulumi.String("/subscriptions/726f8cd6-6459-4db4-8e6d-2cd2716904e2/resourceGroups/test/providers/Microsoft.Network/trafficManagerProfiles/testpp2"),
			},
			Ttl:      pulumi.Float64(3600),
			ZoneName: pulumi.String("zone1"),
		})
		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 recordSet = new AzureNative.Dns.RecordSet("recordSet", new()
    {
        Metadata = 
        {
            { "key1", "value1" },
        },
        RecordType = "A",
        RelativeRecordSetName = "record1",
        ResourceGroupName = "rg1",
        TargetResource = new AzureNative.Dns.Inputs.SubResourceArgs
        {
            Id = "/subscriptions/726f8cd6-6459-4db4-8e6d-2cd2716904e2/resourceGroups/test/providers/Microsoft.Network/trafficManagerProfiles/testpp2",
        },
        Ttl = 3600,
        ZoneName = "zone1",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.dns.RecordSet;
import com.pulumi.azurenative.dns.RecordSetArgs;
import com.pulumi.azurenative.dns.inputs.SubResourceArgs;
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 recordSet = new RecordSet("recordSet", RecordSetArgs.builder()
            .metadata(Map.of("key1", "value1"))
            .recordType("A")
            .relativeRecordSetName("record1")
            .resourceGroupName("rg1")
            .targetResource(SubResourceArgs.builder()
                .id("/subscriptions/726f8cd6-6459-4db4-8e6d-2cd2716904e2/resourceGroups/test/providers/Microsoft.Network/trafficManagerProfiles/testpp2")
                .build())
            .ttl(3600.0)
            .zoneName("zone1")
            .build());

    }
}
resources:
  recordSet:
    type: azure-native:dns:RecordSet
    properties:
      metadata:
        key1: value1
      recordType: A
      relativeRecordSetName: record1
      resourceGroupName: rg1
      targetResource:
        id: /subscriptions/726f8cd6-6459-4db4-8e6d-2cd2716904e2/resourceGroups/test/providers/Microsoft.Network/trafficManagerProfiles/testpp2
      ttl: 3600
      zoneName: zone1

The targetResource property references a Traffic Manager profile by its Azure resource ID. Instead of resolving to a static IP, the DNS query returns the Traffic Manager endpoint, which then routes traffic based on configured policies (geographic, performance, priority). This eliminates the need to update DNS records when backend IPs change.

Beyond these examples

These snippets focus on specific record set features: standard DNS record types (A, AAAA, CNAME, MX, TXT), Traffic Manager integration via alias records, and TTL and metadata configuration. They’re intentionally minimal rather than full DNS zone configurations.

The examples reference pre-existing infrastructure such as DNS zones (zoneName), resource groups (resourceGroupName), and Traffic Manager profiles (for alias examples). They focus on configuring the record set rather than provisioning the surrounding DNS infrastructure.

To keep things focused, common record set patterns are omitted, including:

  • Advanced record types (CAA, DS, NAPTR, PTR, SOA, SRV, TLSA)
  • Traffic management profiles (trafficManagementProfile property)
  • Multiple records in a single record set
  • Record set import and etag-based updates

These omissions are intentional: the goal is to illustrate how each record type is wired, not provide drop-in DNS modules. See the RecordSet resource reference for all available configuration options.

Let's configure Azure DNS Record Sets

Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.

Try Pulumi Cloud for FREE

Frequently Asked Questions

Immutability & Configuration
What properties can't I change after creating a DNS record set?
The recordType, relativeRecordSetName, resourceGroupName, and zoneName properties are immutable. Changing any of these requires destroying and recreating the record set.
How do I configure the TTL for my DNS records?
Set the ttl property to specify the time-to-live in seconds. Examples in the schema use 3600 seconds (1 hour).
Record Types & Features
What types of DNS records can I create?
You can create A, AAAA, CAA, CNAME, DS, MX, NAPTR, NS, PTR, SOA, SRV, TLSA, and TXT records. Specify the type using the recordType property and provide the corresponding record data (e.g., aRecords for A records, cnameRecord for CNAME).
What's the difference between targetResource and trafficManagementProfile?
targetResource creates an alias record pointing to another Azure resource (like a Traffic Manager profile). trafficManagementProfile specifically references a Traffic Manager profile for DNS-based traffic routing. Both enable advanced routing scenarios.
How do I create an alias record pointing to another Azure resource?
Configure the targetResource property with the Azure resource ID. For example, to alias to a Traffic Manager profile, set targetResource.id to the profile’s resource ID.
Operations & Outputs
Can I import existing DNS records into Pulumi?
Yes, use the import command with the format: /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/dnsZones/{zoneName}/{recordType}/{relativeRecordSetName}
What's the fqdn output property used for?
The fqdn output provides the fully qualified domain name of the record set, computed by Azure DNS. Use this to reference the complete DNS name in other resources.

Using a different cloud?

Explore networking guides for other cloud providers: