Partilhar via


Microsoft.DocumentDB mongoClusters

Definição de recursos do bíceps

O tipo de recurso mongoClusters pode ser implantado com operações que visam:

Para obter uma lista de propriedades alteradas em cada versão da API, consulte log de alterações.

Formato do recurso

Para criar um recurso Microsoft.DocumentDB/mongoClusters, adicione o seguinte Bicep ao seu modelo.

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 propriedade

Microsoft.DocumentDB/mongoClusters

Designação Descrição Valor
identidade As identidades de serviço gerenciado atribuídas a este recurso. ManagedServiceIdentity
localização A geolocalização onde o recurso vive string (obrigatório)
Designação O nome do recurso cadeia de caracteres

Restrições:
Comprimento mínimo = 3
Comprimento máximo = 40
Padrão = ^[a-z0-9]+(-[a-z0-9]+)* (obrigatório)
propriedades As propriedades específicas do recurso para este recurso. MongoClusterProperties
âmbito Use ao criar um recurso em um escopo diferente do escopo de implantação. Defina essa propriedade como o nome simbólico de um recurso para aplicar o recurso de extensão .
Etiquetas Tags de recursos Dicionário de nomes e valores de tags. Consulte Tags em modelos

AdministradorPropriedades

Designação Descrição Valor
palavra-passe A senha de administrador. cadeia de caracteres

Restrições:
Valor sensível. Passe como um parâmetro seguro.
nome de utilizador O nome de usuário do administrador. cadeia (de caracteres)

AuthConfigProperties

Designação Descrição Valor
allowedModos Modos de autenticação permitidos para acesso a dados no cluster. Matriz de cadeia de caracteres contendo qualquer uma das:
'MicrosoftEntraID'
'NativeAuth'

BackupPropriedades

Designação Descrição Valor

ComputeProperties

Designação Descrição Valor
escalão A camada de computação a ser atribuída ao cluster, onde cada camada é mapeada para um núcleo virtual e tamanho de memória. Valores de exemplo: 'M30', 'M40'. cadeia (de caracteres)

CustomerManagedKeyEncryptionProperties

Designação Descrição Valor
keyEncryptionKeyIdentity A identidade usada para acessar a chave de criptografia de chave. KeyEncryptionKeyIdentity
keyEncryptionKeyUrl O URI da chave do cofre da chave usada para criptografia. cadeia (de caracteres)

DataApiProperties

Designação Descrição Valor
modo O modo para indicar se a API de dados Mongo está habilitada para um cluster. 'Desativado'
'Habilitado'

Propriedades de Encriptação

Designação Descrição Valor
customerManagedKeyEncryption Configurações de criptografia de chave gerenciadas pelo cliente. CustomerManagedKeyEncryptionProperties

HighAvailabilityProperties

Designação Descrição Valor
targetMode O modo de alta disponibilidade de destino solicitado para o cluster. 'Desativado'
'SameZone'
'ZoneRedundantPreferred'

KeyEncryptionKeyIdentity

Designação Descrição Valor
tipo de identidade O tipo de identidade. Apenas 'UserAssignedIdentity' é suportado. 'UserAssignedIdentity'
userAssignedIdentityResourceId A ID do recurso de identidade atribuída ao usuário. cadeia (de caracteres)

Identidade de Serviço Gerido (ManagedServiceIdentity)

Designação Descrição Valor
tipo Tipo de identidade de serviço gerenciado (onde os tipos SystemAssigned e UserAssigned são permitidos). 'None'
'SystemAssigned'
'SystemAssigned,UserAssigned'
'UserAssigned' (obrigatório)
identidades atribuídas pelo utilizador O conjunto de identidades atribuídas pelo usuário associadas ao recurso. As chaves do dicionário userAssignedIdentities serão ids de recurso ARM no formato: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}. Os valores de dicionário podem ser objetos vazios ({}) em solicitações. UserAssignedIdentities

MongoClusterProperties

Designação Descrição Valor
administrador As propriedades do administrador local para o cluster mongo. AdministradorPropriedades
authConfig A configuração de autenticação para o cluster. AuthConfigProperties
cópia de segurança As propriedades de backup do cluster mongo. BackupPropriedades
Calcular As propriedades de computação do cluster mongo. ComputeProperties
createMode O modo para criar um cluster mongo. 'Inadimplência'
'GeoRéplica'
'PointInTimeRestore'
'Réplica'
dataApi As propriedades da API de dados do cluster mongo. DataApiProperties
cifragem A configuração de criptografia para o cluster. Depende da identidade que está sendo configurada. EncryptionProperties
alta disponibilidade As propriedades de alta disponibilidade do cluster mongo. HighAvailabilityProperties
pré-visualizaçãoFuncionalidades Lista de conexões de ponto de extremidade privadas. Matriz de cadeia de caracteres contendo qualquer uma das:
'GeoRéplicas'
acesso à rede pública Se o acesso público ao endpoint é permitido ou não para este cluster mongo. 'Desativado'
'Habilitado'
replicaParameters Os parâmetros para criar uma réplica mongo cluster. MongoClusterReplicaParameters
restoreParameters Os parâmetros para criar um cluster mongo de restauração point-in-time. MongoClusterRestoreParameters
versão do servidor A versão do servidor Mongo DB. O padrão é a versão mais recente disponível, se não for especificado. cadeia (de caracteres)
fragmentação As propriedades de fragmentação do aglomerado mongo. ShardingProperties
armazenamento As propriedades de armazenamento do cluster mongo. Propriedades de armazenamento

MongoClusterReplicaParameters

Designação Descrição Valor
fonteLocalização O local do cluster de origem string (obrigatório)
sourceResourceId A id do cluster de origem de replicação. string (obrigatório)

MongoClusterRestoreParameters

Designação Descrição Valor
pointInTimeUTC UTC ponto no tempo para restaurar um cluster mongo cadeia (de caracteres)
sourceResourceId ID do recurso para localizar o cluster de origem a ser restaurado cadeia (de caracteres)

ShardingProperties

Designação Descrição Valor
Contagem de fragmentos Número de fragmentos a serem provisionados no cluster. Int

Propriedades de armazenamento

Designação Descrição Valor
tamanhoGb O tamanho do disco de dados atribuído a cada servidor. Int
tipo O tipo de armazenamento com o qual provisionar os servidores de cluster. 'SSD premium'
'PremiumSSDv2'

TrackedResourceTags

Designação Descrição Valor

UserAssignedIdentities

Designação Descrição Valor

IdentidadeAtribuídaPeloUtilizador

Designação Descrição Valor

Exemplos de uso

Módulos verificados do Azure

Os seguintes de Módulos Verificados do Azure podem ser usados para implantar esse tipo de recurso.

Módulo Descrição
Cosmos DB para MongoDB (vCore) Módulo de recursos AVM para Cosmos DB para MongoDB (vCore)

Definição de recurso de modelo ARM

O tipo de recurso mongoClusters pode ser implantado com operações que visam:

Para obter uma lista de propriedades alteradas em cada versão da API, consulte log de alterações.

Formato do recurso

Para criar um recurso Microsoft.DocumentDB/mongoClusters, adicione o seguinte JSON ao seu modelo.

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

Microsoft.DocumentDB/mongoClusters

Designação Descrição Valor
Versão da API A versão api '2025-09-01'
identidade As identidades de serviço gerenciado atribuídas a este recurso. ManagedServiceIdentity
localização A geolocalização onde o recurso vive string (obrigatório)
Designação O nome do recurso cadeia de caracteres

Restrições:
Comprimento mínimo = 3
Comprimento máximo = 40
Padrão = ^[a-z0-9]+(-[a-z0-9]+)* (obrigatório)
propriedades As propriedades específicas do recurso para este recurso. MongoClusterProperties
Etiquetas Tags de recursos Dicionário de nomes e valores de tags. Consulte Tags em modelos
tipo O tipo de recurso 'Microsoft.DocumentDB/mongoClusters'

AdministradorPropriedades

Designação Descrição Valor
palavra-passe A senha de administrador. cadeia de caracteres

Restrições:
Valor sensível. Passe como um parâmetro seguro.
nome de utilizador O nome de usuário do administrador. cadeia (de caracteres)

AuthConfigProperties

Designação Descrição Valor
allowedModos Modos de autenticação permitidos para acesso a dados no cluster. Matriz de cadeia de caracteres contendo qualquer uma das:
'MicrosoftEntraID'
'NativeAuth'

BackupPropriedades

Designação Descrição Valor

ComputeProperties

Designação Descrição Valor
escalão A camada de computação a ser atribuída ao cluster, onde cada camada é mapeada para um núcleo virtual e tamanho de memória. Valores de exemplo: 'M30', 'M40'. cadeia (de caracteres)

CustomerManagedKeyEncryptionProperties

Designação Descrição Valor
keyEncryptionKeyIdentity A identidade usada para acessar a chave de criptografia de chave. KeyEncryptionKeyIdentity
keyEncryptionKeyUrl O URI da chave do cofre da chave usada para criptografia. cadeia (de caracteres)

DataApiProperties

Designação Descrição Valor
modo O modo para indicar se a API de dados Mongo está habilitada para um cluster. 'Desativado'
'Habilitado'

Propriedades de Encriptação

Designação Descrição Valor
customerManagedKeyEncryption Configurações de criptografia de chave gerenciadas pelo cliente. CustomerManagedKeyEncryptionProperties

HighAvailabilityProperties

Designação Descrição Valor
targetMode O modo de alta disponibilidade de destino solicitado para o cluster. 'Desativado'
'SameZone'
'ZoneRedundantPreferred'

KeyEncryptionKeyIdentity

Designação Descrição Valor
tipo de identidade O tipo de identidade. Apenas 'UserAssignedIdentity' é suportado. 'UserAssignedIdentity'
userAssignedIdentityResourceId A ID do recurso de identidade atribuída ao usuário. cadeia (de caracteres)

Identidade de Serviço Gerido (ManagedServiceIdentity)

Designação Descrição Valor
tipo Tipo de identidade de serviço gerenciado (onde os tipos SystemAssigned e UserAssigned são permitidos). 'None'
'SystemAssigned'
'SystemAssigned,UserAssigned'
'UserAssigned' (obrigatório)
identidades atribuídas pelo utilizador O conjunto de identidades atribuídas pelo usuário associadas ao recurso. As chaves do dicionário userAssignedIdentities serão ids de recurso ARM no formato: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}. Os valores de dicionário podem ser objetos vazios ({}) em solicitações. UserAssignedIdentities

MongoClusterProperties

Designação Descrição Valor
administrador As propriedades do administrador local para o cluster mongo. AdministradorPropriedades
authConfig A configuração de autenticação para o cluster. AuthConfigProperties
cópia de segurança As propriedades de backup do cluster mongo. BackupPropriedades
Calcular As propriedades de computação do cluster mongo. ComputeProperties
createMode O modo para criar um cluster mongo. 'Inadimplência'
'GeoRéplica'
'PointInTimeRestore'
'Réplica'
dataApi As propriedades da API de dados do cluster mongo. DataApiProperties
cifragem A configuração de criptografia para o cluster. Depende da identidade que está sendo configurada. EncryptionProperties
alta disponibilidade As propriedades de alta disponibilidade do cluster mongo. HighAvailabilityProperties
pré-visualizaçãoFuncionalidades Lista de conexões de ponto de extremidade privadas. Matriz de cadeia de caracteres contendo qualquer uma das:
'GeoRéplicas'
acesso à rede pública Se o acesso público ao endpoint é permitido ou não para este cluster mongo. 'Desativado'
'Habilitado'
replicaParameters Os parâmetros para criar uma réplica mongo cluster. MongoClusterReplicaParameters
restoreParameters Os parâmetros para criar um cluster mongo de restauração point-in-time. MongoClusterRestoreParameters
versão do servidor A versão do servidor Mongo DB. O padrão é a versão mais recente disponível, se não for especificado. cadeia (de caracteres)
fragmentação As propriedades de fragmentação do aglomerado mongo. ShardingProperties
armazenamento As propriedades de armazenamento do cluster mongo. Propriedades de armazenamento

MongoClusterReplicaParameters

Designação Descrição Valor
fonteLocalização O local do cluster de origem string (obrigatório)
sourceResourceId A id do cluster de origem de replicação. string (obrigatório)

MongoClusterRestoreParameters

Designação Descrição Valor
pointInTimeUTC UTC ponto no tempo para restaurar um cluster mongo cadeia (de caracteres)
sourceResourceId ID do recurso para localizar o cluster de origem a ser restaurado cadeia (de caracteres)

ShardingProperties

Designação Descrição Valor
Contagem de fragmentos Número de fragmentos a serem provisionados no cluster. Int

Propriedades de armazenamento

Designação Descrição Valor
tamanhoGb O tamanho do disco de dados atribuído a cada servidor. Int
tipo O tipo de armazenamento com o qual provisionar os servidores de cluster. 'SSD premium'
'PremiumSSDv2'

TrackedResourceTags

Designação Descrição Valor

UserAssignedIdentities

Designação Descrição Valor

IdentidadeAtribuídaPeloUtilizador

Designação Descrição Valor

Exemplos de uso

Definição de recursos Terraform (provedor AzAPI)

O tipo de recurso mongoClusters pode ser implantado com operações que visam:

Para obter uma lista de propriedades alteradas em cada versão da API, consulte log de alterações.

Formato do recurso

Para criar um recurso Microsoft.DocumentDB/mongoClusters, adicione o seguinte Terraform ao seu modelo.

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 propriedade

Microsoft.DocumentDB/mongoClusters

Designação Descrição Valor
identidade As identidades de serviço gerenciado atribuídas a este recurso. ManagedServiceIdentity
localização A geolocalização onde o recurso vive string (obrigatório)
Designação O nome do recurso cadeia de caracteres

Restrições:
Comprimento mínimo = 3
Comprimento máximo = 40
Padrão = ^[a-z0-9]+(-[a-z0-9]+)* (obrigatório)
parent_id A ID do recurso ao qual aplicar esse recurso de extensão. string (obrigatório)
propriedades As propriedades específicas do recurso para este recurso. MongoClusterProperties
Etiquetas Tags de recursos Dicionário de nomes e valores de tags.
tipo O tipo de recurso "Microsoft.DocumentDB/mongoClusters@2025-09-01"

AdministradorPropriedades

Designação Descrição Valor
palavra-passe A senha de administrador. cadeia de caracteres

Restrições:
Valor sensível. Passe como um parâmetro seguro.
nome de utilizador O nome de usuário do administrador. cadeia (de caracteres)

AuthConfigProperties

Designação Descrição Valor
allowedModos Modos de autenticação permitidos para acesso a dados no cluster. Matriz de cadeia de caracteres contendo qualquer uma das:
'MicrosoftEntraID'
'NativeAuth'

BackupPropriedades

Designação Descrição Valor

ComputeProperties

Designação Descrição Valor
escalão A camada de computação a ser atribuída ao cluster, onde cada camada é mapeada para um núcleo virtual e tamanho de memória. Valores de exemplo: 'M30', 'M40'. cadeia (de caracteres)

CustomerManagedKeyEncryptionProperties

Designação Descrição Valor
keyEncryptionKeyIdentity A identidade usada para acessar a chave de criptografia de chave. KeyEncryptionKeyIdentity
keyEncryptionKeyUrl O URI da chave do cofre da chave usada para criptografia. cadeia (de caracteres)

DataApiProperties

Designação Descrição Valor
modo O modo para indicar se a API de dados Mongo está habilitada para um cluster. 'Desativado'
'Habilitado'

Propriedades de Encriptação

Designação Descrição Valor
customerManagedKeyEncryption Configurações de criptografia de chave gerenciadas pelo cliente. CustomerManagedKeyEncryptionProperties

HighAvailabilityProperties

Designação Descrição Valor
targetMode O modo de alta disponibilidade de destino solicitado para o cluster. 'Desativado'
'SameZone'
'ZoneRedundantPreferred'

KeyEncryptionKeyIdentity

Designação Descrição Valor
tipo de identidade O tipo de identidade. Apenas 'UserAssignedIdentity' é suportado. 'UserAssignedIdentity'
userAssignedIdentityResourceId A ID do recurso de identidade atribuída ao usuário. cadeia (de caracteres)

Identidade de Serviço Gerido (ManagedServiceIdentity)

Designação Descrição Valor
tipo Tipo de identidade de serviço gerenciado (onde os tipos SystemAssigned e UserAssigned são permitidos). 'None'
'SystemAssigned'
'SystemAssigned,UserAssigned'
'UserAssigned' (obrigatório)
identidades atribuídas pelo utilizador O conjunto de identidades atribuídas pelo usuário associadas ao recurso. As chaves do dicionário userAssignedIdentities serão ids de recurso ARM no formato: '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}. Os valores de dicionário podem ser objetos vazios ({}) em solicitações. UserAssignedIdentities

MongoClusterProperties

Designação Descrição Valor
administrador As propriedades do administrador local para o cluster mongo. AdministradorPropriedades
authConfig A configuração de autenticação para o cluster. AuthConfigProperties
cópia de segurança As propriedades de backup do cluster mongo. BackupPropriedades
Calcular As propriedades de computação do cluster mongo. ComputeProperties
createMode O modo para criar um cluster mongo. 'Inadimplência'
'GeoRéplica'
'PointInTimeRestore'
'Réplica'
dataApi As propriedades da API de dados do cluster mongo. DataApiProperties
cifragem A configuração de criptografia para o cluster. Depende da identidade que está sendo configurada. EncryptionProperties
alta disponibilidade As propriedades de alta disponibilidade do cluster mongo. HighAvailabilityProperties
pré-visualizaçãoFuncionalidades Lista de conexões de ponto de extremidade privadas. Matriz de cadeia de caracteres contendo qualquer uma das:
'GeoRéplicas'
acesso à rede pública Se o acesso público ao endpoint é permitido ou não para este cluster mongo. 'Desativado'
'Habilitado'
replicaParameters Os parâmetros para criar uma réplica mongo cluster. MongoClusterReplicaParameters
restoreParameters Os parâmetros para criar um cluster mongo de restauração point-in-time. MongoClusterRestoreParameters
versão do servidor A versão do servidor Mongo DB. O padrão é a versão mais recente disponível, se não for especificado. cadeia (de caracteres)
fragmentação As propriedades de fragmentação do aglomerado mongo. ShardingProperties
armazenamento As propriedades de armazenamento do cluster mongo. Propriedades de armazenamento

MongoClusterReplicaParameters

Designação Descrição Valor
fonteLocalização O local do cluster de origem string (obrigatório)
sourceResourceId A id do cluster de origem de replicação. string (obrigatório)

MongoClusterRestoreParameters

Designação Descrição Valor
pointInTimeUTC UTC ponto no tempo para restaurar um cluster mongo cadeia (de caracteres)
sourceResourceId ID do recurso para localizar o cluster de origem a ser restaurado cadeia (de caracteres)

ShardingProperties

Designação Descrição Valor
Contagem de fragmentos Número de fragmentos a serem provisionados no cluster. Int

Propriedades de armazenamento

Designação Descrição Valor
tamanhoGb O tamanho do disco de dados atribuído a cada servidor. Int
tipo O tipo de armazenamento com o qual provisionar os servidores de cluster. 'SSD premium'
'PremiumSSDv2'

TrackedResourceTags

Designação Descrição Valor

UserAssignedIdentities

Designação Descrição Valor

IdentidadeAtribuídaPeloUtilizador

Designação Descrição Valor

Exemplos de uso

Amostras Terraform

Um exemplo básico de implementação do 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    = ["*"]
}