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 FREEFrequently Asked Questions
Addon Types & Configuration
addonType to “Arc” and provide the vCenter property with the full resource ID of your Microsoft.ConnectedVMwarevSphere/VCenters resource.addonType to “HCX” and provide the offer property, such as “VMware MaaS Cloud Provider (Enterprise)”.addonType to “SRM” and provide your licenseKey property with a valid license key string.addonType to “VR” and specify the vrsCount property with the number of vSphere Replication servers you need.Resource Management
addonName, privateCloudName, and resourceGroupName properties are immutable. Changing any of these requires replacing the resource.pulumi import azure-native:avs:Addon with the resource path format: /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.AVS/privateClouds/{privateCloudName}/addons/{addonName}.API Versions
pulumi package add azure-native avs [ApiVersion]. Available versions include 2022-05-01, 2023-03-01, 2024-09-01, and 2025-09-01.