Deploy Azure Cosmos DB for MongoDB Clusters

The azure-native:mongocluster:MongoCluster resource, part of the Pulumi Azure Native provider, provisions Azure Cosmos DB for MongoDB vCore clusters with defined compute, storage, and replication topology. This guide focuses on three capabilities: cluster provisioning with compute and storage configuration, point-in-time restore for disaster recovery, and geo-replication for multi-region deployments.

Clusters require an Azure resource group and may reference source clusters for restore or replication scenarios. The examples are intentionally small. Combine them with your own network configuration, backup policies, and monitoring setup.

Create a cluster with compute, storage, and sharding

Most deployments start by provisioning a cluster with specific compute tier, storage capacity, and shard configuration to match workload requirements.

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

const mongoCluster = new azure_native.mongocluster.MongoCluster("mongoCluster", {
    location: "westus2",
    mongoClusterName: "myMongoCluster",
    properties: {
        administrator: {
            password: "password",
            userName: "mongoAdmin",
        },
        compute: {
            tier: "M30",
        },
        highAvailability: {
            targetMode: azure_native.mongocluster.HighAvailabilityMode.SameZone,
        },
        serverVersion: "5.0",
        sharding: {
            shardCount: 1,
        },
        storage: {
            sizeGb: 128,
        },
    },
    resourceGroupName: "TestResourceGroup",
});
import pulumi
import pulumi_azure_native as azure_native

mongo_cluster = azure_native.mongocluster.MongoCluster("mongoCluster",
    location="westus2",
    mongo_cluster_name="myMongoCluster",
    properties={
        "administrator": {
            "password": "password",
            "user_name": "mongoAdmin",
        },
        "compute": {
            "tier": "M30",
        },
        "high_availability": {
            "target_mode": azure_native.mongocluster.HighAvailabilityMode.SAME_ZONE,
        },
        "server_version": "5.0",
        "sharding": {
            "shard_count": 1,
        },
        "storage": {
            "size_gb": 128,
        },
    },
    resource_group_name="TestResourceGroup")
