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: compute tier, storage capacity, sharding, and availability configuration. This guide focuses on three capabilities: cluster provisioning with compute and storage sizing, point-in-time restore for disaster recovery, and geographic replication across regions.

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

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; set to 1 for single-shard deployments. The administrator block defines initial credentials, and highAvailability targetMode controls zone redundancy (SameZone keeps replicas in one availability zone). The serverVersion specifies the MongoDB wire protocol version.

Restore a cluster from a point in time

Disaster recovery workflows often require restoring a cluster to a specific timestamp, recovering data from before corruption 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 switches from default cluster creation to PointInTimeRestore. The restoreParameters block specifies the source cluster’s resource ID and the exact UTC timestamp to restore from. This creates a new cluster with data as it existed at that moment. The source cluster must have point-in-time restore enabled and the timestamp must fall within the retention window.

Deploy a geo-replica for disaster recovery

Applications requiring geographic redundancy deploy read replicas in different regions, providing failover capability and reduced latency for distributed users.

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 GeoReplica creates a read replica in a different region. The replicaParameters block identifies the source cluster by resource ID and its region (sourceLocation). The replica inherits compute, storage, and configuration from the source. This enables cross-region failover and serves read traffic closer to users in the replica’s region.

Beyond these examples

These snippets focus on specific cluster-level features: cluster provisioning with compute and storage tiers, point-in-time restore and geo-replication, and high availability and sharding configuration. 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 operations. They focus on configuring the cluster rather than provisioning everything around it.

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

  • Network access controls (publicNetworkAccess, firewall rules)
  • Backup retention and scheduling configuration
  • Preview features and advanced cluster settings
  • Connection strings and client authentication setup

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 & Modes
What are the different ways to create a Mongo Cluster?

You can create a cluster in three ways using createMode:

  1. Default (new cluster) - Provide administrator, compute, storage, and optional highAvailability and sharding settings
  2. PointInTimeRestore - Restore from a backup using restoreParameters with pointInTimeUTC and sourceResourceId
  3. GeoReplica - Create a replica using replicaParameters with sourceLocation and sourceResourceId
How do I restore a Mongo Cluster from a point in time?
Set createMode to PointInTimeRestore and provide restoreParameters with pointInTimeUTC (timestamp like “2023-01-13T20:07:35Z”) and sourceResourceId (the source cluster’s resource ID).
How do I create a geo-replica cluster?
Set createMode to GeoReplica and provide replicaParameters with sourceLocation (e.g., “eastus”) and sourceResourceId (the source cluster’s resource ID). The replica cluster should be in a different location (e.g., “centralus”).
What properties can't I change after creating a cluster?
The location, mongoClusterName, and resourceGroupName properties are immutable and cannot be changed after cluster creation.
Configuration & Scaling
What configuration options are available for a new cluster?

When creating a new cluster, you can configure:

  • Administrator - userName and password for admin access
  • Compute - tier (e.g., “M30”)
  • Storage - sizeGb (e.g., 128)
  • High Availability - targetMode (e.g., “SameZone”)
  • Sharding - shardCount (e.g., 1)
  • Server Version - serverVersion (e.g., “5.0”)
How do I configure high availability for my cluster?
Set the highAvailability.targetMode property. The example shows “SameZone” as an available mode.
How do I enable sharding on my cluster?
Configure the sharding.shardCount property with the desired number of shards (e.g., 1 for a single shard).
Operations & Management
Can I import an existing Mongo Cluster into Pulumi?
Yes, use the import command: pulumi import azure-native:mongocluster:MongoCluster <name> <resourceId> where resourceId follows the format /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DocumentDB/mongoClusters/{mongoClusterName}.

Using a different cloud?

Explore database guides for other cloud providers: