Compartir a través de


MongoClusters de Microsoft.DocumentDB

Definición de recursos de Bicep

El tipo de recurso mongoClusters se puede implementar con operaciones destinadas a:

Para obtener una lista de las propiedades modificadas en cada versión de API, consulte registro de cambios.

Formato de recurso

Para crear un recurso Microsoft.DocumentDB/mongoClusters, agregue el siguiente bicep a la plantilla.

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

Valores de propiedad

Microsoft.DocumentDB/mongoClusters

Nombre Descripción Valor
identidad Identidades de servicio administradas asignadas a este recurso. managedServiceIdentity
ubicación Ubicación geográfica donde reside el recurso string (obligatorio)
nombre El nombre del recurso cuerda

Restricciones:
Longitud mínima = 3
Longitud máxima = 40
Patrón = ^[a-z0-9]+(-[a-z0-9]+)* (obligatorio)
Propiedades Propiedades específicas del recurso para este recurso. MongoClusterProperties
scope Use al crear un recurso en un ámbito diferente del ámbito de implementación. Establezca esta propiedad en el nombre simbólico de un recurso para aplicar el recurso de extensión .
Etiquetas Etiquetas de recursos Diccionario de nombres y valores de etiqueta. Consulte etiquetas de en plantillas

AdministratorProperties (Propiedades del administrador)

Nombre Descripción Valor
contraseña Contraseña de administrador. cuerda

Restricciones:
Valor confidencial. Pase como parámetro seguro.
nombre de usuario Nombre de usuario del administrador. cuerda

AuthConfigProperties

Nombre Descripción Valor
allowedModes Modos de autenticación permitidos para el acceso a datos en el clúster. Matriz de cadenas que contiene cualquiera de:
'MicrosoftEntraID'
'Autün nativo'

BackupProperties (Propiedades de respaldo)

Nombre Descripción Valor

ComputeProperties

Nombre Descripción Valor
nivel Nivel de proceso que se va a asignar al clúster, donde cada nivel se asigna a un tamaño de núcleo virtual y memoria. Valores de ejemplo: "M30", "M40". cuerda

CustomerManagedKeyEncryptionProperties

Nombre Descripción Valor
keyEncryptionKeyIdentity La identidad utilizada para acceder a la clave de cifrado de claves. KeyEncryptionKeyIdentity
keyEncryptionKeyUrl URI de la clave del almacén de claves que se usa para el cifrado. cuerda

DataApiProperties

Nombre Descripción Valor
modo Modo que indica si la API de datos de Mongo está habilitada para un clúster. 'Deshabilitado'
'Habilitado'

Propiedades de Encriptación

Nombre Descripción Valor
customerManagedKeyEncryption Configuración de cifrado de claves administradas por el cliente. CustomerManagedKeyEncryptionProperties

HighAvailabilityProperties

Nombre Descripción Valor
targetMode Modo de alta disponibilidad de destino solicitado para el clúster. 'Deshabilitado'
'Misma zona'
'ZoneRedundantPreferred'

KeyEncryptionKeyIdentity

Nombre Descripción Valor
tipo de identidad Tipo de identidad. Solo se admite 'UserAssignedIdentity'. 'IdentidadAsignada por el usuario'
userAssignedIdentityResourceId El identificador de recurso de identidad asignado por el usuario. cuerda

Identidad de Servicio Gestionado

Nombre Descripción Valor
tipo Tipo de identidad de servicio administrada (donde se permiten los tipos SystemAssigned y UserAssigned). 'None'
'SystemAssigned'
'SystemAssigned,UserAssigned'
'UserAssigned' (obligatorio)
identidades asignadas por el usuario Conjunto de identidades asignadas por el usuario asociadas al recurso. Las claves de diccionario userAssignedIdentities serán identificadores de recursos de ARM con el formato: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}. Los valores del diccionario pueden ser objetos vacíos ({}) en las solicitudes. UserAssignedIdentities

MongoClusterProperties

Nombre Descripción Valor
administrador Propiedades de administrador local para el clúster de mongo. AdministratorProperties
authConfig La configuración de autenticación para el clúster. AuthConfigProperties
copia de seguridad Propiedades de copia de seguridad del clúster de mongo. BackupProperties (Propiedades de respaldo)
calcular Propiedades de proceso del clúster de mongo. ComputeProperties de
createMode Modo para crear un clúster de Mongo. 'Valor predeterminado'
'Réplica geográfica'
'PointInTimeRestore'
'Réplica'
dataApi Las propiedades de Data API del clúster de mongo. DataApiProperties
El cifrado La configuración de cifrado del clúster. Depende de la identidad que se esté configurando. EncryptionProperties
alta disponibilidad Propiedades de alta disponibilidad del clúster de mongo. HighAvailabilityProperties
previewFeatures Lista de conexiones de punto de conexión privado. Matriz de cadenas que contiene cualquiera de:
'Réplicas geográficas'
publicNetworkAccess Indica si se permite o no el acceso al punto de conexión público para este clúster de Mongo. 'Deshabilitado'
'Habilitado'
replicaParameters Parámetros para crear un clúster de mongo de réplica. MongoClusterReplicaParameters
restoreParameters Los parámetros para crear un clúster de mongo de restauración a un momento dado. MongoClusterRestoreParameters
Versión del servidor Versión del servidor de Mongo DB. El valor predeterminado es la versión más reciente disponible si no se especifica. cuerda
particionamiento Propiedades de particionamiento del clúster de mongo. ShardingProperties
almacenamiento Propiedades de almacenamiento del clúster de mongo. StorageProperties (Propiedades de almacenamiento)

MongoClusterReplicaParameters

Nombre Descripción Valor
ubicaciónFuente Ubicación del clúster de origen string (obligatorio)
sourceResourceId Identificador del clúster de origen de replicación. string (obligatorio)

MongoClusterRestoreParameters

Nombre Descripción Valor
pointInTimeUTC Hora UTC a la que se va a restaurar un clúster de Mongo cuerda
sourceResourceId Identificador de recurso para buscar el clúster de origen que se va a restaurar cuerda

ShardingProperties

Nombre Descripción Valor
shardCount Número de particiones que se van a aprovisionar en el clúster. Int

StorageProperties (Propiedades de almacenamiento)

Nombre Descripción Valor
tamañoGb Tamaño del disco de datos asignado a cada servidor. Int
tipo El tipo de almacenamiento con el que se van a aprovisionar los servidores de clúster. 'SSD premium'
'PremiumSSDv2'

TrackedResourceTags

Nombre Descripción Valor

UserAssignedIdentities

Nombre Descripción Valor

IdentidadAsignadaPorElUsuario

Nombre Descripción Valor

Ejemplos de uso

Módulos comprobados de Azure

Los siguientes módulos comprobados de Azure se pueden usar para implementar este tipo de recurso.

Módulo Descripción
cosmos DB para MongoDB (núcleo virtual) Módulo de recursos de AVM para Cosmos DB para MongoDB (núcleo virtual)

Definición de recursos de plantilla de ARM

El tipo de recurso mongoClusters se puede implementar con operaciones destinadas a:

Para obtener una lista de las propiedades modificadas en cada versión de API, consulte registro de cambios.

Formato de recurso

Para crear un recurso Microsoft.DocumentDB/mongoClusters, agregue el siguiente JSON a la plantilla.

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

Valores de propiedad

Microsoft.DocumentDB/mongoClusters

Nombre Descripción Valor
apiVersion La versión de api '2025-09-01'
identidad Identidades de servicio administradas asignadas a este recurso. managedServiceIdentity
ubicación Ubicación geográfica donde reside el recurso string (obligatorio)
nombre El nombre del recurso cuerda

Restricciones:
Longitud mínima = 3
Longitud máxima = 40
Patrón = ^[a-z0-9]+(-[a-z0-9]+)* (obligatorio)
Propiedades Propiedades específicas del recurso para este recurso. MongoClusterProperties
Etiquetas Etiquetas de recursos Diccionario de nombres y valores de etiqueta. Consulte etiquetas de en plantillas
tipo El tipo de recurso 'Microsoft.DocumentDB/mongoClusters'

AdministratorProperties (Propiedades del administrador)

Nombre Descripción Valor
contraseña Contraseña de administrador. cuerda

Restricciones:
Valor confidencial. Pase como parámetro seguro.
nombre de usuario Nombre de usuario del administrador. cuerda

AuthConfigProperties

Nombre Descripción Valor
allowedModes Modos de autenticación permitidos para el acceso a datos en el clúster. Matriz de cadenas que contiene cualquiera de:
'MicrosoftEntraID'
'Autün nativo'

BackupProperties (Propiedades de respaldo)

Nombre Descripción Valor

ComputeProperties

Nombre Descripción Valor
nivel Nivel de proceso que se va a asignar al clúster, donde cada nivel se asigna a un tamaño de núcleo virtual y memoria. Valores de ejemplo: "M30", "M40". cuerda

CustomerManagedKeyEncryptionProperties

Nombre Descripción Valor
keyEncryptionKeyIdentity La identidad utilizada para acceder a la clave de cifrado de claves. KeyEncryptionKeyIdentity
keyEncryptionKeyUrl URI de la clave del almacén de claves que se usa para el cifrado. cuerda

DataApiProperties

Nombre Descripción Valor
modo Modo que indica si la API de datos de Mongo está habilitada para un clúster. 'Deshabilitado'
'Habilitado'

Propiedades de Encriptación

Nombre Descripción Valor
customerManagedKeyEncryption Configuración de cifrado de claves administradas por el cliente. CustomerManagedKeyEncryptionProperties

HighAvailabilityProperties

Nombre Descripción Valor
targetMode Modo de alta disponibilidad de destino solicitado para el clúster. 'Deshabilitado'
'Misma zona'
'ZoneRedundantPreferred'

KeyEncryptionKeyIdentity

Nombre Descripción Valor
tipo de identidad Tipo de identidad. Solo se admite 'UserAssignedIdentity'. 'IdentidadAsignada por el usuario'
userAssignedIdentityResourceId El identificador de recurso de identidad asignado por el usuario. cuerda

Identidad de Servicio Gestionado

Nombre Descripción Valor
tipo Tipo de identidad de servicio administrada (donde se permiten los tipos SystemAssigned y UserAssigned). 'None'
'SystemAssigned'
'SystemAssigned,UserAssigned'
'UserAssigned' (obligatorio)
identidades asignadas por el usuario Conjunto de identidades asignadas por el usuario asociadas al recurso. Las claves de diccionario userAssignedIdentities serán identificadores de recursos de ARM con el formato: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}. Los valores del diccionario pueden ser objetos vacíos ({}) en las solicitudes. UserAssignedIdentities

MongoClusterProperties

Nombre Descripción Valor
administrador Propiedades de administrador local para el clúster de mongo. AdministratorProperties
authConfig La configuración de autenticación para el clúster. AuthConfigProperties
copia de seguridad Propiedades de copia de seguridad del clúster de mongo. BackupProperties (Propiedades de respaldo)
calcular Propiedades de proceso del clúster de mongo. ComputeProperties de
createMode Modo para crear un clúster de Mongo. 'Valor predeterminado'
'Réplica geográfica'
'PointInTimeRestore'
'Réplica'
dataApi Las propiedades de Data API del clúster de mongo. DataApiProperties
El cifrado La configuración de cifrado del clúster. Depende de la identidad que se esté configurando. EncryptionProperties
alta disponibilidad Propiedades de alta disponibilidad del clúster de mongo. HighAvailabilityProperties
previewFeatures Lista de conexiones de punto de conexión privado. Matriz de cadenas que contiene cualquiera de:
'Réplicas geográficas'
publicNetworkAccess Indica si se permite o no el acceso al punto de conexión público para este clúster de Mongo. 'Deshabilitado'
'Habilitado'
replicaParameters Parámetros para crear un clúster de mongo de réplica. MongoClusterReplicaParameters
restoreParameters Los parámetros para crear un clúster de mongo de restauración a un momento dado. MongoClusterRestoreParameters
Versión del servidor Versión del servidor de Mongo DB. El valor predeterminado es la versión más reciente disponible si no se especifica. cuerda
particionamiento Propiedades de particionamiento del clúster de mongo. ShardingProperties
almacenamiento Propiedades de almacenamiento del clúster de mongo. StorageProperties (Propiedades de almacenamiento)

MongoClusterReplicaParameters

Nombre Descripción Valor
ubicaciónFuente Ubicación del clúster de origen string (obligatorio)
sourceResourceId Identificador del clúster de origen de replicación. string (obligatorio)

MongoClusterRestoreParameters

Nombre Descripción Valor
pointInTimeUTC Hora UTC a la que se va a restaurar un clúster de Mongo cuerda
sourceResourceId Identificador de recurso para buscar el clúster de origen que se va a restaurar cuerda

ShardingProperties

Nombre Descripción Valor
shardCount Número de particiones que se van a aprovisionar en el clúster. Int

StorageProperties (Propiedades de almacenamiento)

Nombre Descripción Valor
tamañoGb Tamaño del disco de datos asignado a cada servidor. Int
tipo El tipo de almacenamiento con el que se van a aprovisionar los servidores de clúster. 'SSD premium'
'PremiumSSDv2'

TrackedResourceTags

Nombre Descripción Valor

UserAssignedIdentities

Nombre Descripción Valor

IdentidadAsignadaPorElUsuario

Nombre Descripción Valor

Ejemplos de uso

Definición de recursos de Terraform (proveedor AzAPI)

El tipo de recurso mongoClusters se puede implementar con operaciones destinadas a:

Para obtener una lista de las propiedades modificadas en cada versión de API, consulte registro de cambios.

Formato de recurso

Para crear un recurso Microsoft.DocumentDB/mongoClusters, agregue el siguiente Terraform a la plantilla.

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

Valores de propiedad

Microsoft.DocumentDB/mongoClusters

Nombre Descripción Valor
identidad Identidades de servicio administradas asignadas a este recurso. managedServiceIdentity
ubicación Ubicación geográfica donde reside el recurso string (obligatorio)
nombre El nombre del recurso cuerda

Restricciones:
Longitud mínima = 3
Longitud máxima = 40
Patrón = ^[a-z0-9]+(-[a-z0-9]+)* (obligatorio)
parent_id Identificador del recurso al que se va a aplicar este recurso de extensión. string (obligatorio)
Propiedades Propiedades específicas del recurso para este recurso. MongoClusterProperties
Etiquetas Etiquetas de recursos Diccionario de nombres y valores de etiqueta.
tipo El tipo de recurso "Microsoft.DocumentDB/mongoClusters@2025-09-01"

AdministratorProperties (Propiedades del administrador)

Nombre Descripción Valor
contraseña Contraseña de administrador. cuerda

Restricciones:
Valor confidencial. Pase como parámetro seguro.
nombre de usuario Nombre de usuario del administrador. cuerda

AuthConfigProperties

Nombre Descripción Valor
allowedModes Modos de autenticación permitidos para el acceso a datos en el clúster. Matriz de cadenas que contiene cualquiera de:
'MicrosoftEntraID'
'Autün nativo'

BackupProperties (Propiedades de respaldo)

Nombre Descripción Valor

ComputeProperties

Nombre Descripción Valor
nivel Nivel de proceso que se va a asignar al clúster, donde cada nivel se asigna a un tamaño de núcleo virtual y memoria. Valores de ejemplo: "M30", "M40". cuerda

CustomerManagedKeyEncryptionProperties

Nombre Descripción Valor
keyEncryptionKeyIdentity La identidad utilizada para acceder a la clave de cifrado de claves. KeyEncryptionKeyIdentity
keyEncryptionKeyUrl URI de la clave del almacén de claves que se usa para el cifrado. cuerda

DataApiProperties

Nombre Descripción Valor
modo Modo que indica si la API de datos de Mongo está habilitada para un clúster. 'Deshabilitado'
'Habilitado'

Propiedades de Encriptación

Nombre Descripción Valor
customerManagedKeyEncryption Configuración de cifrado de claves administradas por el cliente. CustomerManagedKeyEncryptionProperties

HighAvailabilityProperties

Nombre Descripción Valor
targetMode Modo de alta disponibilidad de destino solicitado para el clúster. 'Deshabilitado'
'Misma zona'
'ZoneRedundantPreferred'

KeyEncryptionKeyIdentity

Nombre Descripción Valor
tipo de identidad Tipo de identidad. Solo se admite 'UserAssignedIdentity'. 'IdentidadAsignada por el usuario'
userAssignedIdentityResourceId El identificador de recurso de identidad asignado por el usuario. cuerda

Identidad de Servicio Gestionado

Nombre Descripción Valor
tipo Tipo de identidad de servicio administrada (donde se permiten los tipos SystemAssigned y UserAssigned). 'None'
'SystemAssigned'
'SystemAssigned,UserAssigned'
'UserAssigned' (obligatorio)
identidades asignadas por el usuario Conjunto de identidades asignadas por el usuario asociadas al recurso. Las claves de diccionario userAssignedIdentities serán identificadores de recursos de ARM con el formato: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}. Los valores del diccionario pueden ser objetos vacíos ({}) en las solicitudes. UserAssignedIdentities

MongoClusterProperties

Nombre Descripción Valor
administrador Propiedades de administrador local para el clúster de mongo. AdministratorProperties
authConfig La configuración de autenticación para el clúster. AuthConfigProperties
copia de seguridad Propiedades de copia de seguridad del clúster de mongo. BackupProperties (Propiedades de respaldo)
calcular Propiedades de proceso del clúster de mongo. ComputeProperties de
createMode Modo para crear un clúster de Mongo. 'Valor predeterminado'
'Réplica geográfica'
'PointInTimeRestore'
'Réplica'
dataApi Las propiedades de Data API del clúster de mongo. DataApiProperties
El cifrado La configuración de cifrado del clúster. Depende de la identidad que se esté configurando. EncryptionProperties
alta disponibilidad Propiedades de alta disponibilidad del clúster de mongo. HighAvailabilityProperties
previewFeatures Lista de conexiones de punto de conexión privado. Matriz de cadenas que contiene cualquiera de:
'Réplicas geográficas'
publicNetworkAccess Indica si se permite o no el acceso al punto de conexión público para este clúster de Mongo. 'Deshabilitado'
'Habilitado'
replicaParameters Parámetros para crear un clúster de mongo de réplica. MongoClusterReplicaParameters
restoreParameters Los parámetros para crear un clúster de mongo de restauración a un momento dado. MongoClusterRestoreParameters
Versión del servidor Versión del servidor de Mongo DB. El valor predeterminado es la versión más reciente disponible si no se especifica. cuerda
particionamiento Propiedades de particionamiento del clúster de mongo. ShardingProperties
almacenamiento Propiedades de almacenamiento del clúster de mongo. StorageProperties (Propiedades de almacenamiento)

MongoClusterReplicaParameters

Nombre Descripción Valor
ubicaciónFuente Ubicación del clúster de origen string (obligatorio)
sourceResourceId Identificador del clúster de origen de replicación. string (obligatorio)

MongoClusterRestoreParameters

Nombre Descripción Valor
pointInTimeUTC Hora UTC a la que se va a restaurar un clúster de Mongo cuerda
sourceResourceId Identificador de recurso para buscar el clúster de origen que se va a restaurar cuerda

ShardingProperties

Nombre Descripción Valor
shardCount Número de particiones que se van a aprovisionar en el clúster. Int

StorageProperties (Propiedades de almacenamiento)

Nombre Descripción Valor
tamañoGb Tamaño del disco de datos asignado a cada servidor. Int
tipo El tipo de almacenamiento con el que se van a aprovisionar los servidores de clúster. 'SSD premium'
'PremiumSSDv2'

TrackedResourceTags

Nombre Descripción Valor

UserAssignedIdentities

Nombre Descripción Valor

IdentidadAsignadaPorElUsuario

Nombre Descripción Valor

Ejemplos de uso

Ejemplos de Terraform

Un ejemplo básico de despliegue de Azure Cosmos DB para 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    = ["*"]
}