package main

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

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := mongocluster.NewMongoCluster(ctx, "mongoCluster", &mongocluster.MongoClusterArgs{
			Location:         pulumi.String("westus2"),
			MongoClusterName: pulumi.String("myMongoCluster"),
			Properties: &mongocluster.MongoClusterPropertiesArgs{
				Administrator: &mongocluster.AdministratorPropertiesArgs{
					Password: pulumi.String("password"),
					UserName: pulumi.String("mongoAdmin"),
				},
				Compute: &mongocluster.ComputePropertiesArgs{
					Tier: pulumi.String("M30"),
				},
				HighAvailability: &mongocluster.HighAvailabilityPropertiesArgs{
					TargetMode: pulumi.String(mongocluster.HighAvailabilityModeSameZone),
				},
				ServerVersion: pulumi.String("5.0"),
				Sharding: &mongocluster.ShardingPropertiesArgs{
					ShardCount: pulumi.Int(1),
				},
				Storage: &mongocluster.StoragePropertiesArgs{
					SizeGb: pulumi.Float64(128),
				},
			},
			ResourceGroupName: pulumi.String("TestResourceGroup"),
		})
		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 mongoCluster = new AzureNative.MongoCluster.MongoCluster("mongoCluster", new()
    {
        Location = "westus2",
        MongoClusterName = "myMongoCluster",
        Properties = new AzureNative.MongoCluster.Inputs.MongoClusterPropertiesArgs
        {
            Administrator = new AzureNative.MongoCluster.Inputs.AdministratorPropertiesArgs
            {
                Password = "password",
                UserName = "mongoAdmin",
            },
            Compute = new AzureNative.MongoCluster.Inputs.ComputePropertiesArgs
            {
                Tier = "M30",
            },
            HighAvailability = new AzureNative.MongoCluster.Inputs.HighAvailabilityPropertiesArgs
            {
                TargetMode = AzureNative.MongoCluster.HighAvailabilityMode.SameZone,
            },
            ServerVersion = "5.0",
            Sharding = new AzureNative.MongoCluster.Inputs.ShardingPropertiesArgs
            {
                ShardCount = 1,
            },
            Storage = new AzureNative.MongoCluster.Inputs.StoragePropertiesArgs
            {
                SizeGb = 128,
            },
        },
        ResourceGroupName = "TestResourceGroup",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.mongocluster.MongoCluster;
import com.pulumi.azurenative.mongocluster.MongoClusterArgs;
import com.pulumi.azurenative.mongocluster.inputs.MongoClusterPropertiesArgs;
import com.pulumi.azurenative.mongocluster.inputs.AdministratorPropertiesArgs;
import com.pulumi.azurenative.mongocluster.inputs.ComputePropertiesArgs;
import com.pulumi.azurenative.mongocluster.inputs.HighAvailabilityPropertiesArgs;
import com.pulumi.azurenative.mongocluster.inputs.ShardingPropertiesArgs;
import com.pulumi.azurenative.mongocluster.inputs.StoragePropertiesArgs;
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 mongoCluster = new MongoCluster("mongoCluster", MongoClusterArgs.builder()
            .location("westus2")
            .mongoClusterName("myMongoCluster")
            .properties(MongoClusterPropertiesArgs.builder()
                .administrator(AdministratorPropertiesArgs.builder()
                    .password("password")
                    .userName("mongoAdmin")
                    .build())
                .compute(ComputePropertiesArgs.builder()
                    .tier("M30")
                    .build())
                .highAvailability(HighAvailabilityPropertiesArgs.builder()
                    .targetMode("SameZone")
                    .build())
                .serverVersion("5.0")
                .sharding(ShardingPropertiesArgs.builder()
                    .shardCount(1)
                    .build())
                .storage(StoragePropertiesArgs.builder()
                    .sizeGb(128.0)
                    .build())
                .build())
            .resourceGroupName("TestResourceGroup")
            .build());

    }
}
resources:
  mongoCluster:
    type: azure-native:mongocluster:MongoCluster
    properties:
      location: westus2
      mongoClusterName: myMongoCluster
      properties:
        administrator:
          password: password
          userName: mongoAdmin
        compute:
          tier: M30
        highAvailability:
          targetMode: SameZone
        serverVersion: '5.0'
        sharding:
          shardCount: 1
        storage:
          sizeGb: 128
      resourceGroupName: TestResourceGroup

The compute tier (M30 in this example) determines CPU and memory allocation. The storage sizeGb sets disk capacity. The sharding shardCount controls horizontal scaling; a value of 1 creates a single-shard cluster. The administrator block sets initial credentials, and serverVersion specifies the MongoDB version. This configuration creates a baseline cluster ready for application connections.

Restore a cluster from a point in time

Disaster recovery workflows often require restoring a cluster to a specific timestamp, recovering data from before an incident or accidental deletion.

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

const mongoCluster = new azure_native.mongocluster.MongoCluster("mongoCluster", {
    location: "westus2",
    mongoClusterName: "myMongoCluster",
    properties: {
        createMode: azure_native.mongocluster.CreateMode.PointInTimeRestore,
        restoreParameters: {
            pointInTimeUTC: "2023-01-13T20:07:35Z",
            sourceResourceId: "/subscriptions/ffffffff-ffff-ffff-ffff-ffffffffffff/resourceGroups/TestResourceGroup/providers/Microsoft.DocumentDB/mongoClusters/myOtherMongoCluster",
        },
    },
    resourceGroupName: "TestResourceGroup",
});
import pulumi
import pulumi_azure_native as azure_native

mongo_cluster = azure_native.mongocluster.MongoCluster("mongoCluster",
    location="westus2",
    mongo_cluster_name="myMongoCluster",
    properties={
        "create_mode": azure_native.mongocluster.CreateMode.POINT_IN_TIME_RESTORE,
        "restore_parameters": {
            "point_in_time_utc": "2023-01-13T20:07:35Z",
            "source_resource_id": "/subscriptions/ffffffff-ffff-ffff-ffff-ffffffffffff/resourceGroups/TestResourceGroup/providers/Microsoft.DocumentDB/mongoClusters/myOtherMongoCluster",
        },
    },
    resource_group_name="TestResourceGroup")
package main

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

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := mongocluster.NewMongoCluster(ctx, "mongoCluster", &mongocluster.MongoClusterArgs{
			Location:         pulumi.String("westus2"),
			MongoClusterName: pulumi.String("myMongoCluster"),
			Properties: &mongocluster.MongoClusterPropertiesArgs{
				CreateMode: pulumi.String(mongocluster.CreateModePointInTimeRestore),
				RestoreParameters: &mongocluster.MongoClusterRestoreParametersArgs{
					PointInTimeUTC:   pulumi.String("2023-01-13T20:07:35Z"),
					SourceResourceId: pulumi.String("/subscriptions/ffffffff-ffff-ffff-ffff-ffffffffffff/resourceGroups/TestResourceGroup/providers/Microsoft.DocumentDB/mongoClusters/myOtherMongoCluster"),
				},
			},
			ResourceGroupName: pulumi.String("TestResourceGroup"),
		})
		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 mongoCluster = new AzureNative.MongoCluster.MongoCluster("mongoCluster", new()
    {
        Location = "westus2",
        MongoClusterName = "myMongoCluster",
        Properties = new AzureNative.MongoCluster.Inputs.MongoClusterPropertiesArgs
        {
            CreateMode = AzureNative.MongoCluster.CreateMode.PointInTimeRestore,
            RestoreParameters = new AzureNative.MongoCluster.Inputs.MongoClusterRestoreParametersArgs
            {
                PointInTimeUTC = "2023-01-13T20:07:35Z",
                SourceResourceId = "/subscriptions/ffffffff-ffff-ffff-ffff-ffffffffffff/resourceGroups/TestResourceGroup/providers/Microsoft.DocumentDB/mongoClusters/myOtherMongoCluster",
            },
        },
        ResourceGroupName = "TestResourceGroup",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.mongocluster.MongoCluster;
import com.pulumi.azurenative.mongocluster.MongoClusterArgs;
import com.pulumi.azurenative.mongocluster.inputs.MongoClusterPropertiesArgs;
import com.pulumi.azurenative.mongocluster.inputs.MongoClusterRestoreParametersArgs;
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 mongoCluster = new MongoCluster("mongoCluster", MongoClusterArgs.builder()
            .location("westus2")
            .mongoClusterName("myMongoCluster")
            .properties(MongoClusterPropertiesArgs.builder()
                .createMode("PointInTimeRestore")
                .restoreParameters(MongoClusterRestoreParametersArgs.builder()
                    .pointInTimeUTC("2023-01-13T20:07:35Z")
                    .sourceResourceId("/subscriptions/ffffffff-ffff-ffff-ffff-ffffffffffff/resourceGroups/TestResourceGroup/providers/Microsoft.DocumentDB/mongoClusters/myOtherMongoCluster")
                    .build())
                .build())
            .resourceGroupName("TestResourceGroup")
            .build());

    }
}
resources:
  mongoCluster:
    type: azure-native:mongocluster:MongoCluster
    properties:
      location: westus2
      mongoClusterName: myMongoCluster
      properties:
        createMode: PointInTimeRestore
        restoreParameters:
          pointInTimeUTC: 2023-01-13T20:07:35Z
          sourceResourceId: /subscriptions/ffffffff-ffff-ffff-ffff-ffffffffffff/resourceGroups/TestResourceGroup/providers/Microsoft.DocumentDB/mongoClusters/myOtherMongoCluster
      resourceGroupName: TestResourceGroup

The createMode property set to PointInTimeRestore tells Azure to create a new cluster from a backup snapshot. The restoreParameters block specifies the exact timestamp (pointInTimeUTC) and source cluster (sourceResourceId) to restore from. The restored cluster inherits compute and storage configuration from the source but gets a new name and can be placed in a different resource group. This approach creates an independent cluster rather than modifying the original.

Deploy a geo-replica for multi-region availability

Applications requiring low-latency access across regions deploy geo-replicas that synchronize data from a primary cluster in a different Azure region.

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

const mongoCluster = new azure_native.mongocluster.MongoCluster("mongoCluster", {
    location: "centralus",
    mongoClusterName: "myReplicaMongoCluster",
    properties: {
        createMode: azure_native.mongocluster.CreateMode.GeoReplica,
        replicaParameters: {
            sourceLocation: "eastus",
            sourceResourceId: "/subscriptions/ffffffff-ffff-ffff-ffff-ffffffffffff/resourceGroups/TestResourceGroup/providers/Microsoft.DocumentDB/mongoClusters/mySourceMongoCluster",
        },
    },
    resourceGroupName: "TestResourceGroup",
});
import pulumi
import pulumi_azure_native as azure_native

mongo_cluster = azure_native.mongocluster.MongoCluster("mongoCluster",
    location="centralus",
    mongo_cluster_name="myReplicaMongoCluster",
    properties={
        "create_mode": azure_native.mongocluster.CreateMode.GEO_REPLICA,
        "replica_parameters": {
            "source_location": "eastus",
            "source_resource_id": "/subscriptions/ffffffff-ffff-ffff-ffff-ffffffffffff/resourceGroups/TestResourceGroup/providers/Microsoft.DocumentDB/mongoClusters/mySourceMongoCluster",
        },
    },
    resource_group_name="TestResourceGroup")
package main

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

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := mongocluster.NewMongoCluster(ctx, "mongoCluster", &mongocluster.MongoClusterArgs{
			Location:         pulumi.String("centralus"),
			MongoClusterName: pulumi.String("myReplicaMongoCluster"),
			Properties: &mongocluster.MongoClusterPropertiesArgs{
				CreateMode: pulumi.String(mongocluster.CreateModeGeoReplica),
				ReplicaParameters: &mongocluster.MongoClusterReplicaParametersArgs{
					SourceLocation:   pulumi.String("eastus"),
					SourceResourceId: pulumi.String("/subscriptions/ffffffff-ffff-ffff-ffff-ffffffffffff/resourceGroups/TestResourceGroup/providers/Microsoft.DocumentDB/mongoClusters/mySourceMongoCluster"),
				},
			},
			ResourceGroupName: pulumi.String("TestResourceGroup"),
		})
		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 mongoCluster = new AzureNative.MongoCluster.MongoCluster("mongoCluster", new()
    {
        Location = "centralus",
        MongoClusterName = "myReplicaMongoCluster",
        Properties = new AzureNative.MongoCluster.Inputs.MongoClusterPropertiesArgs
        {
            CreateMode = AzureNative.MongoCluster.CreateMode.GeoReplica,
            ReplicaParameters = new AzureNative.MongoCluster.Inputs.MongoClusterReplicaParametersArgs
            {
                SourceLocation = "eastus",
                SourceResourceId = "/subscriptions/ffffffff-ffff-ffff-ffff-ffffffffffff/resourceGroups/TestResourceGroup/providers/Microsoft.DocumentDB/mongoClusters/mySourceMongoCluster",
            },
        },
        ResourceGroupName = "TestResourceGroup",
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.mongocluster.MongoCluster;
import com.pulumi.azurenative.mongocluster.MongoClusterArgs;
import com.pulumi.azurenative.mongocluster.inputs.MongoClusterPropertiesArgs;
import com.pulumi.azurenative.mongocluster.inputs.MongoClusterReplicaParametersArgs;
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 mongoCluster = new MongoCluster("mongoCluster", MongoClusterArgs.builder()
            .location("centralus")
            .mongoClusterName("myReplicaMongoCluster")
            .properties(MongoClusterPropertiesArgs.builder()
                .createMode("GeoReplica")
                .replicaParameters(MongoClusterReplicaParametersArgs.builder()
                    .sourceLocation("eastus")
                    .sourceResourceId("/subscriptions/ffffffff-ffff-ffff-ffff-ffffffffffff/resourceGroups/TestResourceGroup/providers/Microsoft.DocumentDB/mongoClusters/mySourceMongoCluster")
                    .build())
                .build())
            .resourceGroupName("TestResourceGroup")
            .build());

    }
}
resources:
  mongoCluster:
    type: azure-native:mongocluster:MongoCluster
    properties:
      location: centralus
      mongoClusterName: myReplicaMongoCluster
      properties:
        createMode: GeoReplica
        replicaParameters:
          sourceLocation: eastus
          sourceResourceId: /subscriptions/ffffffff-ffff-ffff-ffff-ffffffffffff/resourceGroups/TestResourceGroup/providers/Microsoft.DocumentDB/mongoClusters/mySourceMongoCluster
      resourceGroupName: TestResourceGroup

The createMode property set to GeoReplica creates a read-only replica in a different region. The replicaParameters block identifies the source cluster and its region (sourceLocation). The replica continuously synchronizes data from the primary, providing low-latency reads for users in the replica’s region. Replicas can be promoted to primary during failover scenarios.

Beyond these examples

These snippets focus on specific cluster-level features: cluster provisioning with compute and storage tiers, and point-in-time restore and geo-replication. They’re intentionally minimal rather than full database deployments.

The examples may reference pre-existing infrastructure such as Azure resource groups, and source clusters for restore and replication scenarios. They focus on configuring the cluster rather than provisioning everything around it.

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

  • High availability configuration (highAvailability property with ZoneRedundant mode)
  • Network access controls (publicNetworkAccess, privateEndpointConnections)
  • Backup retention and scheduling
  • Monitoring and diagnostic settings

These omissions are intentional: the goal is to illustrate how each cluster feature is wired, not provide drop-in database modules. See the MongoCluster resource reference for all available configuration options.

Let's deploy Azure Cosmos DB for MongoDB Clusters

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

Try Pulumi Cloud for FREE

Frequently Asked Questions

Cluster Creation & Deployment Modes
What are the different ways to create a Mongo cluster?

You can create a cluster in three ways using createMode:

  1. Default - Create a new cluster from scratch
  2. PointInTimeRestore - Restore from a backup at a specific timestamp
  3. GeoReplica - Create a geo-replica of an existing cluster
What's required to create a new Mongo cluster?
A new cluster requires location, mongoClusterName, resourceGroupName, and the properties object with administrator (userName and password), compute (tier), storage (sizeGb), serverVersion, and sharding (shardCount).
How do I restore a cluster from a point in time?
Set createMode to PointInTimeRestore and provide restoreParameters with pointInTimeUTC (timestamp in ISO 8601 format) and sourceResourceId (the resource ID of the source cluster).
How do I create a geo-replica of my cluster?
Set createMode to GeoReplica and provide replicaParameters with sourceLocation (the Azure region of the source) and sourceResourceId (the resource ID of the source cluster).
Configuration & Scaling
What properties can't I change after creating my cluster?
The location, mongoClusterName, and resourceGroupName properties are immutable. To change these, you must create a new cluster.
How do I configure high availability for my cluster?
Set the highAvailability property with targetMode to specify the HA configuration. For example, SameZone deploys replicas within the same availability zone.
How do I configure sharding for my cluster?
Set the sharding property with shardCount to specify the number of shards. For example, shardCount: 1 creates a single-shard cluster.
API Versions & Compatibility
How do I use a different API version for this resource?
Generate a local SDK package using the Pulumi CLI command: pulumi package add azure-native mongocluster [ApiVersion]. Available versions include 2024-03-01-preview, 2024-06-01-preview, 2024-10-01-preview, 2025-04-01-preview, 2025-07-01-preview, 2025-08-01-preview, and 2025-09-01.

Using a different cloud?

Explore database guides for other cloud providers: