Compartilhar via


MongoClusters Microsoft.DocumentDB

Definição de recurso do Bicep

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

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

Formato de recurso

Para criar um recurso Microsoft.DocumentDB/mongoClusters, adicione o Bicep a seguir ao 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

Nome Descrição Valor
identidade As identidades de serviço gerenciadas atribuídas a esse recurso. ManagedServiceIdentity
local A localização geográfica onde o recurso reside cadeia de caracteres (obrigatório)
nome O nome do recurso corda

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 esse recurso. MongoClusterProperties
escopo 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 .
Tags Marcas de recurso Dicionário de nomes e valores de marca. Consulte Marcas em modelos

AdministratorProperties

Nome Descrição Valor
senha A senha do administrador. corda

Restrições:
Valor confidencial. Passe como um parâmetro seguro.
nome do usuário O nome de usuário do administrador. cadeia

AuthConfigProperties

Nome Descrição Valor
allowedModes Modos de autenticação permitidos para acesso a dados no cluster. Matriz de cadeia de caracteres que contém qualquer um dos:
'MicrosoftEntraID'
'Autenticação nativa'

Propriedades de backup

Nome Descrição Valor

Propriedades de computação

Nome Descrição Valor
nível A camada de computação a ser atribuída ao cluster, em que cada camada é mapeada para um núcleo virtual e tamanho de memória. Valores de exemplo: 'M30', 'M40'. cadeia

CustomerManagedKeyEncryptionProperties

Nome Descrição Valor
keyEncryptionKeyIdentity A identidade usada para acessar a chave de criptografia de chave. ChaveCriptografiaIdentidadeChave
keyEncryptionKeyUrl O URI da chave do cofre de chaves usada para criptografia. cadeia

DataApiProperties

Nome Descrição Valor
modo O modo para indicar se a API de Dados do Mongo está habilitada para um cluster. 'Desabilitado'
'Habilitado'

EncryptionProperties

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

Propriedades de alta disponibilidade

Nome Descrição Valor
Modo alvo O modo de alta disponibilidade de destino solicitado para o cluster. 'Desabilitado'
'Mesma Zona'
'ZoneRedundantPreferred'

KeyEncryptionKeyIdentity

Nome Descrição Valor
tipo de identidade O tipo de identidade. Há suporte apenas para 'UserAssignedIdentity'. 'UserAssignedIdentity'
userAssignedIdentityResourceId A ID do recurso de identidade atribuída pelo usuário. cadeia

ManagedServiceIdentity

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

Propriedades do Cluster Mongo

Nome Descrição Valor
administrador As propriedades do administrador local para o cluster mongo. AdministratorProperties
authConfig A configuração de autenticação do cluster. AuthConfigProperties
backup As propriedades de backup do cluster mongo. Propriedades de backup
computação As propriedades de computação do cluster mongo. ComputeProperties
Modo de criação O modo para criar um cluster mongo. 'Padrão'
'GeoReplica'
'PointInTimeRestore'
'Réplica'
dataApi As propriedades da API de Dados do cluster mongo. DataApiProperties
criptografia A configuração de criptografia do cluster. Depende da identidade que está sendo configurada. Propriedades de criptografia
alta disponibilidade As propriedades de alta disponibilidade do cluster mongo. Propriedades de alta disponibilidade
previewFeatures Lista de conexões de ponto de extremidade privado. Matriz de cadeia de caracteres que contém qualquer um dos:
'GeoReplicas'
públicoAcessoRedeAcesso Se o acesso ao ponto de extremidade público é permitido ou não para este cluster mongo. 'Desabilitado'
'Habilitado'
replicaParameters Os parâmetros para criar um cluster mongo de réplica. MongoClusterReplicaParameters
restoreParameters Os parâmetros para criar um cluster mongo de restauração pontual. MongoClusterRestoreParameters
Versão do servidor A versão do servidor do Mongo DB. O padrão é a versão mais recente disponível, se não for especificada. cadeia
fragmentação As propriedades de fragmentação do cluster mongo. shardingProperties
armazenamento As propriedades de armazenamento do cluster mongo. Propriedades de armazenamento

MongoClusterReplicaParameters

Nome Descrição Valor
localizaçãoFonte O local do cluster de origem cadeia de caracteres (obrigatório)
sourceResourceId A ID do cluster de origem de replicação. cadeia de caracteres (obrigatório)

MongoClusterRestoreParameters

Nome Descrição Valor
pointInTimeUTC Ponto UTC no tempo para restaurar um cluster mongo cadeia
sourceResourceId ID do recurso para localizar o cluster de origem a ser restaurado cadeia

Propriedades de fragmentação

Nome Descrição Valor
contagem de fragmentos Número de fragmentos a serem provisionadas no cluster. int

Propriedades de armazenamento

Nome 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'
'PremiumSSD v2'

TrackedResourceTags

Nome Descrição Valor

UserAssignedIdentities

Nome Descrição Valor

UserAssignedIdentity

Nome Descrição Valor

Exemplos de uso

Módulos verificados do Azure

O módulos verificados do Azure a seguir pode ser usado para implantar esse tipo de recurso.

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

Definição de recurso de modelo do ARM

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

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

Formato de recurso

Para criar um recurso Microsoft.DocumentDB/mongoClusters, adicione o JSON a seguir ao 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

Nome Descrição Valor
apiVersion A versão da API '2025-09-01'
identidade As identidades de serviço gerenciadas atribuídas a esse recurso. ManagedServiceIdentity
local A localização geográfica onde o recurso reside cadeia de caracteres (obrigatório)
nome O nome do recurso corda

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 esse recurso. MongoClusterProperties
Tags Marcas de recurso Dicionário de nomes e valores de marca. Consulte Marcas em modelos
tipo O tipo de recurso 'Microsoft.DocumentDB/mongoClusters'

AdministratorProperties

Nome Descrição Valor
senha A senha do administrador. corda

Restrições:
Valor confidencial. Passe como um parâmetro seguro.
nome do usuário O nome de usuário do administrador. cadeia

AuthConfigProperties

Nome Descrição Valor
allowedModes Modos de autenticação permitidos para acesso a dados no cluster. Matriz de cadeia de caracteres que contém qualquer um dos:
'MicrosoftEntraID'
'Autenticação nativa'

Propriedades de backup

Nome Descrição Valor

Propriedades de computação

Nome Descrição Valor
nível A camada de computação a ser atribuída ao cluster, em que cada camada é mapeada para um núcleo virtual e tamanho de memória. Valores de exemplo: 'M30', 'M40'. cadeia

CustomerManagedKeyEncryptionProperties

Nome Descrição Valor
keyEncryptionKeyIdentity A identidade usada para acessar a chave de criptografia de chave. ChaveCriptografiaIdentidadeChave
keyEncryptionKeyUrl O URI da chave do cofre de chaves usada para criptografia. cadeia

DataApiProperties

Nome Descrição Valor
modo O modo para indicar se a API de Dados do Mongo está habilitada para um cluster. 'Desabilitado'
'Habilitado'

EncryptionProperties

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

Propriedades de alta disponibilidade

Nome Descrição Valor
Modo alvo O modo de alta disponibilidade de destino solicitado para o cluster. 'Desabilitado'
'Mesma Zona'
'ZoneRedundantPreferred'

KeyEncryptionKeyIdentity

Nome Descrição Valor
tipo de identidade O tipo de identidade. Há suporte apenas para 'UserAssignedIdentity'. 'UserAssignedIdentity'
userAssignedIdentityResourceId A ID do recurso de identidade atribuída pelo usuário. cadeia

ManagedServiceIdentity

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

Propriedades do Cluster Mongo

Nome Descrição Valor
administrador As propriedades do administrador local para o cluster mongo. AdministratorProperties
authConfig A configuração de autenticação do cluster. AuthConfigProperties
backup As propriedades de backup do cluster mongo. Propriedades de backup
computação As propriedades de computação do cluster mongo. ComputeProperties
Modo de criação O modo para criar um cluster mongo. 'Padrão'
'GeoReplica'
'PointInTimeRestore'
'Réplica'
dataApi As propriedades da API de Dados do cluster mongo. DataApiProperties
criptografia A configuração de criptografia do cluster. Depende da identidade que está sendo configurada. Propriedades de criptografia
alta disponibilidade As propriedades de alta disponibilidade do cluster mongo. Propriedades de alta disponibilidade
previewFeatures Lista de conexões de ponto de extremidade privado. Matriz de cadeia de caracteres que contém qualquer um dos:
'GeoReplicas'
públicoAcessoRedeAcesso Se o acesso ao ponto de extremidade público é permitido ou não para este cluster mongo. 'Desabilitado'
'Habilitado'
replicaParameters Os parâmetros para criar um cluster mongo de réplica. MongoClusterReplicaParameters
restoreParameters Os parâmetros para criar um cluster mongo de restauração pontual. MongoClusterRestoreParameters
Versão do servidor A versão do servidor do Mongo DB. O padrão é a versão mais recente disponível, se não for especificada. cadeia
fragmentação As propriedades de fragmentação do cluster mongo. shardingProperties
armazenamento As propriedades de armazenamento do cluster mongo. Propriedades de armazenamento

MongoClusterReplicaParameters

Nome Descrição Valor
localizaçãoFonte O local do cluster de origem cadeia de caracteres (obrigatório)
sourceResourceId A ID do cluster de origem de replicação. cadeia de caracteres (obrigatório)

MongoClusterRestoreParameters

Nome Descrição Valor
pointInTimeUTC Ponto UTC no tempo para restaurar um cluster mongo cadeia
sourceResourceId ID do recurso para localizar o cluster de origem a ser restaurado cadeia

Propriedades de fragmentação

Nome Descrição Valor
contagem de fragmentos Número de fragmentos a serem provisionadas no cluster. int

Propriedades de armazenamento

Nome 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'
'PremiumSSD v2'

TrackedResourceTags

Nome Descrição Valor

UserAssignedIdentities

Nome Descrição Valor

UserAssignedIdentity

Nome Descrição Valor

Exemplos de uso

Definição de recurso do Terraform (provedor de AzAPI)

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

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

Formato de recurso

Para criar um recurso Microsoft.DocumentDB/mongoClusters, adicione o Terraform a seguir 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

Nome Descrição Valor
identidade As identidades de serviço gerenciadas atribuídas a esse recurso. ManagedServiceIdentity
local A localização geográfica onde o recurso reside cadeia de caracteres (obrigatório)
nome O nome do recurso corda

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. cadeia de caracteres (obrigatório)
Propriedades As propriedades específicas do recurso para esse recurso. MongoClusterProperties
Tags Marcas de recurso Dicionário de nomes e valores de marca.
tipo O tipo de recurso "Microsoft.DocumentDB/mongoClusters@2025-09-01"

AdministratorProperties

Nome Descrição Valor
senha A senha do administrador. corda

Restrições:
Valor confidencial. Passe como um parâmetro seguro.
nome do usuário O nome de usuário do administrador. cadeia

AuthConfigProperties

Nome Descrição Valor
allowedModes Modos de autenticação permitidos para acesso a dados no cluster. Matriz de cadeia de caracteres que contém qualquer um dos:
'MicrosoftEntraID'
'Autenticação nativa'

Propriedades de backup

Nome Descrição Valor

Propriedades de computação

Nome Descrição Valor
nível A camada de computação a ser atribuída ao cluster, em que cada camada é mapeada para um núcleo virtual e tamanho de memória. Valores de exemplo: 'M30', 'M40'. cadeia

CustomerManagedKeyEncryptionProperties

Nome Descrição Valor
keyEncryptionKeyIdentity A identidade usada para acessar a chave de criptografia de chave. ChaveCriptografiaIdentidadeChave
keyEncryptionKeyUrl O URI da chave do cofre de chaves usada para criptografia. cadeia

DataApiProperties

Nome Descrição Valor
modo O modo para indicar se a API de Dados do Mongo está habilitada para um cluster. 'Desabilitado'
'Habilitado'

EncryptionProperties

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

Propriedades de alta disponibilidade

Nome Descrição Valor
Modo alvo O modo de alta disponibilidade de destino solicitado para o cluster. 'Desabilitado'
'Mesma Zona'
'ZoneRedundantPreferred'

KeyEncryptionKeyIdentity

Nome Descrição Valor
tipo de identidade O tipo de identidade. Há suporte apenas para 'UserAssignedIdentity'. 'UserAssignedIdentity'
userAssignedIdentityResourceId A ID do recurso de identidade atribuída pelo usuário. cadeia

ManagedServiceIdentity

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

Propriedades do Cluster Mongo

Nome Descrição Valor
administrador As propriedades do administrador local para o cluster mongo. AdministratorProperties
authConfig A configuração de autenticação do cluster. AuthConfigProperties
backup As propriedades de backup do cluster mongo. Propriedades de backup
computação As propriedades de computação do cluster mongo. ComputeProperties
Modo de criação O modo para criar um cluster mongo. 'Padrão'
'GeoReplica'
'PointInTimeRestore'
'Réplica'
dataApi As propriedades da API de Dados do cluster mongo. DataApiProperties
criptografia A configuração de criptografia do cluster. Depende da identidade que está sendo configurada. Propriedades de criptografia
alta disponibilidade As propriedades de alta disponibilidade do cluster mongo. Propriedades de alta disponibilidade
previewFeatures Lista de conexões de ponto de extremidade privado. Matriz de cadeia de caracteres que contém qualquer um dos:
'GeoReplicas'
públicoAcessoRedeAcesso Se o acesso ao ponto de extremidade público é permitido ou não para este cluster mongo. 'Desabilitado'
'Habilitado'
replicaParameters Os parâmetros para criar um cluster mongo de réplica. MongoClusterReplicaParameters
restoreParameters Os parâmetros para criar um cluster mongo de restauração pontual. MongoClusterRestoreParameters
Versão do servidor A versão do servidor do Mongo DB. O padrão é a versão mais recente disponível, se não for especificada. cadeia
fragmentação As propriedades de fragmentação do cluster mongo. shardingProperties
armazenamento As propriedades de armazenamento do cluster mongo. Propriedades de armazenamento

MongoClusterReplicaParameters

Nome Descrição Valor
localizaçãoFonte O local do cluster de origem cadeia de caracteres (obrigatório)
sourceResourceId A ID do cluster de origem de replicação. cadeia de caracteres (obrigatório)

MongoClusterRestoreParameters

Nome Descrição Valor
pointInTimeUTC Ponto UTC no tempo para restaurar um cluster mongo cadeia
sourceResourceId ID do recurso para localizar o cluster de origem a ser restaurado cadeia

Propriedades de fragmentação

Nome Descrição Valor
contagem de fragmentos Número de fragmentos a serem provisionadas no cluster. int

Propriedades de armazenamento

Nome 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'
'PremiumSSD v2'

TrackedResourceTags

Nome Descrição Valor

UserAssignedIdentities

Nome Descrição Valor

UserAssignedIdentity

Nome Descrição Valor

Exemplos de uso

Exemplos do Terraform

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