Condividi tramite


Microsoft.DocumentDB mongoClusters

Definizione di risorsa Bicep

Il tipo di risorsa mongoClusters può essere distribuito con operazioni destinate a:

  • gruppi di risorse - Vedere i comandi di distribuzione del gruppo di risorse

Per un elenco delle proprietà modificate in ogni versione dell'API, vedere log delle modifiche.

Formato risorsa

Per creare una risorsa Microsoft.DocumentDB/mongoClusters, aggiungere il bicep seguente al modello.

resource symbolicname 'Microsoft.DocumentDB/mongoClusters@2025-09-01' = {
  identity: {
    type: 'string'
    userAssignedIdentities: {
      {customized property}: {}
    }
  }
  location: 'string'
  name: 'string'
  properties: {
    administrator: {
      password: 'string'
      userName: 'string'
    }
    authConfig: {
      allowedModes: [
        'string'
      ]
    }
    backup: {}
    compute: {
      tier: 'string'
    }
    createMode: 'string'
    dataApi: {
      mode: 'string'
    }
    encryption: {
      customerManagedKeyEncryption: {
        keyEncryptionKeyIdentity: {
          identityType: 'string'
          userAssignedIdentityResourceId: 'string'
        }
        keyEncryptionKeyUrl: '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
      type: 'string'
    }
  }
  tags: {
    {customized property}: 'string'
  }
}

Valori delle proprietà

Microsoft.DocumentDB/mongoClusters

Nome Descrizione Valore
identità Identità del servizio gestito assegnate a questa risorsa. ManagedServiceIdentity
ubicazione Posizione geografica in cui risiede la risorsa stringa (obbligatorio)
nome Nome della risorsa corda

Vincoli:
Lunghezza minima = 3
Lunghezza massima = 40
Pattern = ^[a-z0-9]+(-[a-z0-9]+)* (obbligatorio)
proprietà Proprietà specifiche della risorsa. Proprietà MongoCluster
Tag Tag delle risorse Dizionario di nomi e valori di tag. Vedere tag nei modelli

Proprietà dell'amministratore

Nome Descrizione Valore
parola d’ordine Password amministratore. corda

Vincoli:
Valore sensibile. Passare come parametro sicuro.
nome utente Nome utente amministratore. corda

AuthConfigProperties

Nome Descrizione Valore
allowedModes Modalità di autenticazione consentite per l'accesso ai dati nel cluster. Matrice di stringhe contenente uno dei seguenti elementi:
'MicrosoftEntraID'
'NativeAuth'

BackupProprietà

Nome Descrizione Valore

Proprietà di calcolo

Nome Descrizione Valore
livello Livello di calcolo da assegnare al cluster, in cui ogni livello esegue il mapping a una dimensione di memoria e core virtuale. Valori di esempio: 'M30', 'M40'. corda

CustomerManagedKeyEncryptionProperties

Nome Descrizione Valore
keyEncryptionKeyIdentity L'identità utilizzata per accedere alla chiave di crittografia della chiave. KeyEncryptionKeyIdentity
keyEncryptionKeyUrl URI della chiave dell'insieme di credenziali delle chiavi usata per la crittografia. corda

DataApiProperties

Nome Descrizione Valore
modo Modalità per indicare se l'API Dati Mongo è abilitata per un cluster. 'Disabilitato'
'Abilitato'

EncryptionProperties

Nome Descrizione Valore
customerManagedKeyEncryption Impostazioni di crittografia delle chiavi gestite dal cliente. Proprietà CustomerManagedKeyEncryptionProperties

Proprietà HighAvailabilityProperties

Nome Descrizione Valore
targetMode Modalità di disponibilità elevata di destinazione richiesta per il cluster. 'Disabilitato'
'SameZone'
'Zona ridondantePreferito'

KeyEncryptionKeyIdentity

Nome Descrizione Valore
tipo di identità Tipo di identità. È supportato solo 'UserAssignedIdentity'. 'IdentitàAssegnataUtente'
userAssignedIdentityResourceId ID risorsa di identità assegnato dall'utente. corda

Identità dei Servizi Gestiti

Nome Descrizione Valore
digitare Tipo di identità del servizio gestito (in cui sono consentiti sia i tipi SystemAssigned che UserAssigned). 'None'
'SystemAssigned'
'SystemAssigned,UserAssigned'
'UserAssigned' (obbligatorio)
identità assegnate dall'utente Set di identità assegnate dall'utente associate alla risorsa. Le chiavi del dizionario userAssignedIdentities saranno ID risorsa ARM nel formato : '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}. I valori del dizionario possono essere oggetti vuoti ({}) nelle richieste. UserAssignedIdentities

Proprietà MongoCluster

Nome Descrizione Valore
amministratore Proprietà dell'amministratore locale per il cluster mongo. Proprietà dell'amministratore
authConfig Configurazione dell'autenticazione per il cluster. AuthConfigProperties
copia di sicurezza Proprietà di backup del cluster mongo. BackupProperties
calcolare Proprietà di calcolo del cluster mongo. ComputeProperties
createMode Modalità per creare un cluster mongo. Impostazione predefinita
'GeoReplica'
'PointInTimeRestore'
'Replica'
dataApi Proprietà dell'API dati del cluster mongo. DataApiProperties
Crittografia Configurazione della crittografia per il cluster. Dipende dall'identità configurata. Proprietà di crittografia
alta disponibilità Proprietà a disponibilità elevata del cluster mongo. HighAvailabilityProperties
anteprimaCaratteristiche Elenco delle connessioni endpoint private. Matrice di stringhe contenente uno dei seguenti elementi:
'Repliche geografiche'
pubblicoAccesso alla rete Indica se l'accesso all'endpoint pubblico è consentito per questo cluster mongo. 'Disabilitato'
'Abilitato'
replicaParameters Parametri per creare un cluster mongo di replica. Parametri MongoClusterReplicaReplica
restoreParameters Parametri per creare un cluster mongo di ripristino temporizzato. MongoClusterRestoreParameters
versioneDelServer Versione del server Mongo DB. L'impostazione predefinita è la versione disponibile più recente, se non specificata. corda
partizionamento orizzontale Proprietà di partizionamento orizzontale del cluster mongo. proprietà di partizionamento orizzontale
immagazzinamento Proprietà di archiviazione del cluster mongo. Proprietà di archiviazione

Parametri MongoClusterReplicaReplica

Nome Descrizione Valore
sourceLocation Percorso del cluster di origine stringa (obbligatorio)
sourceResourceId ID del cluster di origine della replica. stringa (obbligatorio)

MongoClusterRestoreParameters

Nome Descrizione Valore
pointInTimeUTC Ora UTC per ripristinare un cluster mongo corda
sourceResourceId ID risorsa per individuare il cluster di origine da ripristinare corda

Proprietà partizionamento orizzontale

Nome Descrizione Valore
Conteggio frammenti Numero di partizioni di cui eseguire il provisioning nel cluster. Int

Proprietà di archiviazione

Nome Descrizione Valore
dimensioneGb Dimensioni del disco dati assegnato a ogni server. Int
digitare Tipo di archiviazione con cui eseguire il provisioning dei server cluster. 'SSD premium'
'PremiumSSDv2'

TrackedResourceTags

Nome Descrizione Valore

UserAssignedIdentities

Nome Descrizione Valore

Identità Assegnata dall'Utente

Nome Descrizione Valore

Esempi di utilizzo

Moduli verificati di Azure

Per distribuire questo tipo di risorsa, è possibile usare moduli verificati di Azure.

Modulo Descrizione
Cosmos DB per MongoDB (vCore) Modulo di risorse AVM per Cosmos DB per MongoDB (vCore)

Definizione di risorsa del modello di Resource Manager

Il tipo di risorsa mongoClusters può essere distribuito con operazioni destinate a:

  • gruppi di risorse - Vedere i comandi di distribuzione del gruppo di risorse

Per un elenco delle proprietà modificate in ogni versione dell'API, vedere log delle modifiche.

Formato risorsa

Per creare una risorsa Microsoft.DocumentDB/mongoClusters, aggiungere il codice JSON seguente al modello.

{
  "type": "Microsoft.DocumentDB/mongoClusters",
  "apiVersion": "2025-09-01",
  "name": "string",
  "identity": {
    "type": "string",
    "userAssignedIdentities": {
      "{customized property}": {
      }
    }
  },
  "location": "string",
  "properties": {
    "administrator": {
      "password": "string",
      "userName": "string"
    },
    "authConfig": {
      "allowedModes": [ "string" ]
    },
    "backup": {
    },
    "compute": {
      "tier": "string"
    },
    "createMode": "string",
    "dataApi": {
      "mode": "string"
    },
    "encryption": {
      "customerManagedKeyEncryption": {
        "keyEncryptionKeyIdentity": {
          "identityType": "string",
          "userAssignedIdentityResourceId": "string"
        },
        "keyEncryptionKeyUrl": "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",
      "type": "string"
    }
  },
  "tags": {
    "{customized property}": "string"
  }
}

Valori delle proprietà

Microsoft.DocumentDB/mongoClusters

Nome Descrizione Valore
versione dell'API Versione dell'API '2025-09-01'
identità Identità del servizio gestito assegnate a questa risorsa. ManagedServiceIdentity
ubicazione Posizione geografica in cui risiede la risorsa stringa (obbligatorio)
nome Nome della risorsa corda

Vincoli:
Lunghezza minima = 3
Lunghezza massima = 40
Pattern = ^[a-z0-9]+(-[a-z0-9]+)* (obbligatorio)
proprietà Proprietà specifiche della risorsa. Proprietà MongoCluster
Tag Tag delle risorse Dizionario di nomi e valori di tag. Vedere tag nei modelli
digitare Tipo di risorsa 'Microsoft.DocumentDB/mongoClusters'

Proprietà dell'amministratore

Nome Descrizione Valore
parola d’ordine Password amministratore. corda

Vincoli:
Valore sensibile. Passare come parametro sicuro.
nome utente Nome utente amministratore. corda

AuthConfigProperties

Nome Descrizione Valore
allowedModes Modalità di autenticazione consentite per l'accesso ai dati nel cluster. Matrice di stringhe contenente uno dei seguenti elementi:
'MicrosoftEntraID'
'NativeAuth'

BackupProprietà

Nome Descrizione Valore

Proprietà di calcolo

Nome Descrizione Valore
livello Livello di calcolo da assegnare al cluster, in cui ogni livello esegue il mapping a una dimensione di memoria e core virtuale. Valori di esempio: 'M30', 'M40'. corda

CustomerManagedKeyEncryptionProperties

Nome Descrizione Valore
keyEncryptionKeyIdentity L'identità utilizzata per accedere alla chiave di crittografia della chiave. KeyEncryptionKeyIdentity
keyEncryptionKeyUrl URI della chiave dell'insieme di credenziali delle chiavi usata per la crittografia. corda

DataApiProperties

Nome Descrizione Valore
modo Modalità per indicare se l'API Dati Mongo è abilitata per un cluster. 'Disabilitato'
'Abilitato'

EncryptionProperties

Nome Descrizione Valore
customerManagedKeyEncryption Impostazioni di crittografia delle chiavi gestite dal cliente. Proprietà CustomerManagedKeyEncryptionProperties

Proprietà HighAvailabilityProperties

Nome Descrizione Valore
targetMode Modalità di disponibilità elevata di destinazione richiesta per il cluster. 'Disabilitato'
'SameZone'
'Zona ridondantePreferito'

KeyEncryptionKeyIdentity

Nome Descrizione Valore
tipo di identità Tipo di identità. È supportato solo 'UserAssignedIdentity'. 'IdentitàAssegnataUtente'
userAssignedIdentityResourceId ID risorsa di identità assegnato dall'utente. corda

Identità dei Servizi Gestiti

Nome Descrizione Valore
digitare Tipo di identità del servizio gestito (in cui sono consentiti sia i tipi SystemAssigned che UserAssigned). 'None'
'SystemAssigned'
'SystemAssigned,UserAssigned'
'UserAssigned' (obbligatorio)
identità assegnate dall'utente Set di identità assegnate dall'utente associate alla risorsa. Le chiavi del dizionario userAssignedIdentities saranno ID risorsa ARM nel formato : '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}. I valori del dizionario possono essere oggetti vuoti ({}) nelle richieste. UserAssignedIdentities

Proprietà MongoCluster

Nome Descrizione Valore
amministratore Proprietà dell'amministratore locale per il cluster mongo. Proprietà dell'amministratore
authConfig Configurazione dell'autenticazione per il cluster. AuthConfigProperties
copia di sicurezza Proprietà di backup del cluster mongo. BackupProperties
calcolare Proprietà di calcolo del cluster mongo. ComputeProperties
createMode Modalità per creare un cluster mongo. Impostazione predefinita
'GeoReplica'
'PointInTimeRestore'
'Replica'
dataApi Proprietà dell'API dati del cluster mongo. DataApiProperties
Crittografia Configurazione della crittografia per il cluster. Dipende dall'identità configurata. Proprietà di crittografia
alta disponibilità Proprietà a disponibilità elevata del cluster mongo. HighAvailabilityProperties
anteprimaCaratteristiche Elenco delle connessioni endpoint private. Matrice di stringhe contenente uno dei seguenti elementi:
'Repliche geografiche'
pubblicoAccesso alla rete Indica se l'accesso all'endpoint pubblico è consentito per questo cluster mongo. 'Disabilitato'
'Abilitato'
replicaParameters Parametri per creare un cluster mongo di replica. Parametri MongoClusterReplicaReplica
restoreParameters Parametri per creare un cluster mongo di ripristino temporizzato. MongoClusterRestoreParameters
versioneDelServer Versione del server Mongo DB. L'impostazione predefinita è la versione disponibile più recente, se non specificata. corda
partizionamento orizzontale Proprietà di partizionamento orizzontale del cluster mongo. proprietà di partizionamento orizzontale
immagazzinamento Proprietà di archiviazione del cluster mongo. Proprietà di archiviazione

Parametri MongoClusterReplicaReplica

Nome Descrizione Valore
sourceLocation Percorso del cluster di origine stringa (obbligatorio)
sourceResourceId ID del cluster di origine della replica. stringa (obbligatorio)

MongoClusterRestoreParameters

Nome Descrizione Valore
pointInTimeUTC Ora UTC per ripristinare un cluster mongo corda
sourceResourceId ID risorsa per individuare il cluster di origine da ripristinare corda

Proprietà partizionamento orizzontale

Nome Descrizione Valore
Conteggio frammenti Numero di partizioni di cui eseguire il provisioning nel cluster. Int

Proprietà di archiviazione

Nome Descrizione Valore
dimensioneGb Dimensioni del disco dati assegnato a ogni server. Int
digitare Tipo di archiviazione con cui eseguire il provisioning dei server cluster. 'SSD premium'
'PremiumSSDv2'

TrackedResourceTags

Nome Descrizione Valore

UserAssignedIdentities

Nome Descrizione Valore

Identità Assegnata dall'Utente

Nome Descrizione Valore

Esempi di utilizzo

Definizione di risorsa Terraform (provider AzAPI)

Il tipo di risorsa mongoClusters può essere distribuito con operazioni destinate a:

  • Gruppi di risorse

Per un elenco delle proprietà modificate in ogni versione dell'API, vedere log delle modifiche.

Formato risorsa

Per creare una risorsa Microsoft.DocumentDB/mongoClusters, aggiungere il file Terraform seguente al modello.

resource "azapi_resource" "symbolicname" {
  type = "Microsoft.DocumentDB/mongoClusters@2025-09-01"
  name = "string"
  parent_id = "string"
  identity {
    type = "string"
    identity_ids = [
      "string"
    ]
  }
  location = "string"
  tags = {
    {customized property} = "string"
  }
  body = {
    properties = {
      administrator = {
        password = "string"
        userName = "string"
      }
      authConfig = {
        allowedModes = [
          "string"
        ]
      }
      backup = {
      }
      compute = {
        tier = "string"
      }
      createMode = "string"
      dataApi = {
        mode = "string"
      }
      encryption = {
        customerManagedKeyEncryption = {
          keyEncryptionKeyIdentity = {
            identityType = "string"
            userAssignedIdentityResourceId = "string"
          }
          keyEncryptionKeyUrl = "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
        type = "string"
      }
    }
  }
}

Valori delle proprietà

Microsoft.DocumentDB/mongoClusters

Nome Descrizione Valore
identità Identità del servizio gestito assegnate a questa risorsa. ManagedServiceIdentity
ubicazione Posizione geografica in cui risiede la risorsa stringa (obbligatorio)
nome Nome della risorsa corda

Vincoli:
Lunghezza minima = 3
Lunghezza massima = 40
Pattern = ^[a-z0-9]+(-[a-z0-9]+)* (obbligatorio)
proprietà Proprietà specifiche della risorsa. Proprietà MongoCluster
Tag Tag delle risorse Dizionario di nomi e valori di tag.
digitare Tipo di risorsa "Microsoft.DocumentDB/mongoClusters@2025-09-01"

Proprietà dell'amministratore

Nome Descrizione Valore
parola d’ordine Password amministratore. corda

Vincoli:
Valore sensibile. Passare come parametro sicuro.
nome utente Nome utente amministratore. corda

AuthConfigProperties

Nome Descrizione Valore
allowedModes Modalità di autenticazione consentite per l'accesso ai dati nel cluster. Matrice di stringhe contenente uno dei seguenti elementi:
'MicrosoftEntraID'
'NativeAuth'

BackupProprietà

Nome Descrizione Valore

Proprietà di calcolo

Nome Descrizione Valore
livello Livello di calcolo da assegnare al cluster, in cui ogni livello esegue il mapping a una dimensione di memoria e core virtuale. Valori di esempio: 'M30', 'M40'. corda

CustomerManagedKeyEncryptionProperties

Nome Descrizione Valore
keyEncryptionKeyIdentity L'identità utilizzata per accedere alla chiave di crittografia della chiave. KeyEncryptionKeyIdentity
keyEncryptionKeyUrl URI della chiave dell'insieme di credenziali delle chiavi usata per la crittografia. corda

DataApiProperties

Nome Descrizione Valore
modo Modalità per indicare se l'API Dati Mongo è abilitata per un cluster. 'Disabilitato'
'Abilitato'

EncryptionProperties

Nome Descrizione Valore
customerManagedKeyEncryption Impostazioni di crittografia delle chiavi gestite dal cliente. Proprietà CustomerManagedKeyEncryptionProperties

Proprietà HighAvailabilityProperties

Nome Descrizione Valore
targetMode Modalità di disponibilità elevata di destinazione richiesta per il cluster. 'Disabilitato'
'SameZone'
'Zona ridondantePreferito'

KeyEncryptionKeyIdentity

Nome Descrizione Valore
tipo di identità Tipo di identità. È supportato solo 'UserAssignedIdentity'. 'IdentitàAssegnataUtente'
userAssignedIdentityResourceId ID risorsa di identità assegnato dall'utente. corda

Identità dei Servizi Gestiti

Nome Descrizione Valore
digitare Tipo di identità del servizio gestito (in cui sono consentiti sia i tipi SystemAssigned che UserAssigned). 'None'
'SystemAssigned'
'SystemAssigned,UserAssigned'
'UserAssigned' (obbligatorio)
identità assegnate dall'utente Set di identità assegnate dall'utente associate alla risorsa. Le chiavi del dizionario userAssignedIdentities saranno ID risorsa ARM nel formato : '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}. I valori del dizionario possono essere oggetti vuoti ({}) nelle richieste. UserAssignedIdentities

Proprietà MongoCluster

Nome Descrizione Valore
amministratore Proprietà dell'amministratore locale per il cluster mongo. Proprietà dell'amministratore
authConfig Configurazione dell'autenticazione per il cluster. AuthConfigProperties
copia di sicurezza Proprietà di backup del cluster mongo. BackupProperties
calcolare Proprietà di calcolo del cluster mongo. ComputeProperties
createMode Modalità per creare un cluster mongo. Impostazione predefinita
'GeoReplica'
'PointInTimeRestore'
'Replica'
dataApi Proprietà dell'API dati del cluster mongo. DataApiProperties
Crittografia Configurazione della crittografia per il cluster. Dipende dall'identità configurata. Proprietà di crittografia
alta disponibilità Proprietà a disponibilità elevata del cluster mongo. HighAvailabilityProperties
anteprimaCaratteristiche Elenco delle connessioni endpoint private. Matrice di stringhe contenente uno dei seguenti elementi:
'Repliche geografiche'
pubblicoAccesso alla rete Indica se l'accesso all'endpoint pubblico è consentito per questo cluster mongo. 'Disabilitato'
'Abilitato'
replicaParameters Parametri per creare un cluster mongo di replica. Parametri MongoClusterReplicaReplica
restoreParameters Parametri per creare un cluster mongo di ripristino temporizzato. MongoClusterRestoreParameters
versioneDelServer Versione del server Mongo DB. L'impostazione predefinita è la versione disponibile più recente, se non specificata. corda
partizionamento orizzontale Proprietà di partizionamento orizzontale del cluster mongo. proprietà di partizionamento orizzontale
immagazzinamento Proprietà di archiviazione del cluster mongo. Proprietà di archiviazione

Parametri MongoClusterReplicaReplica

Nome Descrizione Valore
sourceLocation Percorso del cluster di origine stringa (obbligatorio)
sourceResourceId ID del cluster di origine della replica. stringa (obbligatorio)

MongoClusterRestoreParameters

Nome Descrizione Valore
pointInTimeUTC Ora UTC per ripristinare un cluster mongo corda
sourceResourceId ID risorsa per individuare il cluster di origine da ripristinare corda

Proprietà partizionamento orizzontale

Nome Descrizione Valore
Conteggio frammenti Numero di partizioni di cui eseguire il provisioning nel cluster. Int

Proprietà di archiviazione

Nome Descrizione Valore
dimensioneGb Dimensioni del disco dati assegnato a ogni server. Int
digitare Tipo di archiviazione con cui eseguire il provisioning dei server cluster. 'SSD premium'
'PremiumSSDv2'

TrackedResourceTags

Nome Descrizione Valore

UserAssignedIdentities

Nome Descrizione Valore

Identità Assegnata dall'Utente

Nome Descrizione Valore

Esempi di utilizzo

Esempi di Terraform

Un esempio base di distribuzione di Azure Cosmos DB per 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    = ["*"]
}