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 FREEFrequently Asked Questions
Cluster Creation & Deployment Modes
You can create a cluster in three ways using createMode:
- Default - Create a new cluster from scratch
- PointInTimeRestore - Restore from a backup at a specific timestamp
- GeoReplica - Create a geo-replica of an existing cluster
location, mongoClusterName, resourceGroupName, and the properties object with administrator (userName and password), compute (tier), storage (sizeGb), serverVersion, and sharding (shardCount).createMode to PointInTimeRestore and provide restoreParameters with pointInTimeUTC (timestamp in ISO 8601 format) and sourceResourceId (the resource ID of the source cluster).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
location, mongoClusterName, and resourceGroupName properties are immutable. To change these, you must create a new cluster.highAvailability property with targetMode to specify the HA configuration. For example, SameZone deploys replicas within the same availability zone.sharding property with shardCount to specify the number of shards. For example, shardCount: 1 creates a single-shard cluster.API Versions & Compatibility
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.