Configure Azure Storage Mover Endpoints

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

Endpoints belong to a Storage Mover resource and reference existing storage accounts, on-premises servers, or Key Vault secrets. 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 indicate this endpoint routes data to Blob Storage. The storageAccountResourceId points to your storage account, and blobContainerName identifies the target container. The endpoint must belong to a Storage Mover resource specified by 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 share semantics.

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 file metadata and permissions during migration.

Connect to on-premises NFS exports as sources

Migrations from on-premises NAS systems typically start with NFS endpoints that point to existing network exports.

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” indicates this endpoint reads from an NFS server. The host property specifies the server address, and export identifies the NFS export path. The Storage Mover agent must have network access to the NFS server.

Connect to SMB shares with Key Vault credentials

Windows file servers and SMB-based NAS systems require authenticated access using credentials stored in Azure Key Vault.

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

For SMB sources, the credentials block references Key Vault secrets containing the username and password. The passwordUri and usernameUri properties point to specific secrets. At runtime, Storage Mover retrieves these credentials to authenticate with the SMB server specified by host and shareName.

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

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

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

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

These omissions are intentional: the goal is to illustrate how each endpoint type is wired, not provide drop-in migration solutions. 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 & Configuration
What types of endpoints can I create with Storage Mover?
You can create four types of endpoints: Azure Storage Blob Container (AzureStorageBlobContainer), Azure Storage SMB File Share (AzureStorageSmbFileShare), NFS Mount (NfsMount), and SMB Mount (SmbMount).
How do I connect to Azure Storage (Blob Container or File Share)?
For Blob Container, set endpointType to AzureStorageBlobContainer and provide blobContainerName and storageAccountResourceId. For File Share, use AzureStorageSmbFileShare with fileShareName and storageAccountResourceId.
What's the difference between NFS Mount and SMB Mount endpoints?
NFS Mount requires host and export properties, while SMB Mount requires host, shareName, and credentials (stored in Azure Key Vault).
Security & Credentials
How do I securely store credentials for SMB mounts?
Use Azure Key Vault by configuring credentials with type AzureKeyVaultSmb, providing passwordUri and usernameUri pointing to Key Vault secrets.
Resource Management
What properties can't I change after creating an endpoint?
Three properties are immutable: endpointName, resourceGroupName, and storageMoverName. You’ll need to recreate the endpoint to change these.
How do I use a different API version for Storage Mover?
Generate a local SDK package using the Pulumi CLI command: pulumi package add azure-native storagemover [ApiVersion]. Available versions include 2023-03-01, 2023-07-01-preview, 2023-10-01, and 2025-07-01.

Using a different cloud?

Explore storage guides for other cloud providers: