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 configurations.

Agents require existing Azure Arc-enabled machines and Storage Mover resources. 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. Registration connects an Arc-enabled machine to a Storage Mover resource.

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 identifies the Azure Arc-enabled machine (a Hybrid Compute resource) that will run migration jobs. The arcVmUuid provides the VM’s unique identifier. Together, these properties bind the agent to a specific machine. The storageMoverName references the parent Storage Mover resource that orchestrates migration projects.

Throttle bandwidth during business hours

Migration workloads can saturate WAN links, affecting production traffic. Upload limit schedules restrict agent bandwidth to specific time windows.

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. In this configuration, the agent limits uploads to 2000 Mbps on Mondays between 9:00 AM and 6:30 PM. Outside this window, the agent uses available bandwidth without restriction.

Schedule overnight and weekend bandwidth windows

Organizations with strict business-hours requirements often need multiple time windows to cover overnight periods 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

When a bandwidth window crosses midnight, define it as two separate recurrences. The first recurrence runs from 6:00 PM to midnight (hour 24), and the second runs from midnight (hour 0) to 9:00 AM. Both apply to all seven days, creating a continuous overnight window with consistent bandwidth limits.

Beyond these examples

These snippets focus on specific agent-level features: agent registration with Arc-enabled machines, bandwidth throttling schedules, and multi-window time configurations. 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. They focus on configuring the agent rather than provisioning the surrounding infrastructure.

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

  • Agent status monitoring (agentStatus, lastStatusUpdate)
  • Agent capabilities reporting (memoryInMB, numberOfCores, uptimeInSeconds)
  • Error handling and diagnostics (errorDetails)
  • 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

Setup & Prerequisites
What's required to create a Storage Mover Agent?
You need an Azure Arc-enabled Hybrid Compute machine. The agent requires the arcResourceId (full resource ID like /subscriptions/.../Microsoft.HybridCompute/machines/...) and arcVmUuid from this machine, plus agentName, resourceGroupName, and storageMoverName.
What properties can't be changed after creating an agent?
The arcResourceId, arcVmUuid, agentName, resourceGroupName, and storageMoverName properties are immutable. To change any of these, you must delete and recreate the agent.
Bandwidth Management
How do I limit upload bandwidth during specific hours?
Configure uploadLimitSchedule with weeklyRecurrences. Each recurrence specifies days (array of weekdays), startTime, endTime, and limitInMbps. For example, to limit to 2000 Mbps on Mondays from 9:00 AM to 6:30 PM, set days: [Monday], startTime: {hour: 9, minute: 0}, endTime: {hour: 18, minute: 30}, and limitInMbps: 2000.
How do I set bandwidth limits that span midnight?
Create two separate recurrences: one from evening to midnight (hour 24) and another from midnight (hour 0) to morning. For example, for 6 PM to 9 AM limits, use one recurrence with startTime: {hour: 18, minute: 0} and endTime: {hour: 24, minute: 0}, and another with startTime: {hour: 0, minute: 0} and endTime: {hour: 9, minute: 0}.
What operations does the upload limit schedule affect?
The schedule affects data plane operations (migrating files) during job runs. Control plane operations that ensure seamless migration functionality are not limited by this schedule.
What time zone is used for the upload limit schedule?
The schedule is interpreted using the agent’s local time zone, which is reported in Windows format in the timeZone output property.
Monitoring & Status
What agent information can I monitor after deployment?
You can monitor agentStatus, agentVersion, lastStatusUpdate, localIPAddress, memoryInMB, numberOfCores, uptimeInSeconds, timeZone, and errorDetails through the agent’s output properties.
Is the description property required when creating an agent?
No, description is optional. The MinimumSet example shows an agent created without it.

Using a different cloud?

Explore storage guides for other cloud providers: