Configure Azure Storage Mover Endpoints

The azure-native:storagemover:Endpoint resource, part of the Pulumi Azure Native provider, defines endpoints that represent data sources and destinations for Storage Mover migration jobs. This guide focuses on three capabilities: Azure Storage destinations (Blob Container and File Share), on-premises sources (NFS and SMB mounts), and Key Vault credential integration for SMB.

Endpoints belong to a Storage Mover resource and reference storage accounts, file shares, or on-premises servers that must exist and be network-accessible. The examples are intentionally small. Combine them with your own Storage Mover configuration, job definitions, and agent deployment.

Define a Blob Container endpoint for Azure Storage

Migration jobs often target Azure Blob Storage as the destination for object data.

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

const endpoint = new azure_native.storagemover.Endpoint("endpoint", {
    endpointName: "examples-endpointName",
    properties: {
        blobContainerName: "examples-blobcontainer",
        description: "Example Storage Blob Container Endpoint Description",
        endpointType: "AzureStorageBlobContainer",
        storageAccountResourceId: "/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.Storage/storageAccounts/examplesa",
    },
    resourceGroupName: "examples-rg",
    storageMoverName: "examples-storageMoverName",
});
import pulumi
import pulumi_azure_native as azure_native

endpoint = azure_native.storagemover.Endpoint("endpoint",
    endpoint_name="examples-endpointName",
    properties={
        "blob_container_name": "examples-blobcontainer",
        "description": "Example Storage Blob Container Endpoint Description",
        "endpoint_type": "AzureStorageBlobContainer",
        "storage_account_resource_id": "/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.Storage/storageAccounts/examplesa",
    },
    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.NewEndpoint(ctx, "endpoint", &storagemover.EndpointArgs{
			EndpointName: pulumi.String("examples-endpointName"),
			Properties: &storagemover.AzureStorageBlobContainerEndpointPropertiesArgs{
				BlobContainerName:        pulumi.String("examples-blobcontainer"),
				Description:              pulumi.String("Example Storage Blob Container Endpoint Description"),
				EndpointType:             pulumi.String("AzureStorageBlobContainer"),
				StorageAccountResourceId: pulumi.String("/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.Storage/storageAccounts/examplesa"),
			},
			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 endpoint = new AzureNative.StorageMover.Endpoint("endpoint", new()
    {
        EndpointName = "examples-endpointName",
        Properties = new AzureNative.StorageMover.Inputs.AzureStorageBlobContainerEndpointPropertiesArgs
        {
            BlobContainerName = "examples-blobcontainer",
            Description = "Example Storage Blob Container Endpoint Description",
            EndpointType = "AzureStorageBlobContainer",
            StorageAccountResourceId = "/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.Storage/storageAccounts/examplesa",
        },
        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.Endpoint;
import com.pulumi.azurenative.storagemover.EndpointArgs;
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 endpoint = new Endpoint("endpoint", EndpointArgs.builder()
            .endpointName("examples-endpointName")
            .properties(AzureStorageBlobContainerEndpointPropertiesArgs.builder()
                .blobContainerName("examples-blobcontainer")
                .description("Example Storage Blob Container Endpoint Description")
                .endpointType("AzureStorageBlobContainer")
                .storageAccountResourceId("/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.Storage/storageAccounts/examplesa")
                .build())
            .resourceGroupName("examples-rg")
            .storageMoverName("examples-storageMoverName")
            .build());

    }
}
resources:
  endpoint:
    type: azure-native:storagemover:Endpoint
    properties:
      endpointName: examples-endpointName
      properties:
        blobContainerName: examples-blobcontainer
        description: Example Storage Blob Container Endpoint Description
        endpointType: AzureStorageBlobContainer
        storageAccountResourceId: /subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.Storage/storageAccounts/examplesa
      resourceGroupName: examples-rg
      storageMoverName: examples-storageMoverName

The endpointType property specifies “AzureStorageBlobContainer” to route data to Blob Storage. The storageAccountResourceId points to the target storage account, and blobContainerName identifies the specific container. The endpoint must reference an existing Storage Mover resource via storageMoverName.

Define an SMB File Share endpoint for Azure Files

Teams migrating file server data to Azure Files use SMB File Share endpoints to preserve file-level access patterns.

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

const endpoint = new azure_native.storagemover.Endpoint("endpoint", {
    endpointName: "examples-endpointName",
    properties: {
        description: "Example Storage File Share Endpoint Description",
        endpointType: "AzureStorageSmbFileShare",
        fileShareName: "examples-fileshare",
        storageAccountResourceId: "/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.Storage/storageAccounts/examplesa",
    },
    resourceGroupName: "examples-rg",
    storageMoverName: "examples-storageMoverName",
});
import pulumi
import pulumi_azure_native as azure_native

endpoint = azure_native.storagemover.Endpoint("endpoint",
    endpoint_name="examples-endpointName",
    properties={
        "description": "Example Storage File Share Endpoint Description",
        "endpoint_type": "AzureStorageSmbFileShare",
        "file_share_name": "examples-fileshare",
        "storage_account_resource_id": "/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.Storage/storageAccounts/examplesa",
    },
    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.NewEndpoint(ctx, "endpoint", &storagemover.EndpointArgs{
			EndpointName: pulumi.String("examples-endpointName"),
			Properties: &storagemover.AzureStorageSmbFileShareEndpointPropertiesArgs{
				Description:              pulumi.String("Example Storage File Share Endpoint Description"),
				EndpointType:             pulumi.String("AzureStorageSmbFileShare"),
				FileShareName:            pulumi.String("examples-fileshare"),
				StorageAccountResourceId: pulumi.String("/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.Storage/storageAccounts/examplesa"),
			},
			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 endpoint = new AzureNative.StorageMover.Endpoint("endpoint", new()
    {
        EndpointName = "examples-endpointName",
        Properties = new AzureNative.StorageMover.Inputs.AzureStorageSmbFileShareEndpointPropertiesArgs
        {
            Description = "Example Storage File Share Endpoint Description",
            EndpointType = "AzureStorageSmbFileShare",
            FileShareName = "examples-fileshare",
            StorageAccountResourceId = "/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.Storage/storageAccounts/examplesa",
        },
        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.Endpoint;
import com.pulumi.azurenative.storagemover.EndpointArgs;
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 endpoint = new Endpoint("endpoint", EndpointArgs.builder()
            .endpointName("examples-endpointName")
            .properties(AzureStorageSmbFileShareEndpointPropertiesArgs.builder()
                .description("Example Storage File Share Endpoint Description")
                .endpointType("AzureStorageSmbFileShare")
                .fileShareName("examples-fileshare")
                .storageAccountResourceId("/subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.Storage/storageAccounts/examplesa")
                .build())
            .resourceGroupName("examples-rg")
            .storageMoverName("examples-storageMoverName")
            .build());

    }
}
resources:
  endpoint:
    type: azure-native:storagemover:Endpoint
    properties:
      endpointName: examples-endpointName
      properties:
        description: Example Storage File Share Endpoint Description
        endpointType: AzureStorageSmbFileShare
        fileShareName: examples-fileshare
        storageAccountResourceId: /subscriptions/60bcfc77-6589-4da2-b7fd-f9ec9322cf95/resourceGroups/examples-rg/providers/Microsoft.Storage/storageAccounts/examplesa
      resourceGroupName: examples-rg
      storageMoverName: examples-storageMoverName

Setting endpointType to “AzureStorageSmbFileShare” configures the endpoint for Azure Files. The fileShareName property identifies the target file share within the storage account. This endpoint type maintains SMB protocol semantics during migration.

Define an NFS mount endpoint for on-premises sources

Migrations from on-premises NFS servers require endpoints that specify the export path and host address.

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

const endpoint = new azure_native.storagemover.Endpoint("endpoint", {
    endpointName: "examples-endpointName",
    properties: {
        description: "Example NFS Mount Endpoint Description",
        endpointType: "NfsMount",
        "export": "examples-exportName",
        host: "0.0.0.0",
    },
    resourceGroupName: "examples-rg",
    storageMoverName: "examples-storageMoverName",
});
import pulumi
import pulumi_azure_native as azure_native

endpoint = azure_native.storagemover.Endpoint("endpoint",
    endpoint_name="examples-endpointName",
    properties={
        "description": "Example NFS Mount Endpoint Description",
        "endpoint_type": "NfsMount",
        "export": "examples-exportName",
        "host": "0.0.0.0",
    },
    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.NewEndpoint(ctx, "endpoint", &storagemover.EndpointArgs{
			EndpointName: pulumi.String("examples-endpointName"),
			Properties: &storagemover.NfsMountEndpointPropertiesArgs{
				Description:  pulumi.String("Example NFS Mount Endpoint Description"),
				EndpointType: pulumi.String("NfsMount"),
				Export:       pulumi.String("examples-exportName"),
				Host:         pulumi.String("0.0.0.0"),
			},
			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 endpoint = new AzureNative.StorageMover.Endpoint("endpoint", new()
    {
        EndpointName = "examples-endpointName",
        Properties = new AzureNative.StorageMover.Inputs.NfsMountEndpointPropertiesArgs
        {
            Description = "Example NFS Mount Endpoint Description",
            EndpointType = "NfsMount",
            Export = "examples-exportName",
            Host = "0.0.0.0",
        },
        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.Endpoint;
import com.pulumi.azurenative.storagemover.EndpointArgs;
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 endpoint = new Endpoint("endpoint", EndpointArgs.builder()
            .endpointName("examples-endpointName")
            .properties(NfsMountEndpointPropertiesArgs.builder()
                .description("Example NFS Mount Endpoint Description")
                .endpointType("NfsMount")
                .export("examples-exportName")
                .host("0.0.0.0")
                .build())
            .resourceGroupName("examples-rg")
            .storageMoverName("examples-storageMoverName")
            .build());

    }
}
resources:
  endpoint:
    type: azure-native:storagemover:Endpoint
    properties:
      endpointName: examples-endpointName
      properties:
        description: Example NFS Mount Endpoint Description
        endpointType: NfsMount
        export: examples-exportName
        host: 0.0.0.0
      resourceGroupName: examples-rg
      storageMoverName: examples-storageMoverName

The endpointType “NfsMount” identifies this as an NFS source. The host property specifies the NFS server address, and export identifies the NFS export path. The Storage Mover agent must have network access to this host.

Define an SMB mount endpoint with Key Vault credentials

SMB file shares require authentication. Storage Mover retrieves credentials from Azure Key Vault to avoid embedding secrets.

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

const endpoint = new azure_native.storagemover.Endpoint("endpoint", {
    endpointName: "examples-endpointName",
    properties: {
        credentials: {
            passwordUri: "https://examples-azureKeyVault.vault.azure.net/secrets/examples-password",
            type: "AzureKeyVaultSmb",
            usernameUri: "https://examples-azureKeyVault.vault.azure.net/secrets/examples-username",
        },
        description: "Example SMB Mount Endpoint Description",
        endpointType: "SmbMount",
        host: "0.0.0.0",
        shareName: "examples-shareName",
    },
    resourceGroupName: "examples-rg",
    storageMoverName: "examples-storageMoverName",
});
import pulumi
import pulumi_azure_native as azure_native

endpoint = azure_native.storagemover.Endpoint("endpoint",
    endpoint_name="examples-endpointName",
    properties={
        "credentials": {
            "password_uri": "https://examples-azureKeyVault.vault.azure.net/secrets/examples-password",
            "type": "AzureKeyVaultSmb",
            "username_uri": "https://examples-azureKeyVault.vault.azure.net/secrets/examples-username",
        },
        "description": "Example SMB Mount Endpoint Description",
        "endpoint_type": "SmbMount",
        "host": "0.0.0.0",
        "share_name": "examples-shareName",
    },
    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.NewEndpoint(ctx, "endpoint", &storagemover.EndpointArgs{
			EndpointName: pulumi.String("examples-endpointName"),
			Properties: &storagemover.SmbMountEndpointPropertiesArgs{
				Credentials: &storagemover.AzureKeyVaultSmbCredentialsArgs{
					PasswordUri: pulumi.String("https://examples-azureKeyVault.vault.azure.net/secrets/examples-password"),
					Type:        pulumi.String("AzureKeyVaultSmb"),
					UsernameUri: pulumi.String("https://examples-azureKeyVault.vault.azure.net/secrets/examples-username"),
				},
				Description:  pulumi.String("Example SMB Mount Endpoint Description"),
				EndpointType: pulumi.String("SmbMount"),
				Host:         pulumi.String("0.0.0.0"),
				ShareName:    pulumi.String("examples-shareName"),
			},
			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 endpoint = new AzureNative.StorageMover.Endpoint("endpoint", new()
    {
        EndpointName = "examples-endpointName",
        Properties = new AzureNative.StorageMover.Inputs.SmbMountEndpointPropertiesArgs
        {
            Credentials = new AzureNative.StorageMover.Inputs.AzureKeyVaultSmbCredentialsArgs
            {
                PasswordUri = "https://examples-azureKeyVault.vault.azure.net/secrets/examples-password",
                Type = "AzureKeyVaultSmb",
                UsernameUri = "https://examples-azureKeyVault.vault.azure.net/secrets/examples-username",
            },
            Description = "Example SMB Mount Endpoint Description",
            EndpointType = "SmbMount",
            Host = "0.0.0.0",
            ShareName = "examples-shareName",
        },
        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.Endpoint;
import com.pulumi.azurenative.storagemover.EndpointArgs;
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 endpoint = new Endpoint("endpoint", EndpointArgs.builder()
            .endpointName("examples-endpointName")
            .properties(SmbMountEndpointPropertiesArgs.builder()
                .credentials(Map.ofEntries(
                    Map.entry("passwordUri", "https://examples-azureKeyVault.vault.azure.net/secrets/examples-password"),
                    Map.entry("type", "AzureKeyVaultSmb"),
                    Map.entry("usernameUri", "https://examples-azureKeyVault.vault.azure.net/secrets/examples-username")
                ))
                .description("Example SMB Mount Endpoint Description")
                .endpointType("SmbMount")
                .host("0.0.0.0")
                .shareName("examples-shareName")
                .build())
            .resourceGroupName("examples-rg")
            .storageMoverName("examples-storageMoverName")
            .build());

    }
}
resources:
  endpoint:
    type: azure-native:storagemover:Endpoint
    properties:
      endpointName: examples-endpointName
      properties:
        credentials:
          passwordUri: https://examples-azureKeyVault.vault.azure.net/secrets/examples-password
          type: AzureKeyVaultSmb
          usernameUri: https://examples-azureKeyVault.vault.azure.net/secrets/examples-username
        description: Example SMB Mount Endpoint Description
        endpointType: SmbMount
        host: 0.0.0.0
        shareName: examples-shareName
      resourceGroupName: examples-rg
      storageMoverName: examples-storageMoverName

The credentials block references Azure Key Vault secrets for username and password via usernameUri and passwordUri. Setting type to “AzureKeyVaultSmb” tells Storage Mover to retrieve credentials at runtime. The host and shareName properties identify the SMB server and share path.

Beyond these examples

These snippets focus on specific endpoint features: Azure Storage destinations (Blob Container and File Share), on-premises sources (NFS and SMB mounts), and Key Vault credential integration. They’re intentionally minimal rather than full migration configurations.

The examples reference pre-existing infrastructure such as Storage Mover resources, storage accounts, blob containers, and file shares, and NFS and SMB servers with network connectivity, and Azure Key Vault with stored credentials. They focus on configuring the endpoint rather than provisioning the surrounding infrastructure.

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

  • NFS version selection (nfsVersion)
  • Endpoint lifecycle management (updates, deletions)
  • Job definitions that use these endpoints
  • Agent registration and network configuration

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

Let's configure Azure Storage Mover Endpoints

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

Try Pulumi Cloud for FREE

Frequently Asked Questions

Endpoint Types & Selection
What types of endpoints can I create with Storage Mover?
You can create four endpoint types: AzureStorageBlobContainer for Azure Blob storage, AzureStorageSmbFileShare for Azure Files, NfsMount for on-premises NFS shares, and SmbMount for on-premises SMB shares.
What's the difference between Azure Storage endpoints and on-premises mount endpoints?
Azure Storage endpoints (AzureStorageBlobContainer and AzureStorageSmbFileShare) require a storageAccountResourceId pointing to an Azure Storage account. On-premises mount endpoints (NfsMount and SmbMount) require a host address and either an export (NFS) or shareName (SMB).
Configuration Requirements
How do I configure an Azure Blob Container endpoint?
Set endpointType to AzureStorageBlobContainer, provide the blobContainerName, and specify the storageAccountResourceId with the full ARM resource ID of your storage account.
How do I configure an NFS mount endpoint?
Set endpointType to NfsMount, provide the host address (IP or hostname), and specify the export path on the NFS server.
How do I secure credentials for SMB mount endpoints?
Use Azure Key Vault by setting credentials.type to AzureKeyVaultSmb and providing passwordUri and usernameUri pointing to secrets in your Key Vault.
Resource Management
What properties can't be changed after creating an endpoint?
The endpointName, resourceGroupName, and storageMoverName are immutable. Changing any of these requires recreating the endpoint resource.
What parent resources are required to create an endpoint?
You must specify an existing storageMoverName and resourceGroupName. The endpoint is created within the specified Storage Mover resource.

Using a different cloud?

Explore storage guides for other cloud providers: