Udostępnij przez


Microsoft.DocumentDB mongoClusters 2024-07-01

Definicja zasobu Bicep

Typ zasobu mongoClusters można wdrożyć przy użyciu operacji docelowych:

Aby uzyskać listę zmienionych właściwości w każdej wersji interfejsu API, zobacz dziennika zmian.

Format zasobu

Aby utworzyć zasób Microsoft.DocumentDB/mongoClusters, dodaj następujący kod Bicep do szablonu.

resource symbolicname 'Microsoft.DocumentDB/mongoClusters@2024-07-01' = {
  scope: resourceSymbolicName or scope
  location: 'string'
  name: 'string'
  properties: {
    administrator: {
      password: 'string'
      userName: 'string'
    }
    backup: {}
    compute: {
      tier: 'string'
    }
    createMode: 'string'
    highAvailability: {
      targetMode: 'string'
    }
    previewFeatures: [
      'string'
    ]
    publicNetworkAccess: 'string'
    replicaParameters: {
      sourceLocation: 'string'
      sourceResourceId: 'string'
    }
    restoreParameters: {
      pointInTimeUTC: 'string'
      sourceResourceId: 'string'
    }
    serverVersion: 'string'
    sharding: {
      shardCount: int
    }
    storage: {
      sizeGb: int
    }
  }
  tags: {
    {customized property}: 'string'
  }
}

Wartości właściwości

Microsoft.DocumentDB/mongoClusters

Nazwa Opis Wartość
lokalizacja Lokalizacja geograficzna, w której znajduje się zasób ciąg (wymagany)
nazwa Nazwa zasobu struna

Ograniczenia:
Minimalna długość = 3
Maksymalna długość = 40
Wzorzec = ^[a-z0-9]+(-[a-z0-9]+)* (wymagane)
Właściwości Właściwości specyficzne dla zasobu dla tego zasobu. MongoClusterProperties
zakres Użyj polecenia podczas tworzenia zasobu w zakresie innym niż zakres wdrożenia. Ustaw tę właściwość na symboliczną nazwę zasobu, aby zastosować zasób rozszerzenia.
Tagi Tagi zasobów Słownik nazw tagów i wartości. Zobacz tagi w szablonach

Właściwości administratora

Nazwa Opis Wartość
hasło Hasło administratora. struna

Ograniczenia:
Wartość wrażliwa. Przekaż jako bezpieczny parametr.
userName (nazwa użytkownika) Nazwa użytkownika administratora. ciąg

Właściwości kopii zapasowej

Nazwa Opis Wartość

Właściwości obliczeniowe

Nazwa Opis Wartość
warstwa Warstwa obliczeniowa do przypisania do klastra, w której każda warstwa jest mapowana na rozmiar rdzenia wirtualnego i pamięci. Przykładowe wartości: "M30", "M40". ciąg

HighAvailabilityProperties (Właściwości wysokiej dostępności)

Nazwa Opis Wartość
targetMode (tryb docelowy) Docelowy tryb wysokiej dostępności żądany dla klastra. "Wyłączone"
"Ta sama strefa"
"ZoneRedundantPreferred"

MongoClusterProperties

Nazwa Opis Wartość
administrator Właściwości administratora lokalnego dla klastra mongo. administrator
kopia zapasowa Właściwości kopii zapasowej klastra mongo. Właściwości kopii zapasowej
obliczanie Właściwości obliczeniowe klastra mongo. Właściwości obliczeniowe
createMode (tryb tworzenia) Tryb tworzenia klastra mongo. "Wartość domyślna"
"GeoReplica"
"PointInTimeRestore"
"Replika"
wysoka dostępność Właściwości wysokiej dostępności klastra mongo. HighAvailabilityProperties (Właściwości wysokiej dostępności)
Funkcje w wersji zapoznawczej Lista połączeń prywatnych punktów końcowych. Tablica ciągów zawierająca dowolną z:
"GeoReplicas"
dostęp do sieci publicznej Określa, czy dostęp do publicznego punktu końcowego jest dozwolony dla tego klastra mongo. "Wyłączone"
"Włączone"
replicaParameters (parametry repliki) Parametry do utworzenia repliki klastra mongo. MongoClusterReplicaParameters (Parametry repliki)
restoreParameters (parametry przywracania) Parametry do utworzenia klastra mongo przywracania do punktu w czasie. MongoClusterRestoreParameters
wersja serwera Wersja serwera Mongo DB. Wartość domyślna to najnowsza dostępna wersja, jeśli nie zostanie określona. ciąg
fragmentowanie Właściwości fragmentowania klastra mongo. Właściwości fragmentowania
magazyn Właściwości magazynu klastra mongo. StorageWłaściwości

MongoClusterReplicaParameters (Parametry repliki)

Nazwa Opis Wartość
lokalizacja źródłowa Lokalizacja klastra źródłowego ciąg (wymagany)
sourceResourceId (identyfikator źródłowy) Identyfikator klastra źródłowego replikacji. ciąg (wymagany)

MongoClusterRestoreParameters

Nazwa Opis Wartość
pointInTimeUTC (punkt w czasie) Punkt CZASU UTC w celu przywrócenia klastra mongo ciąg
sourceResourceId (identyfikator źródłowy) Identyfikator zasobu do zlokalizowania klastra źródłowego do przywrócenia ciąg

Właściwości fragmentowania

Nazwa Opis Wartość
shardCount (liczba odłamków) Liczba fragmentów do aprowizacji w klastrze. Int

Właściwości magazynu

Nazwa Opis Wartość
rozmiarGb Rozmiar dysku danych przypisany do każdego serwera. Int

Śledzone tagi zasobów

Nazwa Opis Wartość

Przykłady użycia

Moduły zweryfikowane na platformie Azure

Następujące moduły zweryfikowane platformy Azure mogą służyć do wdrażania tego typu zasobu.

Moduł Opis
Cosmos DB for MongoDB (rdzeń wirtualny) Moduł zasobów AVM dla usługi Cosmos DB dla bazy danych MongoDB (rdzeń wirtualny)

Definicja zasobu szablonu usługi ARM

Typ zasobu mongoClusters można wdrożyć przy użyciu operacji docelowych:

Aby uzyskać listę zmienionych właściwości w każdej wersji interfejsu API, zobacz dziennika zmian.

Format zasobu

Aby utworzyć zasób Microsoft.DocumentDB/mongoClusters, dodaj następujący kod JSON do szablonu.

{
  "type": "Microsoft.DocumentDB/mongoClusters",
  "apiVersion": "2024-07-01",
  "name": "string",
  "location": "string",
  "properties": {
    "administrator": {
      "password": "string",
      "userName": "string"
    },
    "backup": {
    },
    "compute": {
      "tier": "string"
    },
    "createMode": "string",
    "highAvailability": {
      "targetMode": "string"
    },
    "previewFeatures": [ "string" ],
    "publicNetworkAccess": "string",
    "replicaParameters": {
      "sourceLocation": "string",
      "sourceResourceId": "string"
    },
    "restoreParameters": {
      "pointInTimeUTC": "string",
      "sourceResourceId": "string"
    },
    "serverVersion": "string",
    "sharding": {
      "shardCount": "int"
    },
    "storage": {
      "sizeGb": "int"
    }
  },
  "tags": {
    "{customized property}": "string"
  }
}

Wartości właściwości

Microsoft.DocumentDB/mongoClusters

Nazwa Opis Wartość
apiVersion (wersja interfejsu api) Wersja interfejsu API '2024-07-01'
lokalizacja Lokalizacja geograficzna, w której znajduje się zasób ciąg (wymagany)
nazwa Nazwa zasobu struna

Ograniczenia:
Minimalna długość = 3
Maksymalna długość = 40
Wzorzec = ^[a-z0-9]+(-[a-z0-9]+)* (wymagane)
Właściwości Właściwości specyficzne dla zasobu dla tego zasobu. MongoClusterProperties
Tagi Tagi zasobów Słownik nazw tagów i wartości. Zobacz tagi w szablonach
typ Typ zasobu "Microsoft.DocumentDB/mongoClusters"

Właściwości administratora

Nazwa Opis Wartość
hasło Hasło administratora. struna

Ograniczenia:
Wartość wrażliwa. Przekaż jako bezpieczny parametr.
userName (nazwa użytkownika) Nazwa użytkownika administratora. ciąg

Właściwości kopii zapasowej

Nazwa Opis Wartość

Właściwości obliczeniowe

Nazwa Opis Wartość
warstwa Warstwa obliczeniowa do przypisania do klastra, w której każda warstwa jest mapowana na rozmiar rdzenia wirtualnego i pamięci. Przykładowe wartości: "M30", "M40". ciąg

HighAvailabilityProperties (Właściwości wysokiej dostępności)

Nazwa Opis Wartość
targetMode (tryb docelowy) Docelowy tryb wysokiej dostępności żądany dla klastra. "Wyłączone"
"Ta sama strefa"
"ZoneRedundantPreferred"

MongoClusterProperties

Nazwa Opis Wartość
administrator Właściwości administratora lokalnego dla klastra mongo. administrator
kopia zapasowa Właściwości kopii zapasowej klastra mongo. Właściwości kopii zapasowej
obliczanie Właściwości obliczeniowe klastra mongo. Właściwości obliczeniowe
createMode (tryb tworzenia) Tryb tworzenia klastra mongo. "Wartość domyślna"
"GeoReplica"
"PointInTimeRestore"
"Replika"
wysoka dostępność Właściwości wysokiej dostępności klastra mongo. HighAvailabilityProperties (Właściwości wysokiej dostępności)
Funkcje w wersji zapoznawczej Lista połączeń prywatnych punktów końcowych. Tablica ciągów zawierająca dowolną z:
"GeoReplicas"
dostęp do sieci publicznej Określa, czy dostęp do publicznego punktu końcowego jest dozwolony dla tego klastra mongo. "Wyłączone"
"Włączone"
replicaParameters (parametry repliki) Parametry do utworzenia repliki klastra mongo. MongoClusterReplicaParameters (Parametry repliki)
restoreParameters (parametry przywracania) Parametry do utworzenia klastra mongo przywracania do punktu w czasie. MongoClusterRestoreParameters
wersja serwera Wersja serwera Mongo DB. Wartość domyślna to najnowsza dostępna wersja, jeśli nie zostanie określona. ciąg
fragmentowanie Właściwości fragmentowania klastra mongo. Właściwości fragmentowania
magazyn Właściwości magazynu klastra mongo. StorageWłaściwości

MongoClusterReplicaParameters (Parametry repliki)

Nazwa Opis Wartość
lokalizacja źródłowa Lokalizacja klastra źródłowego ciąg (wymagany)
sourceResourceId (identyfikator źródłowy) Identyfikator klastra źródłowego replikacji. ciąg (wymagany)

MongoClusterRestoreParameters

Nazwa Opis Wartość
pointInTimeUTC (punkt w czasie) Punkt CZASU UTC w celu przywrócenia klastra mongo ciąg
sourceResourceId (identyfikator źródłowy) Identyfikator zasobu do zlokalizowania klastra źródłowego do przywrócenia ciąg

Właściwości fragmentowania

Nazwa Opis Wartość
shardCount (liczba odłamków) Liczba fragmentów do aprowizacji w klastrze. Int

Właściwości magazynu

Nazwa Opis Wartość
rozmiarGb Rozmiar dysku danych przypisany do każdego serwera. Int

Śledzone tagi zasobów

Nazwa Opis Wartość

Przykłady użycia

Definicja zasobu narzędzia Terraform (dostawcy AzAPI)

Typ zasobu mongoClusters można wdrożyć przy użyciu operacji docelowych:

Aby uzyskać listę zmienionych właściwości w każdej wersji interfejsu API, zobacz dziennika zmian.

Format zasobu

Aby utworzyć zasób Microsoft.DocumentDB/mongoClusters, dodaj następujący program Terraform do szablonu.

resource "azapi_resource" "symbolicname" {
  type = "Microsoft.DocumentDB/mongoClusters@2024-07-01"
  name = "string"
  parent_id = "string"
  location = "string"
  tags = {
    {customized property} = "string"
  }
  body = {
    properties = {
      administrator = {
        password = "string"
        userName = "string"
      }
      backup = {
      }
      compute = {
        tier = "string"
      }
      createMode = "string"
      highAvailability = {
        targetMode = "string"
      }
      previewFeatures = [
        "string"
      ]
      publicNetworkAccess = "string"
      replicaParameters = {
        sourceLocation = "string"
        sourceResourceId = "string"
      }
      restoreParameters = {
        pointInTimeUTC = "string"
        sourceResourceId = "string"
      }
      serverVersion = "string"
      sharding = {
        shardCount = int
      }
      storage = {
        sizeGb = int
      }
    }
  }
}

Wartości właściwości

Microsoft.DocumentDB/mongoClusters

Nazwa Opis Wartość
lokalizacja Lokalizacja geograficzna, w której znajduje się zasób ciąg (wymagany)
nazwa Nazwa zasobu struna

Ograniczenia:
Minimalna długość = 3
Maksymalna długość = 40
Wzorzec = ^[a-z0-9]+(-[a-z0-9]+)* (wymagane)
parent_id Identyfikator zasobu, do który ma być stosowany ten zasób rozszerzenia. ciąg (wymagany)
Właściwości Właściwości specyficzne dla zasobu dla tego zasobu. MongoClusterProperties
Tagi Tagi zasobów Słownik nazw tagów i wartości.
typ Typ zasobu "Microsoft.DocumentDB/mongoClusters@2024-07-01"

Właściwości administratora

Nazwa Opis Wartość
hasło Hasło administratora. struna

Ograniczenia:
Wartość wrażliwa. Przekaż jako bezpieczny parametr.
userName (nazwa użytkownika) Nazwa użytkownika administratora. ciąg

Właściwości kopii zapasowej

Nazwa Opis Wartość

Właściwości obliczeniowe

Nazwa Opis Wartość
warstwa Warstwa obliczeniowa do przypisania do klastra, w której każda warstwa jest mapowana na rozmiar rdzenia wirtualnego i pamięci. Przykładowe wartości: "M30", "M40". ciąg

HighAvailabilityProperties (Właściwości wysokiej dostępności)

Nazwa Opis Wartość
targetMode (tryb docelowy) Docelowy tryb wysokiej dostępności żądany dla klastra. "Wyłączone"
"Ta sama strefa"
"ZoneRedundantPreferred"

MongoClusterProperties

Nazwa Opis Wartość
administrator Właściwości administratora lokalnego dla klastra mongo. administrator
kopia zapasowa Właściwości kopii zapasowej klastra mongo. Właściwości kopii zapasowej
obliczanie Właściwości obliczeniowe klastra mongo. Właściwości obliczeniowe
createMode (tryb tworzenia) Tryb tworzenia klastra mongo. "Wartość domyślna"
"GeoReplica"
"PointInTimeRestore"
"Replika"
wysoka dostępność Właściwości wysokiej dostępności klastra mongo. HighAvailabilityProperties (Właściwości wysokiej dostępności)
Funkcje w wersji zapoznawczej Lista połączeń prywatnych punktów końcowych. Tablica ciągów zawierająca dowolną z:
"GeoReplicas"
dostęp do sieci publicznej Określa, czy dostęp do publicznego punktu końcowego jest dozwolony dla tego klastra mongo. "Wyłączone"
"Włączone"
replicaParameters (parametry repliki) Parametry do utworzenia repliki klastra mongo. MongoClusterReplicaParameters (Parametry repliki)
restoreParameters (parametry przywracania) Parametry do utworzenia klastra mongo przywracania do punktu w czasie. MongoClusterRestoreParameters
wersja serwera Wersja serwera Mongo DB. Wartość domyślna to najnowsza dostępna wersja, jeśli nie zostanie określona. ciąg
fragmentowanie Właściwości fragmentowania klastra mongo. Właściwości fragmentowania
magazyn Właściwości magazynu klastra mongo. StorageWłaściwości

MongoClusterReplicaParameters (Parametry repliki)

Nazwa Opis Wartość
lokalizacja źródłowa Lokalizacja klastra źródłowego ciąg (wymagany)
sourceResourceId (identyfikator źródłowy) Identyfikator klastra źródłowego replikacji. ciąg (wymagany)

MongoClusterRestoreParameters

Nazwa Opis Wartość
pointInTimeUTC (punkt w czasie) Punkt CZASU UTC w celu przywrócenia klastra mongo ciąg
sourceResourceId (identyfikator źródłowy) Identyfikator zasobu do zlokalizowania klastra źródłowego do przywrócenia ciąg

Właściwości fragmentowania

Nazwa Opis Wartość
shardCount (liczba odłamków) Liczba fragmentów do aprowizacji w klastrze. Int

Właściwości magazynu

Nazwa Opis Wartość
rozmiarGb Rozmiar dysku danych przypisany do każdego serwera. Int

Śledzone tagi zasobów

Nazwa Opis Wartość

Przykłady użycia

Przykłady programu Terraform

Podstawowy przykład wdrażania Azure Cosmos DB dla MongoDB (vCore).

terraform {
  required_providers {
    azapi = {
      source = "Azure/azapi"
    }
    time = {
      source = "hashicorp/time"
    }
  }
}

provider "azapi" {
  skip_provider_registration = false
}

variable "resource_name" {
  type    = string
  default = "acctest0001"
}

variable "location" {
  type    = string
  default = "westus3"
}

variable "replica_location" {
  type    = string
  default = "centralus"
}

variable "mongo_admin_username" {
  type    = string
  default = "mongoAdmin"
}

variable "mongo_admin_password" {
  type        = string
  description = "The administrator password for the MongoDB cluster"
  sensitive   = true
}

variable "mongo_restore_admin_password" {
  type        = string
  description = "The administrator password for the restored MongoDB cluster"
  sensitive   = true
}

resource "azapi_resource" "resourceGroup" {
  type     = "Microsoft.Resources/resourceGroups@2020-06-01"
  name     = var.resource_name
  location = var.location
}

resource "azapi_resource" "userAssignedIdentity" {
  type                      = "Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31"
  parent_id                 = azapi_resource.resourceGroup.id
  name                      = var.resource_name
  location                  = var.location
  schema_validation_enabled = false
  response_export_values    = ["*"]
}

data "azapi_client_config" "current" {}

resource "azapi_resource" "vault" {
  type      = "Microsoft.KeyVault/vaults@2023-02-01"
  parent_id = azapi_resource.resourceGroup.id
  name      = "${var.resource_name}-kv"
  location  = var.location
  body = {
    properties = {
      createMode                   = "default"
      enablePurgeProtection        = true
      enableSoftDelete             = true
      enableRbacAuthorization      = true
      enabledForDeployment         = true
      enabledForDiskEncryption     = true
      enabledForTemplateDeployment = true
      publicNetworkAccess          = "Enabled"
      accessPolicies               = []
      sku = {
        family = "A"
        name   = "standard"
      }
      tenantId = data.azapi_client_config.current.tenant_id
    }
  }
}

data "azapi_resource_list" "kvCertificatesOfficerRoleDefinition" {
  type      = "Microsoft.Authorization/roleDefinitions@2022-04-01"
  parent_id = azapi_resource.vault.id
  response_export_values = {
    definition_id = "value[?properties.roleName == 'Key Vault Crypto Officer'].id | [0]"
  }
}

resource "azapi_resource" "kvRoleAssignmentTf" {
  type      = "Microsoft.Authorization/roleAssignments@2022-04-01"
  parent_id = azapi_resource.vault.id
  name      = uuid()
  body = {
    properties = {
      principalId      = data.azapi_client_config.current.object_id
      roleDefinitionId = data.azapi_resource_list.kvCertificatesOfficerRoleDefinition.output.definition_id
    }
  }
  lifecycle {
    ignore_changes = [name]
  }
}

data "azapi_resource_list" "kvCertificatesUserRoleDefinition" {
  type      = "Microsoft.Authorization/roleDefinitions@2022-04-01"
  parent_id = azapi_resource.vault.id
  response_export_values = {
    definition_id = "value[?properties.roleName == 'Key Vault Crypto Service Encryption User'].id | [0]"
  }
}

resource "azapi_resource" "kvRoleAssignmentIdentity" {
  type      = "Microsoft.Authorization/roleAssignments@2022-04-01"
  parent_id = azapi_resource.vault.id
  name      = uuid()
  body = {
    properties = {
      principalId      = azapi_resource.userAssignedIdentity.output.properties.principalId
      roleDefinitionId = data.azapi_resource_list.kvCertificatesUserRoleDefinition.output.definition_id
    }
  }
  lifecycle {
    ignore_changes = [name]
  }
}

data "azapi_resource_id" "key" {
  type      = "Microsoft.KeyVault/vaults/keys@2023-02-01"
  parent_id = azapi_resource.vault.id
  name      = var.resource_name
}

resource "azapi_resource_action" "key" {
  type        = "Microsoft.KeyVault/vaults/keys@2023-02-01"
  resource_id = data.azapi_resource_id.key.id
  method      = "PUT"
  body = {
    properties = {
      keySize = 2048
      kty     = "RSA"
      keyOps  = ["encrypt", "decrypt", "sign", "verify", "wrapKey", "unwrapKey"]
    }
  }
  response_export_values = ["*"]
  depends_on = [
    azapi_resource.kvRoleAssignmentTf,
    azapi_resource.kvRoleAssignmentIdentity,
  ]
}

# replica key vault

resource "azapi_resource" "vault_replica" {
  type      = "Microsoft.KeyVault/vaults@2023-02-01"
  parent_id = azapi_resource.resourceGroup.id
  name      = "${var.resource_name}-kv-replica"
  location  = var.replica_location
  body = {
    properties = {
      createMode                   = "default"
      enablePurgeProtection        = true
      enableSoftDelete             = true
      enableRbacAuthorization      = true
      enabledForDeployment         = true
      enabledForDiskEncryption     = true
      enabledForTemplateDeployment = true
      publicNetworkAccess          = "Enabled"
      accessPolicies               = []
      sku = {
        family = "A"
        name   = "standard"
      }
      tenantId = data.azapi_client_config.current.tenant_id
    }
  }
}

data "azapi_resource_list" "kvCertificatesOfficerRoleDefinition_replica" {
  type      = "Microsoft.Authorization/roleDefinitions@2022-04-01"
  parent_id = azapi_resource.vault_replica.id
  response_export_values = {
    definition_id = "value[?properties.roleName == 'Key Vault Crypto Officer'].id | [0]"
  }
}

resource "azapi_resource" "kvRoleAssignmentTf_replica" {
  type      = "Microsoft.Authorization/roleAssignments@2022-04-01"
  parent_id = azapi_resource.vault_replica.id
  name      = uuid()
  body = {
    properties = {
      principalId      = data.azapi_client_config.current.object_id
      roleDefinitionId = data.azapi_resource_list.kvCertificatesOfficerRoleDefinition.output.definition_id
    }
  }
  lifecycle {
    ignore_changes = [name]
  }
}

data "azapi_resource_list" "kvCertificatesUserRoleDefinition_replica" {
  type      = "Microsoft.Authorization/roleDefinitions@2022-04-01"
  parent_id = azapi_resource.vault_replica.id
  response_export_values = {
    definition_id = "value[?properties.roleName == 'Key Vault Crypto Service Encryption User'].id | [0]"
  }
}

resource "azapi_resource" "kvRoleAssignmentIdentity_replica" {
  type      = "Microsoft.Authorization/roleAssignments@2022-04-01"
  parent_id = azapi_resource.vault_replica.id
  name      = uuid()
  body = {
    properties = {
      principalId      = azapi_resource.userAssignedIdentity.output.properties.principalId
      roleDefinitionId = data.azapi_resource_list.kvCertificatesUserRoleDefinition.output.definition_id
    }
  }
  lifecycle {
    ignore_changes = [name]
  }
}

data "azapi_resource_id" "key_replica" {
  type      = "Microsoft.KeyVault/vaults/keys@2023-02-01"
  parent_id = azapi_resource.vault_replica.id
  name      = var.resource_name
}

resource "azapi_resource_action" "key_replica" {
  type        = "Microsoft.KeyVault/vaults/keys@2023-02-01"
  resource_id = data.azapi_resource_id.key_replica.id
  method      = "PUT"
  body = {
    properties = {
      keySize = 2048
      kty     = "RSA"
      keyOps  = ["encrypt", "decrypt", "sign", "verify", "wrapKey", "unwrapKey"]
    }
  }
  response_export_values = ["*"]
  depends_on = [
    azapi_resource.kvRoleAssignmentTf_replica,
    azapi_resource.kvRoleAssignmentIdentity_replica,
  ]
}

resource "azapi_resource" "mongoCluster" {
  type      = "Microsoft.DocumentDB/mongoClusters@2025-09-01"
  parent_id = azapi_resource.resourceGroup.id
  name      = var.resource_name
  location  = var.location
  identity {
    type         = "UserAssigned"
    identity_ids = [azapi_resource.userAssignedIdentity.id]
  }
  body = {
    properties = {
      administrator = {
        userName = var.mongo_admin_username
      }
      authConfig = {
        allowedModes = ["MicrosoftEntraID", "NativeAuth"]
      }
      compute = {
        tier = "M30"
      }
      encryption = {
        customerManagedKeyEncryption = {
          keyEncryptionKeyIdentity = {
            identityType                   = "UserAssignedIdentity"
            userAssignedIdentityResourceId = azapi_resource.userAssignedIdentity.id
          }
          keyEncryptionKeyUrl = azapi_resource_action.key.output.properties.keyUri
        }
      }
      highAvailability = {
        targetMode = "Disabled"
      }
      previewFeatures = [
        "ShardRebalancer"
      ]
      publicNetworkAccess = "Enabled"
      serverVersion       = "5.0"
      sharding = {
        shardCount = 1
      }
      storage = {
        sizeGb = 32
      }
    }
  }
  sensitive_body = {
    properties = {
      administrator = {
        password = var.mongo_admin_password
      }
    }
  }
  tags = {
    Environment = "Test"
  }
  schema_validation_enabled = false
  response_export_values    = ["*"]
}

# Wait for the MongoDB cluster to have backup capability available
resource "time_sleep" "wait_for_backup_ready" {
  depends_on = [azapi_resource.mongoCluster]

  # Wait 5 minutes for backup to be available - MongoDB clusters typically need time to enable backup
  create_duration = "300s"
}

# Data source to get the updated cluster info with backup details
data "azapi_resource" "mongoCluster_backup_check" {
  type        = "Microsoft.DocumentDB/mongoClusters@2025-09-01"
  resource_id = azapi_resource.mongoCluster.id

  response_export_values = ["properties.backup.earliestRestoreTime"]
  depends_on             = [time_sleep.wait_for_backup_ready]
}

resource "azapi_resource" "mongoCluster_PointInTimeRestore" {
  type      = "Microsoft.DocumentDB/mongoClusters@2025-09-01"
  parent_id = azapi_resource.resourceGroup.id
  name      = "${var.resource_name}-restore"
  location  = var.location
  identity {
    type         = "UserAssigned"
    identity_ids = [azapi_resource.userAssignedIdentity.id]
  }
  body = {
    properties = {
      createMode = "PointInTimeRestore"
      administrator = {
        userName = var.mongo_admin_username
      }
      encryption = {
        customerManagedKeyEncryption = {
          keyEncryptionKeyIdentity = {
            identityType                   = "UserAssignedIdentity"
            userAssignedIdentityResourceId = azapi_resource.userAssignedIdentity.id
          }
          keyEncryptionKeyUrl = azapi_resource_action.key.output.properties.keyUri
        }
      }
      restoreParameters = {
        pointInTimeUTC   = data.azapi_resource.mongoCluster_backup_check.output.properties.backup.earliestRestoreTime
        sourceResourceId = azapi_resource.mongoCluster.id
      }
    }
  }
  sensitive_body = {
    properties = {
      administrator = {
        password = var.mongo_restore_admin_password
      }
    }
  }
  schema_validation_enabled = false
  ignore_casing             = false
  ignore_missing_property   = false

  depends_on = [
    data.azapi_resource.mongoCluster_backup_check
  ]
}

resource "azapi_resource" "mongoCluster_GeoReplica" {
  type      = "Microsoft.DocumentDB/mongoClusters@2025-09-01"
  parent_id = azapi_resource.resourceGroup.id
  name      = "${var.resource_name}-repl"
  location  = var.replica_location
  identity {
    type         = "UserAssigned"
    identity_ids = [azapi_resource.userAssignedIdentity.id]
  }
  body = {
    properties = {
      createMode = "GeoReplica"
      encryption = {
        customerManagedKeyEncryption = {
          keyEncryptionKeyIdentity = {
            identityType                   = "UserAssignedIdentity"
            userAssignedIdentityResourceId = azapi_resource.userAssignedIdentity.id
          }
          keyEncryptionKeyUrl = azapi_resource_action.key_replica.output.properties.keyUri
        }
      }
      replicaParameters = {
        sourceLocation   = var.location # Source location matches the primary cluster
        sourceResourceId = azapi_resource.mongoCluster.id
      }
    }
  }
  schema_validation_enabled = false
  response_export_values    = ["*"]
}