Configure Azure Peering Connections

The azure-native:peering:Peering resource, part of the Pulumi Azure Native provider, defines a peering relationship with Microsoft’s network edge: the connection type (direct or exchange), BGP sessions, and physical facility locations. This guide focuses on three capabilities: direct peering to Microsoft Edge, Azure Route Server connectivity, and Internet Exchange peering.

Peerings require pre-registered PeerAsn resources that identify your autonomous system to Microsoft, plus physical connectivity at colocation or Internet Exchange facilities. The examples are intentionally small. Combine them with your own PeerAsn registrations and facility arrangements.

Establish direct BGP connections to Microsoft Edge

Organizations connecting their networks directly to Microsoft’s edge infrastructure use direct peering to establish BGP sessions at physical colocation facilities, providing low-latency paths for Microsoft-destined traffic.

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

const peering = new azure_native.peering.Peering("peering", {
    direct: {
        connections: [
            {
                bandwidthInMbps: 10000,
                bgpSession: {
                    maxPrefixesAdvertisedV4: 1000,
                    maxPrefixesAdvertisedV6: 100,
                    md5AuthenticationKey: "test-md5-auth-key",
                    sessionPrefixV4: "192.168.0.0/31",
                    sessionPrefixV6: "fd00::0/127",
                },
                connectionIdentifier: "5F4CB5C7-6B43-4444-9338-9ABC72606C16",
                peeringDBFacilityId: 99999,
                sessionAddressProvider: azure_native.peering.SessionAddressProvider.Peer,
                useForPeeringService: false,
            },
            {
                bandwidthInMbps: 10000,
                connectionIdentifier: "8AB00818-D533-4504-A25A-03A17F61201C",
                peeringDBFacilityId: 99999,
                sessionAddressProvider: azure_native.peering.SessionAddressProvider.Microsoft,
                useForPeeringService: true,
            },
        ],
        directPeeringType: azure_native.peering.DirectPeeringType.Edge,
        peerAsn: {
            id: "/subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1",
        },
    },
    kind: azure_native.peering.Kind.Direct,
    location: "eastus",
    peeringLocation: "peeringLocation0",
    peeringName: "peeringName",
    resourceGroupName: "rgName",
    sku: {
        name: "Basic_Direct_Free",
    },
});
import pulumi
import pulumi_azure_native as azure_native

peering = azure_native.peering.Peering("peering",
    direct={
        "connections": [
            {
                "bandwidth_in_mbps": 10000,
                "bgp_session": {
                    "max_prefixes_advertised_v4": 1000,
                    "max_prefixes_advertised_v6": 100,
                    "md5_authentication_key": "test-md5-auth-key",
                    "session_prefix_v4": "192.168.0.0/31",
                    "session_prefix_v6": "fd00::0/127",
                },
                "connection_identifier": "5F4CB5C7-6B43-4444-9338-9ABC72606C16",
                "peering_db_facility_id": 99999,
                "session_address_provider": azure_native.peering.SessionAddressProvider.PEER,
                "use_for_peering_service": False,
            },
            {
                "bandwidth_in_mbps": 10000,
                "connection_identifier": "8AB00818-D533-4504-A25A-03A17F61201C",
                "peering_db_facility_id": 99999,
                "session_address_provider": azure_native.peering.SessionAddressProvider.MICROSOFT,
                "use_for_peering_service": True,
            },
        ],
        "direct_peering_type": azure_native.peering.DirectPeeringType.EDGE,
        "peer_asn": {
            "id": "/subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1",
        },
    },
    kind=azure_native.peering.Kind.DIRECT,
    location="eastus",
    peering_location="peeringLocation0",
    peering_name="peeringName",
    resource_group_name="rgName",
    sku={
        "name": "Basic_Direct_Free",
    })
package main

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

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := peering.NewPeering(ctx, "peering", &peering.PeeringArgs{
			Direct: &peering.PeeringPropertiesDirectArgs{
				Connections: peering.DirectConnectionArray{
					&peering.DirectConnectionArgs{
						BandwidthInMbps: pulumi.Int(10000),
						BgpSession: &peering.BgpSessionArgs{
							MaxPrefixesAdvertisedV4: pulumi.Int(1000),
							MaxPrefixesAdvertisedV6: pulumi.Int(100),
							Md5AuthenticationKey:    pulumi.String("test-md5-auth-key"),
							SessionPrefixV4:         pulumi.String("192.168.0.0/31"),
							SessionPrefixV6:         pulumi.String("fd00::0/127"),
						},
						ConnectionIdentifier:   pulumi.String("5F4CB5C7-6B43-4444-9338-9ABC72606C16"),
						PeeringDBFacilityId:    pulumi.Int(99999),
						SessionAddressProvider: pulumi.String(peering.SessionAddressProviderPeer),
						UseForPeeringService:   pulumi.Bool(false),
					},
					&peering.DirectConnectionArgs{
						BandwidthInMbps:        pulumi.Int(10000),
						ConnectionIdentifier:   pulumi.String("8AB00818-D533-4504-A25A-03A17F61201C"),
						PeeringDBFacilityId:    pulumi.Int(99999),
						SessionAddressProvider: pulumi.String(peering.SessionAddressProviderMicrosoft),
						UseForPeeringService:   pulumi.Bool(true),
					},
				},
				DirectPeeringType: pulumi.String(peering.DirectPeeringTypeEdge),
				PeerAsn: &peering.SubResourceArgs{
					Id: pulumi.String("/subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1"),
				},
			},
			Kind:              pulumi.String(peering.KindDirect),
			Location:          pulumi.String("eastus"),
			PeeringLocation:   pulumi.String("peeringLocation0"),
			PeeringName:       pulumi.String("peeringName"),
			ResourceGroupName: pulumi.String("rgName"),
			Sku: &peering.PeeringSkuArgs{
				Name: pulumi.String("Basic_Direct_Free"),
			},
		})
		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 peering = new AzureNative.Peering.Peering("peering", new()
    {
        Direct = new AzureNative.Peering.Inputs.PeeringPropertiesDirectArgs
        {
            Connections = new[]
            {
                new AzureNative.Peering.Inputs.DirectConnectionArgs
                {
                    BandwidthInMbps = 10000,
                    BgpSession = new AzureNative.Peering.Inputs.BgpSessionArgs
                    {
                        MaxPrefixesAdvertisedV4 = 1000,
                        MaxPrefixesAdvertisedV6 = 100,
                        Md5AuthenticationKey = "test-md5-auth-key",
                        SessionPrefixV4 = "192.168.0.0/31",
                        SessionPrefixV6 = "fd00::0/127",
                    },
                    ConnectionIdentifier = "5F4CB5C7-6B43-4444-9338-9ABC72606C16",
                    PeeringDBFacilityId = 99999,
                    SessionAddressProvider = AzureNative.Peering.SessionAddressProvider.Peer,
                    UseForPeeringService = false,
                },
                new AzureNative.Peering.Inputs.DirectConnectionArgs
                {
                    BandwidthInMbps = 10000,
                    ConnectionIdentifier = "8AB00818-D533-4504-A25A-03A17F61201C",
                    PeeringDBFacilityId = 99999,
                    SessionAddressProvider = AzureNative.Peering.SessionAddressProvider.Microsoft,
                    UseForPeeringService = true,
                },
            },
            DirectPeeringType = AzureNative.Peering.DirectPeeringType.Edge,
            PeerAsn = new AzureNative.Peering.Inputs.SubResourceArgs
            {
                Id = "/subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1",
            },
        },
        Kind = AzureNative.Peering.Kind.Direct,
        Location = "eastus",
        PeeringLocation = "peeringLocation0",
        PeeringName = "peeringName",
        ResourceGroupName = "rgName",
        Sku = new AzureNative.Peering.Inputs.PeeringSkuArgs
        {
            Name = "Basic_Direct_Free",
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.peering.Peering;
import com.pulumi.azurenative.peering.PeeringArgs;
import com.pulumi.azurenative.peering.inputs.PeeringPropertiesDirectArgs;
import com.pulumi.azurenative.peering.inputs.SubResourceArgs;
import com.pulumi.azurenative.peering.inputs.PeeringSkuArgs;
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 peering = new Peering("peering", PeeringArgs.builder()
            .direct(PeeringPropertiesDirectArgs.builder()
                .connections(                
                    DirectConnectionArgs.builder()
                        .bandwidthInMbps(10000)
                        .bgpSession(BgpSessionArgs.builder()
                            .maxPrefixesAdvertisedV4(1000)
                            .maxPrefixesAdvertisedV6(100)
                            .md5AuthenticationKey("test-md5-auth-key")
                            .sessionPrefixV4("192.168.0.0/31")
                            .sessionPrefixV6("fd00::0/127")
                            .build())
                        .connectionIdentifier("5F4CB5C7-6B43-4444-9338-9ABC72606C16")
                        .peeringDBFacilityId(99999)
                        .sessionAddressProvider("Peer")
                        .useForPeeringService(false)
                        .build(),
                    DirectConnectionArgs.builder()
                        .bandwidthInMbps(10000)
                        .connectionIdentifier("8AB00818-D533-4504-A25A-03A17F61201C")
                        .peeringDBFacilityId(99999)
                        .sessionAddressProvider("Microsoft")
                        .useForPeeringService(true)
                        .build())
                .directPeeringType("Edge")
                .peerAsn(SubResourceArgs.builder()
                    .id("/subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1")
                    .build())
                .build())
            .kind("Direct")
            .location("eastus")
            .peeringLocation("peeringLocation0")
            .peeringName("peeringName")
            .resourceGroupName("rgName")
            .sku(PeeringSkuArgs.builder()
                .name("Basic_Direct_Free")
                .build())
            .build());

    }
}
resources:
  peering:
    type: azure-native:peering:Peering
    properties:
      direct:
        connections:
          - bandwidthInMbps: 10000
            bgpSession:
              maxPrefixesAdvertisedV4: 1000
              maxPrefixesAdvertisedV6: 100
              md5AuthenticationKey: test-md5-auth-key
              sessionPrefixV4: 192.168.0.0/31
              sessionPrefixV6: fd00::0/127
            connectionIdentifier: 5F4CB5C7-6B43-4444-9338-9ABC72606C16
            peeringDBFacilityId: 99999
            sessionAddressProvider: Peer
            useForPeeringService: false
          - bandwidthInMbps: 10000
            connectionIdentifier: 8AB00818-D533-4504-A25A-03A17F61201C
            peeringDBFacilityId: 99999
            sessionAddressProvider: Microsoft
            useForPeeringService: true
        directPeeringType: Edge
        peerAsn:
          id: /subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1
      kind: Direct
      location: eastus
      peeringLocation: peeringLocation0
      peeringName: peeringName
      resourceGroupName: rgName
      sku:
        name: Basic_Direct_Free

The direct property defines the peering type and connections array. Each connection specifies bandwidthInMbps (the physical port capacity), a bgpSession block with IPv4/IPv6 prefixes and prefix limits, and a connectionIdentifier matching your physical port assignment. The sessionAddressProvider determines who allocates BGP session IPs: set to “Peer” when you provide them, or “Microsoft” when Microsoft assigns them. The peerAsn references your registered ASN, and directPeeringType set to “Edge” indicates standard edge peering.

Connect to Azure Route Server via Internet Exchange

Azure Route Server (IxRs) enables dynamic routing between your network and Azure virtual networks through an Internet Exchange point, simplifying hybrid connectivity without dedicated circuits.

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

const peering = new azure_native.peering.Peering("peering", {
    direct: {
        connections: [{
            bandwidthInMbps: 10000,
            bgpSession: {
                maxPrefixesAdvertisedV4: 1000,
                maxPrefixesAdvertisedV6: 100,
                microsoftSessionIPv4Address: "192.168.0.123",
                peerSessionIPv4Address: "192.168.0.234",
                sessionPrefixV4: "192.168.0.0/24",
            },
            connectionIdentifier: "5F4CB5C7-6B43-4444-9338-9ABC72606C16",
            peeringDBFacilityId: 99999,
            sessionAddressProvider: azure_native.peering.SessionAddressProvider.Peer,
            useForPeeringService: true,
        }],
        directPeeringType: azure_native.peering.DirectPeeringType.IxRs,
        peerAsn: {
            id: "/subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1",
        },
    },
    kind: azure_native.peering.Kind.Direct,
    location: "eastus",
    peeringLocation: "peeringLocation0",
    peeringName: "peeringName",
    resourceGroupName: "rgName",
    sku: {
        name: "Premium_Direct_Free",
    },
});
import pulumi
import pulumi_azure_native as azure_native

peering = azure_native.peering.Peering("peering",
    direct={
        "connections": [{
            "bandwidth_in_mbps": 10000,
            "bgp_session": {
                "max_prefixes_advertised_v4": 1000,
                "max_prefixes_advertised_v6": 100,
                "microsoft_session_i_pv4_address": "192.168.0.123",
                "peer_session_i_pv4_address": "192.168.0.234",
                "session_prefix_v4": "192.168.0.0/24",
            },
            "connection_identifier": "5F4CB5C7-6B43-4444-9338-9ABC72606C16",
            "peering_db_facility_id": 99999,
            "session_address_provider": azure_native.peering.SessionAddressProvider.PEER,
            "use_for_peering_service": True,
        }],
        "direct_peering_type": azure_native.peering.DirectPeeringType.IX_RS,
        "peer_asn": {
            "id": "/subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1",
        },
    },
    kind=azure_native.peering.Kind.DIRECT,
    location="eastus",
    peering_location="peeringLocation0",
    peering_name="peeringName",
    resource_group_name="rgName",
    sku={
        "name": "Premium_Direct_Free",
    })
package main

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

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := peering.NewPeering(ctx, "peering", &peering.PeeringArgs{
			Direct: &peering.PeeringPropertiesDirectArgs{
				Connections: peering.DirectConnectionArray{
					&peering.DirectConnectionArgs{
						BandwidthInMbps: pulumi.Int(10000),
						BgpSession: &peering.BgpSessionArgs{
							MaxPrefixesAdvertisedV4:     pulumi.Int(1000),
							MaxPrefixesAdvertisedV6:     pulumi.Int(100),
							MicrosoftSessionIPv4Address: pulumi.String("192.168.0.123"),
							PeerSessionIPv4Address:      pulumi.String("192.168.0.234"),
							SessionPrefixV4:             pulumi.String("192.168.0.0/24"),
						},
						ConnectionIdentifier:   pulumi.String("5F4CB5C7-6B43-4444-9338-9ABC72606C16"),
						PeeringDBFacilityId:    pulumi.Int(99999),
						SessionAddressProvider: pulumi.String(peering.SessionAddressProviderPeer),
						UseForPeeringService:   pulumi.Bool(true),
					},
				},
				DirectPeeringType: pulumi.String(peering.DirectPeeringTypeIxRs),
				PeerAsn: &peering.SubResourceArgs{
					Id: pulumi.String("/subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1"),
				},
			},
			Kind:              pulumi.String(peering.KindDirect),
			Location:          pulumi.String("eastus"),
			PeeringLocation:   pulumi.String("peeringLocation0"),
			PeeringName:       pulumi.String("peeringName"),
			ResourceGroupName: pulumi.String("rgName"),
			Sku: &peering.PeeringSkuArgs{
				Name: pulumi.String("Premium_Direct_Free"),
			},
		})
		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 peering = new AzureNative.Peering.Peering("peering", new()
    {
        Direct = new AzureNative.Peering.Inputs.PeeringPropertiesDirectArgs
        {
            Connections = new[]
            {
                new AzureNative.Peering.Inputs.DirectConnectionArgs
                {
                    BandwidthInMbps = 10000,
                    BgpSession = new AzureNative.Peering.Inputs.BgpSessionArgs
                    {
                        MaxPrefixesAdvertisedV4 = 1000,
                        MaxPrefixesAdvertisedV6 = 100,
                        MicrosoftSessionIPv4Address = "192.168.0.123",
                        PeerSessionIPv4Address = "192.168.0.234",
                        SessionPrefixV4 = "192.168.0.0/24",
                    },
                    ConnectionIdentifier = "5F4CB5C7-6B43-4444-9338-9ABC72606C16",
                    PeeringDBFacilityId = 99999,
                    SessionAddressProvider = AzureNative.Peering.SessionAddressProvider.Peer,
                    UseForPeeringService = true,
                },
            },
            DirectPeeringType = AzureNative.Peering.DirectPeeringType.IxRs,
            PeerAsn = new AzureNative.Peering.Inputs.SubResourceArgs
            {
                Id = "/subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1",
            },
        },
        Kind = AzureNative.Peering.Kind.Direct,
        Location = "eastus",
        PeeringLocation = "peeringLocation0",
        PeeringName = "peeringName",
        ResourceGroupName = "rgName",
        Sku = new AzureNative.Peering.Inputs.PeeringSkuArgs
        {
            Name = "Premium_Direct_Free",
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.peering.Peering;
import com.pulumi.azurenative.peering.PeeringArgs;
import com.pulumi.azurenative.peering.inputs.PeeringPropertiesDirectArgs;
import com.pulumi.azurenative.peering.inputs.SubResourceArgs;
import com.pulumi.azurenative.peering.inputs.PeeringSkuArgs;
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 peering = new Peering("peering", PeeringArgs.builder()
            .direct(PeeringPropertiesDirectArgs.builder()
                .connections(DirectConnectionArgs.builder()
                    .bandwidthInMbps(10000)
                    .bgpSession(BgpSessionArgs.builder()
                        .maxPrefixesAdvertisedV4(1000)
                        .maxPrefixesAdvertisedV6(100)
                        .microsoftSessionIPv4Address("192.168.0.123")
                        .peerSessionIPv4Address("192.168.0.234")
                        .sessionPrefixV4("192.168.0.0/24")
                        .build())
                    .connectionIdentifier("5F4CB5C7-6B43-4444-9338-9ABC72606C16")
                    .peeringDBFacilityId(99999)
                    .sessionAddressProvider("Peer")
                    .useForPeeringService(true)
                    .build())
                .directPeeringType("IxRs")
                .peerAsn(SubResourceArgs.builder()
                    .id("/subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1")
                    .build())
                .build())
            .kind("Direct")
            .location("eastus")
            .peeringLocation("peeringLocation0")
            .peeringName("peeringName")
            .resourceGroupName("rgName")
            .sku(PeeringSkuArgs.builder()
                .name("Premium_Direct_Free")
                .build())
            .build());

    }
}
resources:
  peering:
    type: azure-native:peering:Peering
    properties:
      direct:
        connections:
          - bandwidthInMbps: 10000
            bgpSession:
              maxPrefixesAdvertisedV4: 1000
              maxPrefixesAdvertisedV6: 100
              microsoftSessionIPv4Address: 192.168.0.123
              peerSessionIPv4Address: 192.168.0.234
              sessionPrefixV4: 192.168.0.0/24
            connectionIdentifier: 5F4CB5C7-6B43-4444-9338-9ABC72606C16
            peeringDBFacilityId: 99999
            sessionAddressProvider: Peer
            useForPeeringService: true
        directPeeringType: IxRs
        peerAsn:
          id: /subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1
      kind: Direct
      location: eastus
      peeringLocation: peeringLocation0
      peeringName: peeringName
      resourceGroupName: rgName
      sku:
        name: Premium_Direct_Free

Setting directPeeringType to “IxRs” configures the peering for Azure Route Server integration. The bgpSession includes microsoftSessionIPv4Address and peerSessionIPv4Address, which define the BGP neighbor relationship. When useForPeeringService is true, the connection can be used for Azure Peering Service, which optimizes routing to Microsoft services. The Premium_Direct_Free SKU is required for Route Server peering.

Peer at an Internet Exchange point

Internet Exchange peering connects networks through shared switching fabric at IX facilities, enabling efficient traffic exchange with multiple networks including Microsoft services.

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

const peering = new azure_native.peering.Peering("peering", {
    exchange: {
        connections: [
            {
                bgpSession: {
                    maxPrefixesAdvertisedV4: 1000,
                    maxPrefixesAdvertisedV6: 100,
                    md5AuthenticationKey: "test-md5-auth-key",
                    peerSessionIPv4Address: "192.168.2.1",
                    peerSessionIPv6Address: "fd00::1",
                },
                connectionIdentifier: "CE495334-0E94-4E51-8164-8116D6CD284D",
                peeringDBFacilityId: 99999,
            },
            {
                bgpSession: {
                    maxPrefixesAdvertisedV4: 1000,
                    maxPrefixesAdvertisedV6: 100,
                    md5AuthenticationKey: "test-md5-auth-key",
                    peerSessionIPv4Address: "192.168.2.2",
                    peerSessionIPv6Address: "fd00::2",
                },
                connectionIdentifier: "CDD8E673-CB07-47E6-84DE-3739F778762B",
                peeringDBFacilityId: 99999,
            },
        ],
        peerAsn: {
            id: "/subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1",
        },
    },
    kind: azure_native.peering.Kind.Exchange,
    location: "eastus",
    peeringLocation: "peeringLocation0",
    peeringName: "peeringName",
    resourceGroupName: "rgName",
    sku: {
        name: "Basic_Exchange_Free",
    },
});
import pulumi
import pulumi_azure_native as azure_native

peering = azure_native.peering.Peering("peering",
    exchange={
        "connections": [
            {
                "bgp_session": {
                    "max_prefixes_advertised_v4": 1000,
                    "max_prefixes_advertised_v6": 100,
                    "md5_authentication_key": "test-md5-auth-key",
                    "peer_session_i_pv4_address": "192.168.2.1",
                    "peer_session_i_pv6_address": "fd00::1",
                },
                "connection_identifier": "CE495334-0E94-4E51-8164-8116D6CD284D",
                "peering_db_facility_id": 99999,
            },
            {
                "bgp_session": {
                    "max_prefixes_advertised_v4": 1000,
                    "max_prefixes_advertised_v6": 100,
                    "md5_authentication_key": "test-md5-auth-key",
                    "peer_session_i_pv4_address": "192.168.2.2",
                    "peer_session_i_pv6_address": "fd00::2",
                },
                "connection_identifier": "CDD8E673-CB07-47E6-84DE-3739F778762B",
                "peering_db_facility_id": 99999,
            },
        ],
        "peer_asn": {
            "id": "/subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1",
        },
    },
    kind=azure_native.peering.Kind.EXCHANGE,
    location="eastus",
    peering_location="peeringLocation0",
    peering_name="peeringName",
    resource_group_name="rgName",
    sku={
        "name": "Basic_Exchange_Free",
    })
package main

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

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := peering.NewPeering(ctx, "peering", &peering.PeeringArgs{
			Exchange: &peering.PeeringPropertiesExchangeArgs{
				Connections: peering.ExchangeConnectionArray{
					&peering.ExchangeConnectionArgs{
						BgpSession: &peering.BgpSessionArgs{
							MaxPrefixesAdvertisedV4: pulumi.Int(1000),
							MaxPrefixesAdvertisedV6: pulumi.Int(100),
							Md5AuthenticationKey:    pulumi.String("test-md5-auth-key"),
							PeerSessionIPv4Address:  pulumi.String("192.168.2.1"),
							PeerSessionIPv6Address:  pulumi.String("fd00::1"),
						},
						ConnectionIdentifier: pulumi.String("CE495334-0E94-4E51-8164-8116D6CD284D"),
						PeeringDBFacilityId:  pulumi.Int(99999),
					},
					&peering.ExchangeConnectionArgs{
						BgpSession: &peering.BgpSessionArgs{
							MaxPrefixesAdvertisedV4: pulumi.Int(1000),
							MaxPrefixesAdvertisedV6: pulumi.Int(100),
							Md5AuthenticationKey:    pulumi.String("test-md5-auth-key"),
							PeerSessionIPv4Address:  pulumi.String("192.168.2.2"),
							PeerSessionIPv6Address:  pulumi.String("fd00::2"),
						},
						ConnectionIdentifier: pulumi.String("CDD8E673-CB07-47E6-84DE-3739F778762B"),
						PeeringDBFacilityId:  pulumi.Int(99999),
					},
				},
				PeerAsn: &peering.SubResourceArgs{
					Id: pulumi.String("/subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1"),
				},
			},
			Kind:              pulumi.String(peering.KindExchange),
			Location:          pulumi.String("eastus"),
			PeeringLocation:   pulumi.String("peeringLocation0"),
			PeeringName:       pulumi.String("peeringName"),
			ResourceGroupName: pulumi.String("rgName"),
			Sku: &peering.PeeringSkuArgs{
				Name: pulumi.String("Basic_Exchange_Free"),
			},
		})
		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 peering = new AzureNative.Peering.Peering("peering", new()
    {
        Exchange = new AzureNative.Peering.Inputs.PeeringPropertiesExchangeArgs
        {
            Connections = new[]
            {
                new AzureNative.Peering.Inputs.ExchangeConnectionArgs
                {
                    BgpSession = new AzureNative.Peering.Inputs.BgpSessionArgs
                    {
                        MaxPrefixesAdvertisedV4 = 1000,
                        MaxPrefixesAdvertisedV6 = 100,
                        Md5AuthenticationKey = "test-md5-auth-key",
                        PeerSessionIPv4Address = "192.168.2.1",
                        PeerSessionIPv6Address = "fd00::1",
                    },
                    ConnectionIdentifier = "CE495334-0E94-4E51-8164-8116D6CD284D",
                    PeeringDBFacilityId = 99999,
                },
                new AzureNative.Peering.Inputs.ExchangeConnectionArgs
                {
                    BgpSession = new AzureNative.Peering.Inputs.BgpSessionArgs
                    {
                        MaxPrefixesAdvertisedV4 = 1000,
                        MaxPrefixesAdvertisedV6 = 100,
                        Md5AuthenticationKey = "test-md5-auth-key",
                        PeerSessionIPv4Address = "192.168.2.2",
                        PeerSessionIPv6Address = "fd00::2",
                    },
                    ConnectionIdentifier = "CDD8E673-CB07-47E6-84DE-3739F778762B",
                    PeeringDBFacilityId = 99999,
                },
            },
            PeerAsn = new AzureNative.Peering.Inputs.SubResourceArgs
            {
                Id = "/subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1",
            },
        },
        Kind = AzureNative.Peering.Kind.Exchange,
        Location = "eastus",
        PeeringLocation = "peeringLocation0",
        PeeringName = "peeringName",
        ResourceGroupName = "rgName",
        Sku = new AzureNative.Peering.Inputs.PeeringSkuArgs
        {
            Name = "Basic_Exchange_Free",
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.peering.Peering;
import com.pulumi.azurenative.peering.PeeringArgs;
import com.pulumi.azurenative.peering.inputs.PeeringPropertiesExchangeArgs;
import com.pulumi.azurenative.peering.inputs.SubResourceArgs;
import com.pulumi.azurenative.peering.inputs.PeeringSkuArgs;
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 peering = new Peering("peering", PeeringArgs.builder()
            .exchange(PeeringPropertiesExchangeArgs.builder()
                .connections(                
                    ExchangeConnectionArgs.builder()
                        .bgpSession(BgpSessionArgs.builder()
                            .maxPrefixesAdvertisedV4(1000)
                            .maxPrefixesAdvertisedV6(100)
                            .md5AuthenticationKey("test-md5-auth-key")
                            .peerSessionIPv4Address("192.168.2.1")
                            .peerSessionIPv6Address("fd00::1")
                            .build())
                        .connectionIdentifier("CE495334-0E94-4E51-8164-8116D6CD284D")
                        .peeringDBFacilityId(99999)
                        .build(),
                    ExchangeConnectionArgs.builder()
                        .bgpSession(BgpSessionArgs.builder()
                            .maxPrefixesAdvertisedV4(1000)
                            .maxPrefixesAdvertisedV6(100)
                            .md5AuthenticationKey("test-md5-auth-key")
                            .peerSessionIPv4Address("192.168.2.2")
                            .peerSessionIPv6Address("fd00::2")
                            .build())
                        .connectionIdentifier("CDD8E673-CB07-47E6-84DE-3739F778762B")
                        .peeringDBFacilityId(99999)
                        .build())
                .peerAsn(SubResourceArgs.builder()
                    .id("/subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1")
                    .build())
                .build())
            .kind("Exchange")
            .location("eastus")
            .peeringLocation("peeringLocation0")
            .peeringName("peeringName")
            .resourceGroupName("rgName")
            .sku(PeeringSkuArgs.builder()
                .name("Basic_Exchange_Free")
                .build())
            .build());

    }
}
resources:
  peering:
    type: azure-native:peering:Peering
    properties:
      exchange:
        connections:
          - bgpSession:
              maxPrefixesAdvertisedV4: 1000
              maxPrefixesAdvertisedV6: 100
              md5AuthenticationKey: test-md5-auth-key
              peerSessionIPv4Address: 192.168.2.1
              peerSessionIPv6Address: fd00::1
            connectionIdentifier: CE495334-0E94-4E51-8164-8116D6CD284D
            peeringDBFacilityId: 99999
          - bgpSession:
              maxPrefixesAdvertisedV4: 1000
              maxPrefixesAdvertisedV6: 100
              md5AuthenticationKey: test-md5-auth-key
              peerSessionIPv4Address: 192.168.2.2
              peerSessionIPv6Address: fd00::2
            connectionIdentifier: CDD8E673-CB07-47E6-84DE-3739F778762B
            peeringDBFacilityId: 99999
        peerAsn:
          id: /subscriptions/subId/providers/Microsoft.Peering/peerAsns/myAsn1
      kind: Exchange
      location: eastus
      peeringLocation: peeringLocation0
      peeringName: peeringName
      resourceGroupName: rgName
      sku:
        name: Basic_Exchange_Free

The exchange property replaces direct for IX-based peering. Each connection in the connections array specifies peerSessionIPv4Address and peerSessionIPv6Address (assigned by the IX operator), a connectionIdentifier (your port ID at the IX), and peeringDBFacilityId (the facility’s PeeringDB identifier). The bgpSession block sets prefix advertisement limits and optional MD5 authentication. The Basic_Exchange_Free SKU applies to IX peering.

Beyond these examples

These snippets focus on specific peering features: direct and exchange peering types, BGP session configuration (IPv4/IPv6, MD5 auth, prefix limits), and Azure Route Server integration. They’re intentionally minimal rather than full network interconnection designs.

The examples reference pre-existing infrastructure such as PeerAsn resources (registered ASN with Microsoft), physical cross-connects or IX port assignments, and PeeringDB facility memberships. They focus on configuring the peering relationship rather than provisioning the underlying network infrastructure.

To keep things focused, common peering patterns are omitted, including:

  • Resource tagging (tags property)
  • Multiple peering locations in one resource
  • Peering Service enablement details
  • Connection state monitoring and troubleshooting

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

Let's configure Azure Peering Connections

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

Try Pulumi Cloud for FREE

Frequently Asked Questions

Peering Types & Configuration
What's the difference between Direct and Exchange peering?
Direct peering connects directly to Microsoft’s network edge, while Exchange peering connects through an internet exchange point. Set kind to “Direct” or “Exchange” and use the corresponding direct or exchange configuration object.
What's the difference between Edge and IxRs direct peering types?
Edge is for standard direct peering to Microsoft’s network, while IxRs (Internet Exchange Route Server) is for peering with exchange route servers. IxRs requires the Premium SKU and explicit IP address configuration using microsoftSessionIPv4Address and peerSessionIPv4Address.
How do I choose the right SKU for my peering?
SKU names follow the pattern [Tier]_[Kind]_Free. Use Basic_Direct_Free or Basic_Exchange_Free for standard peering, and Premium_Direct_Free for advanced features like IxRs peering.
Immutability & Lifecycle
What properties can't be changed after creating a peering?
The location, peeringName, and resourceGroupName properties are immutable and cannot be modified after creation.
How do I use a different Azure API version for the Peering resource?
Generate a local SDK package using pulumi package add azure-native peering [ApiVersion]. The default is 2022-10-01, with 2025-05-01 also available.
Connections & BGP Sessions
Can I configure multiple connections for a single peering?
Yes, you can define multiple connections in the connections array for both direct and exchange peering to provide redundancy.
When should I use sessionAddressProvider: Microsoft vs Peer?
Set sessionAddressProvider to “Peer” when you provide the BGP session IP addresses, or “Microsoft” when Microsoft provides them. When using “Microsoft”, you don’t need to specify session prefixes.
What's the useForPeeringService flag for?
Set useForPeeringService to true when the connection will be used for Azure Peering Service, which provides optimized routing for Microsoft 365 and other services.
How do I configure BGP session authentication?
Set md5AuthenticationKey in the bgpSession object to enable MD5 authentication for the BGP session.
What are the BGP prefix advertisement limits?
Configure maxPrefixesAdvertisedV4 and maxPrefixesAdvertisedV6 in the bgpSession object. Examples show 1000 for IPv4 and 100 for IPv6.

Using a different cloud?

Explore networking guides for other cloud providers: