Partager via


Microsoft.DocumentDB mongoClusters

Définition de ressource Bicep

Le type de ressource mongoClusters peut être déployé avec des opérations qui ciblent :

Pour obtenir la liste des propriétés modifiées dans chaque version de l’API, consultez journal des modifications.

Format de ressource

Pour créer une ressource Microsoft.DocumentDB/mongoClusters, ajoutez le bicep suivant à votre modèle.

resource symbolicname 'Microsoft.DocumentDB/mongoClusters@2025-09-01' = {
  scope: resourceSymbolicName or scope
  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'
  }
}

Valeurs de propriété

Microsoft.DocumentDB/mongoClusters

Nom Descriptif Valeur
identité Identités de service managées affectées à cette ressource. ManagedServiceIdentity
emplacement Emplacement géographique où réside la ressource chaîne (obligatoire)
nom Nom de la ressource corde

Contraintes:
Longueur minimale = 3
Longueur maximale = 40
Modèle = ^[a-z0-9]+(-[a-z0-9]+)* (obligatoire)
Propriétés Propriétés spécifiques à la ressource pour cette ressource. MongoClusterProperties
portée Utilisez-la lors de la création d’une ressource dans une étendue différente de l’étendue de déploiement. Définissez cette propriété sur le nom symbolique d’une ressource pour appliquer la ressource d’extension .
étiquettes Balises de ressource Dictionnaire de noms et de valeurs d’étiquettes. Consultez les balises dans les modèles

AdministratorProperties

Nom Descriptif Valeur
mot de passe Mot de passe administrateur. corde

Contraintes:
Valeur sensible. Passez en tant que paramètre sécurisé.
nom d’utilisateur Nom d’utilisateur administrateur. corde

AuthConfigProperties

Nom Descriptif Valeur
allowedModes Modes d’authentification autorisés pour l’accès aux données sur le cluster. Tableau de chaînes contenant l’un des éléments suivants :
« MicrosoftEntraID »
'NativeAuth'

BackupProperties

Nom Descriptif Valeur

ComputeProperties

Nom Descriptif Valeur
niveau Niveau de calcul à affecter au cluster, où chaque niveau est mappé à une taille de cœur virtuel et de mémoire. Exemples de valeurs : « M30 », « M40 ». corde

CustomerManagedKeyEncryptionProperties

Nom Descriptif Valeur
keyEncryptionKeyIdentity Identité utilisée pour accéder à la clé de chiffrement. KeyEncryptionKeyIdentity
keyEncryptionKeyUrl URI de la clé du coffre de clés utilisée pour le chiffrement. corde

DataApiProperties

Nom Descriptif Valeur
mode Mode pour indiquer si l’API Mongo Data est activée pour un cluster. 'Désactivé'
'Activé'

Propriétés de chiffrement

Nom Descriptif Valeur
customerManagedKeyEncryption Paramètres de chiffrement de clé gérée par le client. CustomerManagedKeyEncryptionProperties

HighAvailabilityProperties

Nom Descriptif Valeur
targetMode Mode de haute disponibilité cible demandé pour le cluster. 'Désactivé'
'SameZone'
'ZoneRedundantPreferred'

KeyEncryptionKeyIdentity

Nom Descriptif Valeur
type d'identité Type d’identité. Seul 'UserAssignedIdentity' est pris en charge. 'UserAssignedIdentity'
userAssignedIdentityResourceId ID de ressource d’identité attribué par l’utilisateur. corde

Identité de Service Gérée (ManagedServiceIdentity)

Nom Descriptif Valeur
type Type d’identité de service managé (où les types SystemAssigned et UserAssigned sont autorisés). 'None'
'SystemAssigned'
'SystemAssigned,UserAssigned'
'UserAssigned' (obligatoire)
Identités attribuées par l'utilisateur Ensemble d’identités affectées par l’utilisateur associées à la ressource. Les clés de dictionnaire userAssignedIdentities seront des ID de ressource ARM sous la forme : « /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}. Les valeurs de dictionnaire peuvent être des objets vides ({}) dans les requêtes. UserAssignedIdentities

MongoClusterProperties

Nom Descriptif Valeur
administrateur Propriétés de l’administrateur local pour le cluster mongo. AdministratorProperties
authConfig Configuration de l’authentification pour le cluster. AuthConfigProperties
sauvegarde Propriétés de sauvegarde du cluster mongo. BackupProperties
calculer Propriétés de calcul du cluster mongo. ComputeProperties
createMode Mode de création d’un cluster mongo. Valeur par défaut
'GeoReplica'
'PointInTimeRestore'
'Réplique'
dataApi Propriétés de l’API de données du cluster mongo. DataApiProperties
chiffrement Configuration du chiffrement pour le cluster. Dépend de l’identité configurée. EncryptionProperties
highAvailability Propriétés de haute disponibilité du cluster mongo. HighAvailabilityProperties
aperçuFonctionnalités Liste des connexions de point de terminaison privé. Tableau de chaînes contenant l’un des éléments suivants :
'GeoReplicas'
publicNetworkAccess Indique si l’accès au point de terminaison public est autorisé pour ce cluster mongo. 'Désactivé'
'Activé'
replicaParameters Paramètres permettant de créer un cluster mongo de réplica. MongoClusterReplicaParameters
restoreParameters Paramètres permettant de créer un cluster mongo de restauration à un point dans le temps. MongoClusterRestoreParameters
version serveur Version du serveur Mongo DB. La valeur par défaut est la dernière version disponible si elle n’est pas spécifiée. corde
partitionnement Propriétés de partitionnement du cluster mongo. ShardingProperties
stockage Propriétés de stockage du cluster mongo. StorageProperties

MongoClusterReplicaParameters

Nom Descriptif Valeur
sourceLocation Emplacement du cluster source chaîne (obligatoire)
sourceResourceId ID du cluster source de réplication. chaîne (obligatoire)

MongoClusterRestoreParameters

Nom Descriptif Valeur
pointInTimeUTC Point UTC dans le temps pour restaurer un cluster mongo corde
sourceResourceId ID de ressource pour localiser le cluster source à restaurer corde

ShardingProperties

Nom Descriptif Valeur
shardCount Nombre de partitions à provisionner sur le cluster. Int

StorageProperties

Nom Descriptif Valeur
tailleGb Taille du disque de données affecté à chaque serveur. Int
type Type de stockage avec lequel provisionner les serveurs de cluster. « SSD premium »
'PremiumSSDv2'

TrackedResourceTags

Nom Descriptif Valeur

UserAssignedIdentities

Nom Descriptif Valeur

userAssignedIdentity

Nom Descriptif Valeur

Exemples d’utilisation

Modules vérifiés Azure

Les modules vérifiés Azure suivants peuvent être utilisés pour déployer ce type de ressource.

Module Descriptif
Cosmos DB pour MongoDB (vCore) Module de ressource AVM pour Cosmos DB pour MongoDB (vCore)

Définition de ressource de modèle ARM

Le type de ressource mongoClusters peut être déployé avec des opérations qui ciblent :

Pour obtenir la liste des propriétés modifiées dans chaque version de l’API, consultez journal des modifications.

Format de ressource

Pour créer une ressource Microsoft.DocumentDB/mongoClusters, ajoutez le code JSON suivant à votre modèle.

{
  "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"
  }
}

Valeurs de propriété

Microsoft.DocumentDB/mongoClusters

Nom Descriptif Valeur
apiVersion Version de l’API '2025-09-01'
identité Identités de service managées affectées à cette ressource. ManagedServiceIdentity
emplacement Emplacement géographique où réside la ressource chaîne (obligatoire)
nom Nom de la ressource corde

Contraintes:
Longueur minimale = 3
Longueur maximale = 40
Modèle = ^[a-z0-9]+(-[a-z0-9]+)* (obligatoire)
Propriétés Propriétés spécifiques à la ressource pour cette ressource. MongoClusterProperties
étiquettes Balises de ressource Dictionnaire de noms et de valeurs d’étiquettes. Consultez les balises dans les modèles
type Type de ressource 'Microsoft.DocumentDB/mongoClusters'

AdministratorProperties

Nom Descriptif Valeur
mot de passe Mot de passe administrateur. corde

Contraintes:
Valeur sensible. Passez en tant que paramètre sécurisé.
nom d’utilisateur Nom d’utilisateur administrateur. corde

AuthConfigProperties

Nom Descriptif Valeur
allowedModes Modes d’authentification autorisés pour l’accès aux données sur le cluster. Tableau de chaînes contenant l’un des éléments suivants :
« MicrosoftEntraID »
'NativeAuth'

BackupProperties

Nom Descriptif Valeur

ComputeProperties

Nom Descriptif Valeur
niveau Niveau de calcul à affecter au cluster, où chaque niveau est mappé à une taille de cœur virtuel et de mémoire. Exemples de valeurs : « M30 », « M40 ». corde

CustomerManagedKeyEncryptionProperties

Nom Descriptif Valeur
keyEncryptionKeyIdentity Identité utilisée pour accéder à la clé de chiffrement. KeyEncryptionKeyIdentity
keyEncryptionKeyUrl URI de la clé du coffre de clés utilisée pour le chiffrement. corde

DataApiProperties

Nom Descriptif Valeur
mode Mode pour indiquer si l’API Mongo Data est activée pour un cluster. 'Désactivé'
'Activé'

Propriétés de chiffrement

Nom Descriptif Valeur
customerManagedKeyEncryption Paramètres de chiffrement de clé gérée par le client. CustomerManagedKeyEncryptionProperties

HighAvailabilityProperties

Nom Descriptif Valeur
targetMode Mode de haute disponibilité cible demandé pour le cluster. 'Désactivé'
'SameZone'
'ZoneRedundantPreferred'

KeyEncryptionKeyIdentity

Nom Descriptif Valeur
type d'identité Type d’identité. Seul 'UserAssignedIdentity' est pris en charge. 'UserAssignedIdentity'
userAssignedIdentityResourceId ID de ressource d’identité attribué par l’utilisateur. corde

Identité de Service Gérée (ManagedServiceIdentity)

Nom Descriptif Valeur
type Type d’identité de service managé (où les types SystemAssigned et UserAssigned sont autorisés). 'None'
'SystemAssigned'
'SystemAssigned,UserAssigned'
'UserAssigned' (obligatoire)
Identités attribuées par l'utilisateur Ensemble d’identités affectées par l’utilisateur associées à la ressource. Les clés de dictionnaire userAssignedIdentities seront des ID de ressource ARM sous la forme : « /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}. Les valeurs de dictionnaire peuvent être des objets vides ({}) dans les requêtes. UserAssignedIdentities

MongoClusterProperties

Nom Descriptif Valeur
administrateur Propriétés de l’administrateur local pour le cluster mongo. AdministratorProperties
authConfig Configuration de l’authentification pour le cluster. AuthConfigProperties
sauvegarde Propriétés de sauvegarde du cluster mongo. BackupProperties
calculer Propriétés de calcul du cluster mongo. ComputeProperties
createMode Mode de création d’un cluster mongo. Valeur par défaut
'GeoReplica'
'PointInTimeRestore'
'Réplique'
dataApi Propriétés de l’API de données du cluster mongo. DataApiProperties
chiffrement Configuration du chiffrement pour le cluster. Dépend de l’identité configurée. EncryptionProperties
highAvailability Propriétés de haute disponibilité du cluster mongo. HighAvailabilityProperties
aperçuFonctionnalités Liste des connexions de point de terminaison privé. Tableau de chaînes contenant l’un des éléments suivants :
'GeoReplicas'
publicNetworkAccess Indique si l’accès au point de terminaison public est autorisé pour ce cluster mongo. 'Désactivé'
'Activé'
replicaParameters Paramètres permettant de créer un cluster mongo de réplica. MongoClusterReplicaParameters
restoreParameters Paramètres permettant de créer un cluster mongo de restauration à un point dans le temps. MongoClusterRestoreParameters
version serveur Version du serveur Mongo DB. La valeur par défaut est la dernière version disponible si elle n’est pas spécifiée. corde
partitionnement Propriétés de partitionnement du cluster mongo. ShardingProperties
stockage Propriétés de stockage du cluster mongo. StorageProperties

MongoClusterReplicaParameters

Nom Descriptif Valeur
sourceLocation Emplacement du cluster source chaîne (obligatoire)
sourceResourceId ID du cluster source de réplication. chaîne (obligatoire)

MongoClusterRestoreParameters

Nom Descriptif Valeur
pointInTimeUTC Point UTC dans le temps pour restaurer un cluster mongo corde
sourceResourceId ID de ressource pour localiser le cluster source à restaurer corde

ShardingProperties

Nom Descriptif Valeur
shardCount Nombre de partitions à provisionner sur le cluster. Int

StorageProperties

Nom Descriptif Valeur
tailleGb Taille du disque de données affecté à chaque serveur. Int
type Type de stockage avec lequel provisionner les serveurs de cluster. « SSD premium »
'PremiumSSDv2'

TrackedResourceTags

Nom Descriptif Valeur

UserAssignedIdentities

Nom Descriptif Valeur

userAssignedIdentity

Nom Descriptif Valeur

Exemples d’utilisation

Définition de ressource Terraform (fournisseur AzAPI)

Le type de ressource mongoClusters peut être déployé avec des opérations qui ciblent :

Pour obtenir la liste des propriétés modifiées dans chaque version de l’API, consultez journal des modifications.

Format de ressource

Pour créer une ressource Microsoft.DocumentDB/mongoClusters, ajoutez le terraform suivant à votre modèle.

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"
      }
    }
  }
}

Valeurs de propriété

Microsoft.DocumentDB/mongoClusters

Nom Descriptif Valeur
identité Identités de service managées affectées à cette ressource. ManagedServiceIdentity
emplacement Emplacement géographique où réside la ressource chaîne (obligatoire)
nom Nom de la ressource corde

Contraintes:
Longueur minimale = 3
Longueur maximale = 40
Modèle = ^[a-z0-9]+(-[a-z0-9]+)* (obligatoire)
parent_id ID de la ressource à laquelle appliquer cette ressource d’extension. chaîne (obligatoire)
Propriétés Propriétés spécifiques à la ressource pour cette ressource. MongoClusterProperties
étiquettes Balises de ressource Dictionnaire de noms et de valeurs d’étiquettes.
type Type de ressource « Microsoft.DocumentDB/mongoClusters@2025-09-01 »

AdministratorProperties

Nom Descriptif Valeur
mot de passe Mot de passe administrateur. corde

Contraintes:
Valeur sensible. Passez en tant que paramètre sécurisé.
nom d’utilisateur Nom d’utilisateur administrateur. corde

AuthConfigProperties

Nom Descriptif Valeur
allowedModes Modes d’authentification autorisés pour l’accès aux données sur le cluster. Tableau de chaînes contenant l’un des éléments suivants :
« MicrosoftEntraID »
'NativeAuth'

BackupProperties

Nom Descriptif Valeur

ComputeProperties

Nom Descriptif Valeur
niveau Niveau de calcul à affecter au cluster, où chaque niveau est mappé à une taille de cœur virtuel et de mémoire. Exemples de valeurs : « M30 », « M40 ». corde

CustomerManagedKeyEncryptionProperties

Nom Descriptif Valeur
keyEncryptionKeyIdentity Identité utilisée pour accéder à la clé de chiffrement. KeyEncryptionKeyIdentity
keyEncryptionKeyUrl URI de la clé du coffre de clés utilisée pour le chiffrement. corde

DataApiProperties

Nom Descriptif Valeur
mode Mode pour indiquer si l’API Mongo Data est activée pour un cluster. 'Désactivé'
'Activé'

Propriétés de chiffrement

Nom Descriptif Valeur
customerManagedKeyEncryption Paramètres de chiffrement de clé gérée par le client. CustomerManagedKeyEncryptionProperties

HighAvailabilityProperties

Nom Descriptif Valeur
targetMode Mode de haute disponibilité cible demandé pour le cluster. 'Désactivé'
'SameZone'
'ZoneRedundantPreferred'

KeyEncryptionKeyIdentity

Nom Descriptif Valeur
type d'identité Type d’identité. Seul 'UserAssignedIdentity' est pris en charge. 'UserAssignedIdentity'
userAssignedIdentityResourceId ID de ressource d’identité attribué par l’utilisateur. corde

Identité de Service Gérée (ManagedServiceIdentity)

Nom Descriptif Valeur
type Type d’identité de service managé (où les types SystemAssigned et UserAssigned sont autorisés). 'None'
'SystemAssigned'
'SystemAssigned,UserAssigned'
'UserAssigned' (obligatoire)
Identités attribuées par l'utilisateur Ensemble d’identités affectées par l’utilisateur associées à la ressource. Les clés de dictionnaire userAssignedIdentities seront des ID de ressource ARM sous la forme : « /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}. Les valeurs de dictionnaire peuvent être des objets vides ({}) dans les requêtes. UserAssignedIdentities

MongoClusterProperties

Nom Descriptif Valeur
administrateur Propriétés de l’administrateur local pour le cluster mongo. AdministratorProperties
authConfig Configuration de l’authentification pour le cluster. AuthConfigProperties
sauvegarde Propriétés de sauvegarde du cluster mongo. BackupProperties
calculer Propriétés de calcul du cluster mongo. ComputeProperties
createMode Mode de création d’un cluster mongo. Valeur par défaut
'GeoReplica'
'PointInTimeRestore'
'Réplique'
dataApi Propriétés de l’API de données du cluster mongo. DataApiProperties
chiffrement Configuration du chiffrement pour le cluster. Dépend de l’identité configurée. EncryptionProperties
highAvailability Propriétés de haute disponibilité du cluster mongo. HighAvailabilityProperties
aperçuFonctionnalités Liste des connexions de point de terminaison privé. Tableau de chaînes contenant l’un des éléments suivants :
'GeoReplicas'
publicNetworkAccess Indique si l’accès au point de terminaison public est autorisé pour ce cluster mongo. 'Désactivé'
'Activé'
replicaParameters Paramètres permettant de créer un cluster mongo de réplica. MongoClusterReplicaParameters
restoreParameters Paramètres permettant de créer un cluster mongo de restauration à un point dans le temps. MongoClusterRestoreParameters
version serveur Version du serveur Mongo DB. La valeur par défaut est la dernière version disponible si elle n’est pas spécifiée. corde
partitionnement Propriétés de partitionnement du cluster mongo. ShardingProperties
stockage Propriétés de stockage du cluster mongo. StorageProperties

MongoClusterReplicaParameters

Nom Descriptif Valeur
sourceLocation Emplacement du cluster source chaîne (obligatoire)
sourceResourceId ID du cluster source de réplication. chaîne (obligatoire)

MongoClusterRestoreParameters

Nom Descriptif Valeur
pointInTimeUTC Point UTC dans le temps pour restaurer un cluster mongo corde
sourceResourceId ID de ressource pour localiser le cluster source à restaurer corde

ShardingProperties

Nom Descriptif Valeur
shardCount Nombre de partitions à provisionner sur le cluster. Int

StorageProperties

Nom Descriptif Valeur
tailleGb Taille du disque de données affecté à chaque serveur. Int
type Type de stockage avec lequel provisionner les serveurs de cluster. « SSD premium »
'PremiumSSDv2'

TrackedResourceTags

Nom Descriptif Valeur

UserAssignedIdentities

Nom Descriptif Valeur

userAssignedIdentity

Nom Descriptif Valeur

Exemples d’utilisation

Échantillons Terraform

Un exemple de base de déploiement d’Azure Cosmos DB pour 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    = ["*"]
}