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

Record Types & Configuration
What DNS record types can I create with RecordSet?
RecordSet supports A, AAAA, CAA, CNAME, DS, MX, NAPTR, NS, PTR, SOA, SRV, TLSA, and TXT record types. Specify the type using the recordType property and populate the corresponding record array (e.g., aRecords for A records, mxRecords for MX records).
How do I set the TTL for my DNS records?
Use the ttl property to specify the time-to-live in seconds. The examples show a common value of 3600 seconds (1 hour).
What does the @ symbol mean in relativeRecordSetName?
The @ symbol represents the zone apex (the root of the DNS zone). It’s used for SOA records and other records at the zone level.
How do I add metadata to a record set?
Use the metadata property with key-value pairs. For example, metadata: { key1: "value1" } as shown in the examples.
Immutability & Updates
What properties can't I change after creating a record set?
The recordType, relativeRecordSetName, resourceGroupName, and zoneName properties are immutable. To change any of these, you must delete and recreate the record set.
Can I change the record type of an existing record set?
No, recordType is immutable. You must delete the record set and create a new one with the desired record type.
Aliasing & Traffic Management
What's the difference between targetResource and trafficManagementProfile?
Both create alias records, but targetResource references any Azure resource, while trafficManagementProfile specifically references Azure Traffic Manager profiles. Use targetResource for general aliasing and trafficManagementProfile when integrating with Traffic Manager.
How do I create an alias record pointing to a Traffic Manager profile?
Set the trafficManagementProfile property with the Traffic Manager profile’s resource ID. Don’t specify record data arrays (like aRecords) when using alias records.
Import & Management
How do I import an existing DNS record set into Pulumi?
Use the import command with the format: pulumi import azure-native:dns:RecordSet <name> /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/dnsZones/{zoneName}/{recordType}/{relativeRecordSetName}
What's the difference between input and output properties?
Input properties (like ttl, aRecords) are what you configure. Output properties (like fqdn, provisioningState, etag) are computed by Azure and returned after creation. You can reference output properties but cannot set them directly.

Using a different cloud?

Explore networking guides for other cloud providers: