Configure Azure Storage Mover Agents

The azure-native:storagemover:Agent resource, part of the Pulumi Azure Native provider, registers Azure Arc-enabled machines as Storage Mover agents that execute migration jobs. This guide focuses on three capabilities: agent registration with Arc machines, bandwidth throttling schedules, and multi-window time policies.

Agents require Azure Arc-enabled machines and an existing Storage Mover resource. The examples are intentionally small. Combine them with your own Arc infrastructure and Storage Mover deployments.

Register an agent with a Storage Mover

Storage Mover agents run on-premises or in Azure VMs to execute migration jobs, connecting Arc-enabled machines to Storage Mover resources.

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

const agent = new azure_native.storagemover.Agent("agent", {
    agentName: "examples-agentName",
    arcResourceId: "/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName",
    arcVmUuid: "3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9",
    resourceGroupName: "examples-rg",
    storageMoverName: "examples-storageMoverName",
});
import pulumi
import pulumi_azure_native as azure_native

agent = azure_native.storagemover.Agent("agent",
    agent_name="examples-agentName",
    arc_resource_id="/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName",
    arc_vm_uuid="3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9",
    resource_group_name="examples-rg",
    storage_mover_name="examples-storageMoverName")
package main

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

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := storagemover.NewAgent(ctx, "agent", &storagemover.AgentArgs{
			AgentName:         pulumi.String("examples-agentName"),
			ArcResourceId:     pulumi.String("/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName"),
			ArcVmUuid:         pulumi.String("3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9"),
			ResourceGroupName: pulumi.String("examples-rg"),
			StorageMoverName:  pulumi.String("examples-storageMoverName"),
		})
		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 agent = new AzureNative.StorageMover.Agent("agent", new()
    {
        AgentName = "examples-agentName",
        ArcResourceId = "/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName",
        ArcVmUuid = "3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9",
        ResourceGroupName = "examples-rg",
        StorageMoverName = "examples-storageMoverName",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.storagemover.Agent;
import com.pulumi.azurenative.storagemover.AgentArgs;
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 agent = new Agent("agent", AgentArgs.builder()
            .agentName("examples-agentName")
            .arcResourceId("/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName")
            .arcVmUuid("3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9")
            .resourceGroupName("examples-rg")
            .storageMoverName("examples-storageMoverName")
            .build());

    }
}
resources:
  agent:
    type: azure-native:storagemover:Agent
    properties:
      agentName: examples-agentName
      arcResourceId: /subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName
      arcVmUuid: 3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9
      resourceGroupName: examples-rg
      storageMoverName: examples-storageMoverName

The arcResourceId property points to your Azure Arc-enabled machine’s full resource path. The arcVmUuid identifies the specific VM instance. Together, these bind the agent to the Arc machine. The storageMoverName specifies which Storage Mover resource manages this agent.

Throttle bandwidth during business hours

Migration jobs can saturate WAN links during business hours, affecting production traffic.

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

const agent = new azure_native.storagemover.Agent("agent", {
    agentName: "examples-agentName",
    arcResourceId: "/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName",
    arcVmUuid: "3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9",
    description: "Example Agent Description",
    resourceGroupName: "examples-rg",
    storageMoverName: "examples-storageMoverName",
    uploadLimitSchedule: {
        weeklyRecurrences: [{
            days: [azure_native.storagemover.DayOfWeek.Monday],
            endTime: {
                hour: 18,
                minute: 30,
            },
            limitInMbps: 2000,
            startTime: {
                hour: 9,
                minute: 0,
            },
        }],
    },
});
import pulumi
import pulumi_azure_native as azure_native

agent = azure_native.storagemover.Agent("agent",
    agent_name="examples-agentName",
    arc_resource_id="/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName",
    arc_vm_uuid="3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9",
    description="Example Agent Description",
    resource_group_name="examples-rg",
    storage_mover_name="examples-storageMoverName",
    upload_limit_schedule={
        "weekly_recurrences": [{
            "days": [azure_native.storagemover.DayOfWeek.MONDAY],
            "end_time": {
                "hour": 18,
                "minute": 30,
            },
            "limit_in_mbps": 2000,
            "start_time": {
                "hour": 9,
                "minute": 0,
            },
        }],
    })
