Configure Azure VMware Solution Addons

The azure-native:avs:Addon resource, part of the Pulumi Azure Native provider, attaches VMware add-on services to an Azure VMware Solution private cloud. This guide focuses on four capabilities: HCX for workload migration, Site Recovery Manager for disaster recovery, vSphere Replication for VM-level protection, and Azure Arc integration for unified management.

Addons extend an existing Azure VMware Solution private cloud with additional VMware services. The examples are intentionally small. Combine them with your own private cloud infrastructure and operational requirements.

Enable HCX for workload migration

Teams migrating VMware workloads to Azure VMware Solution often start with HCX, which provides live migration, disaster recovery, and network extension between on-premises and cloud environments.

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

const addon = new azure_native.avs.Addon("addon", {
    addonName: "hcx",
    privateCloudName: "cloud1",
    properties: {
        addonType: "HCX",
        offer: "VMware MaaS Cloud Provider (Enterprise)",
    },
    resourceGroupName: "group1",
});
import pulumi
import pulumi_azure_native as azure_native

addon = azure_native.avs.Addon("addon",
    addon_name="hcx",
    private_cloud_name="cloud1",
    properties={
        "addon_type": "HCX",
        "offer": "VMware MaaS Cloud Provider (Enterprise)",
    },
    resource_group_name="group1")
package main

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

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := avs.NewAddon(ctx, "addon", &avs.AddonArgs{
			AddonName:        pulumi.String("hcx"),
			PrivateCloudName: pulumi.String("cloud1"),
			Properties: &avs.AddonHcxPropertiesArgs{
				AddonType: pulumi.String("HCX"),
				Offer:     pulumi.String("VMware MaaS Cloud Provider (Enterprise)"),
			},
			ResourceGroupName: pulumi.String("group1"),
		})
		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 addon = new AzureNative.AVS.Addon("addon", new()
    {
        AddonName = "hcx",
        PrivateCloudName = "cloud1",
        Properties = new AzureNative.AVS.Inputs.AddonHcxPropertiesArgs
        {
            AddonType = "HCX",
            Offer = "VMware MaaS Cloud Provider (Enterprise)",
        },
        ResourceGroupName = "group1",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.avs.Addon;
import com.pulumi.azurenative.avs.AddonArgs;
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 addon = new Addon("addon", AddonArgs.builder()
            .addonName("hcx")
            .privateCloudName("cloud1")
            .properties(AddonHcxPropertiesArgs.builder()
                .addonType("HCX")
                .offer("VMware MaaS Cloud Provider (Enterprise)")
                .build())
            .resourceGroupName("group1")
            .build());

    }
}
resources:
  addon:
    type: azure-native:avs:Addon
    properties:
      addonName: hcx
      privateCloudName: cloud1
      properties:
        addonType: HCX
        offer: VMware MaaS Cloud Provider (Enterprise)
      resourceGroupName: group1

The addonType property specifies “HCX” to enable the HCX service. The offer property selects the HCX edition; “VMware MaaS Cloud Provider (Enterprise)” provides the full feature set. The addon attaches to the private cloud specified by privateCloudName.

Configure Site Recovery Manager with license key

Organizations implementing disaster recovery use Site Recovery Manager to orchestrate failover and failback operations between sites.

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

const addon = new azure_native.avs.Addon("addon", {
    addonName: "srm",
    privateCloudName: "cloud1",
    properties: {
        addonType: "SRM",
        licenseKey: "41915178-A8FF-4A4D-B683-6D735AF5E3F5",
    },
    resourceGroupName: "group1",
});
import pulumi
import pulumi_azure_native as azure_native

addon = azure_native.avs.Addon("addon",
    addon_name="srm",
    private_cloud_name="cloud1",
    properties={
        "addon_type": "SRM",
        "license_key": "41915178-A8FF-4A4D-B683-6D735AF5E3F5",
    },
    resource_group_name="group1")
package main

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

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := avs.NewAddon(ctx, "addon", &avs.AddonArgs{
			AddonName:        pulumi.String("srm"),
			PrivateCloudName: pulumi.String("cloud1"),
			Properties: &avs.AddonSrmPropertiesArgs{
				AddonType:  pulumi.String("SRM"),
				LicenseKey: pulumi.String("41915178-A8FF-4A4D-B683-6D735AF5E3F5"),
			},
			ResourceGroupName: pulumi.String("group1"),
		})
		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 addon = new AzureNative.AVS.Addon("addon", new()
    {
        AddonName = "srm",
        PrivateCloudName = "cloud1",
        Properties = new AzureNative.AVS.Inputs.AddonSrmPropertiesArgs
        {
            AddonType = "SRM",
            LicenseKey = "41915178-A8FF-4A4D-B683-6D735AF5E3F5",
        },
        ResourceGroupName = "group1",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.avs.Addon;
import com.pulumi.azurenative.avs.AddonArgs;
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 addon = new Addon("addon", AddonArgs.builder()
            .addonName("srm")
            .privateCloudName("cloud1")
            .properties(AddonSrmPropertiesArgs.builder()
                .addonType("SRM")
                .licenseKey("41915178-A8FF-4A4D-B683-6D735AF5E3F5")
                .build())
            .resourceGroupName("group1")
            .build());

    }
}
resources:
  addon:
    type: azure-native:avs:Addon
    properties:
      addonName: srm
      privateCloudName: cloud1
      properties:
        addonType: SRM
        licenseKey: 41915178-A8FF-4A4D-B683-6D735AF5E3F5
      resourceGroupName: group1

The addonType property specifies “SRM” to enable Site Recovery Manager. The licenseKey property provides your VMware SRM license; you must obtain this from VMware before deployment. SRM coordinates disaster recovery workflows across your VMware infrastructure.

Deploy vSphere Replication appliances

vSphere Replication provides VM-level replication for disaster recovery, allowing you to replicate VMs between sites without shared storage.

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

const addon = new azure_native.avs.Addon("addon", {
    addonName: "vr",
    privateCloudName: "cloud1",
    properties: {
        addonType: "VR",
        vrsCount: 1,
    },
    resourceGroupName: "group1",
});
import pulumi
import pulumi_azure_native as azure_native

addon = azure_native.avs.Addon("addon",
    addon_name="vr",
    private_cloud_name="cloud1",
    properties={
        "addon_type": "VR",
        "vrs_count": 1,
    },
    resource_group_name="group1")
package main

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

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := avs.NewAddon(ctx, "addon", &avs.AddonArgs{
			AddonName:        pulumi.String("vr"),
			PrivateCloudName: pulumi.String("cloud1"),
			Properties: &avs.AddonVrPropertiesArgs{
				AddonType: pulumi.String("VR"),
				VrsCount:  pulumi.Int(1),
			},
			ResourceGroupName: pulumi.String("group1"),
		})
		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 addon = new AzureNative.AVS.Addon("addon", new()
    {
        AddonName = "vr",
        PrivateCloudName = "cloud1",
        Properties = new AzureNative.AVS.Inputs.AddonVrPropertiesArgs
        {
            AddonType = "VR",
            VrsCount = 1,
        },
        ResourceGroupName = "group1",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.avs.Addon;
import com.pulumi.azurenative.avs.AddonArgs;
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 addon = new Addon("addon", AddonArgs.builder()
            .addonName("vr")
            .privateCloudName("cloud1")
            .properties(AddonVrPropertiesArgs.builder()
                .addonType("VR")
                .vrsCount(1)
                .build())
            .resourceGroupName("group1")
            .build());

    }
}
resources:
  addon:
    type: azure-native:avs:Addon
    properties:
      addonName: vr
      privateCloudName: cloud1
      properties:
        addonType: VR
        vrsCount: 1
      resourceGroupName: group1

The addonType property specifies “VR” to enable vSphere Replication. The vrsCount property controls how many vSphere Replication appliances to deploy; start with 1 and scale based on replication workload. Each appliance handles replication traffic for a subset of VMs.

Connect to Azure Arc for unified management

Azure Arc integration extends Azure management capabilities to VMware VMs, enabling unified governance, monitoring, and policy enforcement across hybrid environments.

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

const addon = new azure_native.avs.Addon("addon", {
    addonName: "arc",
    privateCloudName: "cloud1",
    properties: {
        addonType: "Arc",
        vCenter: "subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg_test/providers/Microsoft.ConnectedVMwarevSphere/VCenters/test-vcenter",
    },
    resourceGroupName: "group1",
});
import pulumi
import pulumi_azure_native as azure_native

addon = azure_native.avs.Addon("addon",
    addon_name="arc",
    private_cloud_name="cloud1",
    properties={
        "addon_type": "Arc",
        "v_center": "subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg_test/providers/Microsoft.ConnectedVMwarevSphere/VCenters/test-vcenter",
    },
    resource_group_name="group1")
package main

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

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := avs.NewAddon(ctx, "addon", &avs.AddonArgs{
			AddonName:        pulumi.String("arc"),
			PrivateCloudName: pulumi.String("cloud1"),
			Properties: &avs.AddonArcPropertiesArgs{
				AddonType: pulumi.String("Arc"),
				VCenter:   pulumi.String("subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg_test/providers/Microsoft.ConnectedVMwarevSphere/VCenters/test-vcenter"),
			},
			ResourceGroupName: pulumi.String("group1"),
		})
		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 addon = new AzureNative.AVS.Addon("addon", new()
    {
        AddonName = "arc",
        PrivateCloudName = "cloud1",
        Properties = new AzureNative.AVS.Inputs.AddonArcPropertiesArgs
        {
            AddonType = "Arc",
            VCenter = "subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg_test/providers/Microsoft.ConnectedVMwarevSphere/VCenters/test-vcenter",
        },
        ResourceGroupName = "group1",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.avs.Addon;
import com.pulumi.azurenative.avs.AddonArgs;
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 addon = new Addon("addon", AddonArgs.builder()
            .addonName("arc")
            .privateCloudName("cloud1")
            .properties(AddonArcPropertiesArgs.builder()
                .addonType("Arc")
                .vCenter("subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg_test/providers/Microsoft.ConnectedVMwarevSphere/VCenters/test-vcenter")
                .build())
            .resourceGroupName("group1")
            .build());

    }
}
resources:
  addon:
    type: azure-native:avs:Addon
    properties:
      addonName: arc
      privateCloudName: cloud1
      properties:
        addonType: Arc
        vCenter: subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg_test/providers/Microsoft.ConnectedVMwarevSphere/VCenters/test-vcenter
      resourceGroupName: group1

The addonType property specifies “Arc” to enable Azure Arc integration. The vCenter property references an existing Azure Arc vCenter resource by its full resource ID. This connection allows Azure to discover and manage VMs running in your private cloud.

Beyond these examples

These snippets focus on specific addon features: HCX migration and network extension, Site Recovery Manager and vSphere Replication, and Azure Arc integration. They’re intentionally minimal rather than full disaster recovery or migration solutions.

The examples reference pre-existing infrastructure such as Azure VMware Solution private cloud, resource group, and Azure Arc vCenter resource (for Arc addon). They focus on addon configuration rather than provisioning the underlying private cloud.

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

  • Addon lifecycle management (updates, deletions)
  • Addon status monitoring and health checks
  • Multi-addon coordination and dependencies
  • Custom addon configuration beyond basic properties

These omissions are intentional: the goal is to illustrate how each addon type is wired, not provide drop-in migration or disaster recovery modules. See the AVS Addon resource reference for all available configuration options.

Let's configure Azure VMware Solution Addons

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

Try Pulumi Cloud for FREE

Frequently Asked Questions

Addon Types & Configuration
What addon types are available for Azure VMware Solution private clouds?
Four addon types are available: Arc (Azure Arc integration), HCX (hybrid cloud extension), SRM (Site Recovery Manager), and VR (vSphere Replication). Each type requires different configuration properties.
How do I configure an Arc addon?
Set addonType to “Arc” and provide the vCenter property with the full resource ID of your Microsoft.ConnectedVMwarevSphere/VCenters resource.
How do I configure an HCX addon?
Set addonType to “HCX” and provide the offer property, such as “VMware MaaS Cloud Provider (Enterprise)”.
How do I configure an SRM addon?
Set addonType to “SRM” and provide your licenseKey property with a valid license key string.
How do I configure a VR addon?
Set addonType to “VR” and specify the vrsCount property with the number of vSphere Replication servers you need.
Resource Management
What properties can't I change after creating an addon?
The addonName, privateCloudName, and resourceGroupName properties are immutable. Changing any of these requires replacing the resource.
How do I import an existing addon into Pulumi?
Use pulumi import azure-native:avs:Addon with the resource path format: /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.AVS/privateClouds/{privateCloudName}/addons/{addonName}.
API Versions
How do I use a different API version for the Addon resource?
Generate a local SDK package using the Pulumi CLI command pulumi package add azure-native avs [ApiVersion]. Available versions include 2022-05-01, 2023-03-01, 2024-09-01, and 2025-09-01.

Using a different cloud?

Explore compute guides for other cloud providers: