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 FREEFrequently Asked Questions
Cluster Creation & Modes
You can create a cluster in three ways using createMode:
- Default (new cluster) - Provide
administrator,compute,storage, and optionalhighAvailabilityandshardingsettings - PointInTimeRestore - Restore from a backup using
restoreParameterswithpointInTimeUTCandsourceResourceId - GeoReplica - Create a replica using
replicaParameterswithsourceLocationandsourceResourceId
createMode to PointInTimeRestore and provide restoreParameters with pointInTimeUTC (timestamp like “2023-01-13T20:07:35Z”) and sourceResourceId (the source cluster’s resource ID).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”).location, mongoClusterName, and resourceGroupName properties are immutable and cannot be changed after cluster creation.Configuration & Scaling
When creating a new cluster, you can configure:
- Administrator -
userNameandpasswordfor 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”)
highAvailability.targetMode property. The example shows “SameZone” as an available mode.sharding.shardCount property with the desired number of shards (e.g., 1 for a single shard).Operations & Management
pulumi import azure-native:mongocluster:MongoCluster <name> <resourceId> where resourceId follows the format /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DocumentDB/mongoClusters/{mongoClusterName}.