package main

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

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := storagemover.NewAgent(ctx, "agent", &storagemover.AgentArgs{
			AgentName:         pulumi.String("examples-agentName"),
			ArcResourceId:     pulumi.String("/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName"),
			ArcVmUuid:         pulumi.String("3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9"),
			Description:       pulumi.String("Example Agent Description"),
			ResourceGroupName: pulumi.String("examples-rg"),
			StorageMoverName:  pulumi.String("examples-storageMoverName"),
			UploadLimitSchedule: &storagemover.UploadLimitScheduleArgs{
				WeeklyRecurrences: storagemover.UploadLimitWeeklyRecurrenceArray{
					&storagemover.UploadLimitWeeklyRecurrenceArgs{
						Days: storagemover.DayOfWeekArray{
							storagemover.DayOfWeekMonday,
						},
						EndTime: &storagemover.TimeArgs{
							Hour:   pulumi.Int(18),
							Minute: pulumi.Float64(30),
						},
						LimitInMbps: pulumi.Int(2000),
						StartTime: &storagemover.TimeArgs{
							Hour:   pulumi.Int(9),
							Minute: pulumi.Float64(0),
						},
					},
				},
			},
		})
		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 agent = new AzureNative.StorageMover.Agent("agent", new()
    {
        AgentName = "examples-agentName",
        ArcResourceId = "/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName",
        ArcVmUuid = "3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9",
        Description = "Example Agent Description",
        ResourceGroupName = "examples-rg",
        StorageMoverName = "examples-storageMoverName",
        UploadLimitSchedule = new AzureNative.StorageMover.Inputs.UploadLimitScheduleArgs
        {
            WeeklyRecurrences = new[]
            {
                new AzureNative.StorageMover.Inputs.UploadLimitWeeklyRecurrenceArgs
                {
                    Days = new[]
                    {
                        AzureNative.StorageMover.DayOfWeek.Monday,
                    },
                    EndTime = new AzureNative.StorageMover.Inputs.TimeArgs
                    {
                        Hour = 18,
                        Minute = 30,
                    },
                    LimitInMbps = 2000,
                    StartTime = new AzureNative.StorageMover.Inputs.TimeArgs
                    {
                        Hour = 9,
                        Minute = 0,
                    },
                },
            },
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.storagemover.Agent;
import com.pulumi.azurenative.storagemover.AgentArgs;
import com.pulumi.azurenative.storagemover.inputs.UploadLimitScheduleArgs;
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 agent = new Agent("agent", AgentArgs.builder()
            .agentName("examples-agentName")
            .arcResourceId("/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName")
            .arcVmUuid("3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9")
            .description("Example Agent Description")
            .resourceGroupName("examples-rg")
            .storageMoverName("examples-storageMoverName")
            .uploadLimitSchedule(UploadLimitScheduleArgs.builder()
                .weeklyRecurrences(UploadLimitWeeklyRecurrenceArgs.builder()
                    .days("Monday")
                    .endTime(TimeArgs.builder()
                        .hour(18)
                        .minute(30.0)
                        .build())
                    .limitInMbps(2000)
                    .startTime(TimeArgs.builder()
                        .hour(9)
                        .minute(0.0)
                        .build())
                    .build())
                .build())
            .build());

    }
}
resources:
  agent:
    type: azure-native:storagemover:Agent
    properties:
      agentName: examples-agentName
      arcResourceId: /subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName
      arcVmUuid: 3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9
      description: Example Agent Description
      resourceGroupName: examples-rg
      storageMoverName: examples-storageMoverName
      uploadLimitSchedule:
        weeklyRecurrences:
          - days:
              - Monday
            endTime:
              hour: 18
              minute: 30
            limitInMbps: 2000
            startTime:
              hour: 9
              minute: 0

The uploadLimitSchedule property defines when bandwidth limits apply. Each weeklyRecurrences entry specifies days, start and end times, and a bandwidth cap in Mbps. Here, the agent limits uploads to 2000 Mbps (2 Gbps) on Mondays from 9:00 AM to 6:30 PM. Outside this window, the agent uses available bandwidth without restriction.

Schedule overnight and weekend bandwidth windows

Organizations often need different bandwidth limits for business hours versus off-hours, requiring schedules that span midnight.

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

const agent = new azure_native.storagemover.Agent("agent", {
    agentName: "examples-agentName",
    arcResourceId: "/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName",
    arcVmUuid: "3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9",
    resourceGroupName: "examples-rg",
    storageMoverName: "examples-storageMoverName",
    uploadLimitSchedule: {
        weeklyRecurrences: [
            {
                days: [
                    azure_native.storagemover.DayOfWeek.Monday,
                    azure_native.storagemover.DayOfWeek.Tuesday,
                    azure_native.storagemover.DayOfWeek.Wednesday,
                    azure_native.storagemover.DayOfWeek.Thursday,
                    azure_native.storagemover.DayOfWeek.Friday,
                    azure_native.storagemover.DayOfWeek.Saturday,
                    azure_native.storagemover.DayOfWeek.Sunday,
                ],
                endTime: {
                    hour: 24,
                    minute: 0,
                },
                limitInMbps: 2000,
                startTime: {
                    hour: 18,
                    minute: 0,
                },
            },
            {
                days: [
                    azure_native.storagemover.DayOfWeek.Monday,
                    azure_native.storagemover.DayOfWeek.Tuesday,
                    azure_native.storagemover.DayOfWeek.Wednesday,
                    azure_native.storagemover.DayOfWeek.Thursday,
                    azure_native.storagemover.DayOfWeek.Friday,
                    azure_native.storagemover.DayOfWeek.Saturday,
                    azure_native.storagemover.DayOfWeek.Sunday,
                ],
                endTime: {
                    hour: 9,
                    minute: 0,
                },
                limitInMbps: 2000,
                startTime: {
                    hour: 0,
                    minute: 0,
                },
            },
        ],
    },
});
import pulumi
import pulumi_azure_native as azure_native

agent = azure_native.storagemover.Agent("agent",
    agent_name="examples-agentName",
    arc_resource_id="/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName",
    arc_vm_uuid="3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9",
    resource_group_name="examples-rg",
    storage_mover_name="examples-storageMoverName",
    upload_limit_schedule={
        "weekly_recurrences": [
            {
                "days": [
                    azure_native.storagemover.DayOfWeek.MONDAY,
                    azure_native.storagemover.DayOfWeek.TUESDAY,
                    azure_native.storagemover.DayOfWeek.WEDNESDAY,
                    azure_native.storagemover.DayOfWeek.THURSDAY,
                    azure_native.storagemover.DayOfWeek.FRIDAY,
                    azure_native.storagemover.DayOfWeek.SATURDAY,
                    azure_native.storagemover.DayOfWeek.SUNDAY,
                ],
                "end_time": {
                    "hour": 24,
                    "minute": 0,
                },
                "limit_in_mbps": 2000,
                "start_time": {
                    "hour": 18,
                    "minute": 0,
                },
            },
            {
                "days": [
                    azure_native.storagemover.DayOfWeek.MONDAY,
                    azure_native.storagemover.DayOfWeek.TUESDAY,
                    azure_native.storagemover.DayOfWeek.WEDNESDAY,
                    azure_native.storagemover.DayOfWeek.THURSDAY,
                    azure_native.storagemover.DayOfWeek.FRIDAY,
                    azure_native.storagemover.DayOfWeek.SATURDAY,
                    azure_native.storagemover.DayOfWeek.SUNDAY,
                ],
                "end_time": {
                    "hour": 9,
                    "minute": 0,
                },
                "limit_in_mbps": 2000,
                "start_time": {
                    "hour": 0,
                    "minute": 0,
                },
            },
        ],
    })
package main

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

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := storagemover.NewAgent(ctx, "agent", &storagemover.AgentArgs{
			AgentName:         pulumi.String("examples-agentName"),
			ArcResourceId:     pulumi.String("/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName"),
			ArcVmUuid:         pulumi.String("3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9"),
			ResourceGroupName: pulumi.String("examples-rg"),
			StorageMoverName:  pulumi.String("examples-storageMoverName"),
			UploadLimitSchedule: &storagemover.UploadLimitScheduleArgs{
				WeeklyRecurrences: storagemover.UploadLimitWeeklyRecurrenceArray{
					&storagemover.UploadLimitWeeklyRecurrenceArgs{
						Days: storagemover.DayOfWeekArray{
							storagemover.DayOfWeekMonday,
							storagemover.DayOfWeekTuesday,
							storagemover.DayOfWeekWednesday,
							storagemover.DayOfWeekThursday,
							storagemover.DayOfWeekFriday,
							storagemover.DayOfWeekSaturday,
							storagemover.DayOfWeekSunday,
						},
						EndTime: &storagemover.TimeArgs{
							Hour:   pulumi.Int(24),
							Minute: pulumi.Float64(0),
						},
						LimitInMbps: pulumi.Int(2000),
						StartTime: &storagemover.TimeArgs{
							Hour:   pulumi.Int(18),
							Minute: pulumi.Float64(0),
						},
					},
					&storagemover.UploadLimitWeeklyRecurrenceArgs{
						Days: storagemover.DayOfWeekArray{
							storagemover.DayOfWeekMonday,
							storagemover.DayOfWeekTuesday,
							storagemover.DayOfWeekWednesday,
							storagemover.DayOfWeekThursday,
							storagemover.DayOfWeekFriday,
							storagemover.DayOfWeekSaturday,
							storagemover.DayOfWeekSunday,
						},
						EndTime: &storagemover.TimeArgs{
							Hour:   pulumi.Int(9),
							Minute: pulumi.Float64(0),
						},
						LimitInMbps: pulumi.Int(2000),
						StartTime: &storagemover.TimeArgs{
							Hour:   pulumi.Int(0),
							Minute: pulumi.Float64(0),
						},
					},
				},
			},
		})
		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 agent = new AzureNative.StorageMover.Agent("agent", new()
    {
        AgentName = "examples-agentName",
        ArcResourceId = "/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName",
        ArcVmUuid = "3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9",
        ResourceGroupName = "examples-rg",
        StorageMoverName = "examples-storageMoverName",
        UploadLimitSchedule = new AzureNative.StorageMover.Inputs.UploadLimitScheduleArgs
        {
            WeeklyRecurrences = new[]
            {
                new AzureNative.StorageMover.Inputs.UploadLimitWeeklyRecurrenceArgs
                {
                    Days = new[]
                    {
                        AzureNative.StorageMover.DayOfWeek.Monday,
                        AzureNative.StorageMover.DayOfWeek.Tuesday,
                        AzureNative.StorageMover.DayOfWeek.Wednesday,
                        AzureNative.StorageMover.DayOfWeek.Thursday,
                        AzureNative.StorageMover.DayOfWeek.Friday,
                        AzureNative.StorageMover.DayOfWeek.Saturday,
                        AzureNative.StorageMover.DayOfWeek.Sunday,
                    },
                    EndTime = new AzureNative.StorageMover.Inputs.TimeArgs
                    {
                        Hour = 24,
                        Minute = 0,
                    },
                    LimitInMbps = 2000,
                    StartTime = new AzureNative.StorageMover.Inputs.TimeArgs
                    {
                        Hour = 18,
                        Minute = 0,
                    },
                },
                new AzureNative.StorageMover.Inputs.UploadLimitWeeklyRecurrenceArgs
                {
                    Days = new[]
                    {
                        AzureNative.StorageMover.DayOfWeek.Monday,
                        AzureNative.StorageMover.DayOfWeek.Tuesday,
                        AzureNative.StorageMover.DayOfWeek.Wednesday,
                        AzureNative.StorageMover.DayOfWeek.Thursday,
                        AzureNative.StorageMover.DayOfWeek.Friday,
                        AzureNative.StorageMover.DayOfWeek.Saturday,
                        AzureNative.StorageMover.DayOfWeek.Sunday,
                    },
                    EndTime = new AzureNative.StorageMover.Inputs.TimeArgs
                    {
                        Hour = 9,
                        Minute = 0,
                    },
                    LimitInMbps = 2000,
                    StartTime = new AzureNative.StorageMover.Inputs.TimeArgs
                    {
                        Hour = 0,
                        Minute = 0,
                    },
                },
            },
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.storagemover.Agent;
import com.pulumi.azurenative.storagemover.AgentArgs;
import com.pulumi.azurenative.storagemover.inputs.UploadLimitScheduleArgs;
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 agent = new Agent("agent", AgentArgs.builder()
            .agentName("examples-agentName")
            .arcResourceId("/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName")
            .arcVmUuid("3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9")
            .resourceGroupName("examples-rg")
            .storageMoverName("examples-storageMoverName")
            .uploadLimitSchedule(UploadLimitScheduleArgs.builder()
                .weeklyRecurrences(                
                    UploadLimitWeeklyRecurrenceArgs.builder()
                        .days(                        
                            "Monday",
                            "Tuesday",
                            "Wednesday",
                            "Thursday",
                            "Friday",
                            "Saturday",
                            "Sunday")
                        .endTime(TimeArgs.builder()
                            .hour(24)
                            .minute(0.0)
                            .build())
                        .limitInMbps(2000)
                        .startTime(TimeArgs.builder()
                            .hour(18)
                            .minute(0.0)
                            .build())
                        .build(),
                    UploadLimitWeeklyRecurrenceArgs.builder()
                        .days(                        
                            "Monday",
                            "Tuesday",
                            "Wednesday",
                            "Thursday",
                            "Friday",
                            "Saturday",
                            "Sunday")
                        .endTime(TimeArgs.builder()
                            .hour(9)
                            .minute(0.0)
                            .build())
                        .limitInMbps(2000)
                        .startTime(TimeArgs.builder()
                            .hour(0)
                            .minute(0.0)
                            .build())
                        .build())
                .build())
            .build());

    }
}
resources:
  agent:
    type: azure-native:storagemover:Agent
    properties:
      agentName: examples-agentName
      arcResourceId: /subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.HybridCompute/machines/examples-hybridComputeName
      arcVmUuid: 3bb2c024-eba9-4d18-9e7a-1d772fcc5fe9
      resourceGroupName: examples-rg
      storageMoverName: examples-storageMoverName
      uploadLimitSchedule:
        weeklyRecurrences:
          - days:
              - Monday
              - Tuesday
              - Wednesday
              - Thursday
              - Friday
              - Saturday
              - Sunday
            endTime:
              hour: 24
              minute: 0
            limitInMbps: 2000
            startTime:
              hour: 18
              minute: 0
          - days:
              - Monday
              - Tuesday
              - Wednesday
              - Thursday
              - Friday
              - Saturday
              - Sunday
            endTime:
              hour: 9
              minute: 0
            limitInMbps: 2000
            startTime:
              hour: 0
              minute: 0

Multiple weeklyRecurrences entries create complex schedules. The first recurrence limits bandwidth from 6 PM to midnight (hour 24) daily. The second recurrence continues the limit from midnight to 9 AM. Together, they create an overnight window where uploads are capped at 2 Gbps, leaving daytime hours unrestricted.

Beyond these examples

These snippets focus on specific agent-level features: agent registration with Arc-enabled machines, bandwidth throttling schedules, and multi-window time-based policies. They’re intentionally minimal rather than full migration deployments.

The examples reference pre-existing infrastructure such as Azure Arc-enabled machines, Storage Mover resources, and resource groups and subscriptions. They focus on configuring the agent rather than provisioning Arc or Storage Mover infrastructure.

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

  • Agent status monitoring (agentStatus, lastStatusUpdate)
  • Hardware reporting (memoryInMB, numberOfCores, uptimeInSeconds)
  • Network diagnostics (localIPAddress)
  • Time zone configuration (timeZone)

These omissions are intentional: the goal is to illustrate how each agent feature is wired, not provide drop-in migration modules. See the Storage Mover Agent resource reference for all available configuration options.

Let's configure Azure Storage Mover Agents

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

Try Pulumi Cloud for FREE

Frequently Asked Questions

Agent Setup & Requirements
What's required to create a Storage Mover agent?
You need an Azure Arc-enabled machine. The agent requires arcResourceId (the fully qualified resource ID of the Hybrid Compute machine) and arcVmUuid (the VM UUID), along with agentName, resourceGroupName, and storageMoverName.
Can I create an agent without Azure Arc?
No, the agent must be associated with an Azure Arc-enabled Hybrid Compute machine. Both arcResourceId and arcVmUuid are required properties pointing to a Microsoft.HybridCompute/machines resource.
Configuration & Immutability
What properties can't be changed after creating an agent?
Five properties are immutable: arcResourceId, arcVmUuid, agentName, resourceGroupName, and storageMoverName. Changing any of these requires recreating the agent.
Can I update the agent's description or upload schedule?
Yes, description and uploadLimitSchedule are not marked as immutable and can be updated after creation.
Bandwidth Management
How do I limit upload bandwidth during specific hours?
Configure uploadLimitSchedule with weeklyRecurrences specifying days, startTime, endTime, and limitInMbps. For example, to limit to 2000 Mbps on Mondays from 9:00 to 18:30, set those values in a recurrence.
How do I configure an overnight upload schedule that spans midnight?
Use two weeklyRecurrences: one from evening to midnight (with endTime.hour set to 24), and another from midnight (with startTime.hour set to 0) to morning. The schedule uses the agent’s local time zone.
Monitoring & Status
What information does the agent report back to Azure?
The agent reports agentStatus, agentVersion, localIPAddress, memoryInMB, numberOfCores, timeZone, uptimeInSeconds, and lastStatusUpdate as computed output properties.

Using a different cloud?

Explore storage guides for other cloud providers: