다음을 통해 공유


Microsoft.DocumentDB mongoClusters 2025-04-01-미리 보기

Bicep 리소스 정의

mongoClusters 리소스 종류는 다음을 대상으로 하는 작업으로 배포할 수 있습니다.

각 API 버전에서 변경된 속성 목록은 변경 로그참조하세요.

리소스 형식

Microsoft.DocumentDB/mongoClusters 리소스를 만들려면 템플릿에 다음 Bicep을 추가합니다.

resource symbolicname 'Microsoft.DocumentDB/mongoClusters@2025-04-01-preview' = {
  scope: resourceSymbolicName or scope
  location: 'string'
  name: 'string'
  properties: {
    administrator: {
      password: 'string'
      userName: 'string'
    }
    authConfig: {
      allowedModes: [
        'string'
      ]
    }
    backup: {}
    compute: {
      tier: 'string'
    }
    createMode: 'string'
    dataApi: {
      mode: 'string'
    }
    highAvailability: {
      targetMode: 'string'
    }
    previewFeatures: [
      'string'
    ]
    publicNetworkAccess: 'string'
    replicaParameters: {
      sourceLocation: 'string'
      sourceResourceId: 'string'
    }
    restoreParameters: {
      pointInTimeUTC: 'string'
      sourceResourceId: 'string'
    }
    serverVersion: 'string'
    sharding: {
      shardCount: int
    }
    storage: {
      iops: int
      sizeGb: int
      throughput: int
      type: 'string'
    }
  }
  tags: {
    {customized property}: 'string'
  }
}

속성 값

Microsoft.DocumentDB/mongoClusters

이름 설명 가치
위치 리소스가 있는 지리적 위치 string(필수)
이름 리소스 이름 문자열

제약 조건:
최소 길이 = 3
최대 길이 = 40
패턴 = ^[a-z0-9]+(-[a-z0-9]+)*(필수)
속성 이 리소스에 대한 리소스별 속성입니다. MongoClusterProperties
scope 배포 범위와 다른 범위에서 리소스를 만들 때 사용합니다. 이 속성을 리소스의 기호 이름으로 설정하여 확장 리소스를 적용합니다.
태그 리소스 태그 태그 이름 및 값의 사전입니다. 템플릿 태그를 참조하세요.

관리자속성

이름 설명 가치
암호 관리자 암호입니다. 문자열

제약 조건:
중요한 값입니다. 보안 매개 변수로 전달합니다.
사용자 이름 관리자 사용자 이름입니다. 문자열

AuthConfigProperties

이름 설명 가치
allowedModes 클러스터에서 데이터 액세스에 대해 허용된 인증 모드입니다. 다음 중 어느 것을 포함하는 문자열 배열:
'마이크로소프트 엔트라ID'
'네이티브 인증'

백업 속성

이름 설명 가치

컴퓨트프로퍼티

이름 설명 가치
단계 각 계층이 가상 코어 및 메모리 크기에 매핑되는 클러스터에 할당할 컴퓨팅 계층입니다. 예제 값: 'M30', 'M40'. 문자열

DataApiProperties

이름 설명 가치
모드 Mongo Data API를 클러스터에 사용할 수 있는지 여부를 나타내는 모드입니다. '사용 안 함'
'사용'

고가용성속성

이름 설명 가치
타겟 모드 클러스터에 대해 요청된 대상 고가용성 모드입니다. '사용 안 함'
'사임존'
'ZoneRedundantPreferred'

MongoClusterProperties

이름 설명 가치
관리자 mongo 클러스터의 로컬 관리자 속성입니다. 관리자속성
인증 구성 클러스터에 대한 인증 구성입니다. AuthConfigProperties
백업 mongo 클러스터의 백업 속성입니다. 백업 속성
계산하다 mongo 클러스터의 컴퓨팅 속성입니다. computeProperties
크리에이션모드 mongo 클러스터를 만드는 모드입니다. 기본값
'지오레플리카'
'PointInTimeRestore'
'레플리카'
데이터 API mongo 클러스터의 데이터 API 속성입니다. DataApiProperties
고가용성 mongo 클러스터의 고가용성 속성입니다. 고가용성속성
미리보기기능 프라이빗 엔드포인트 연결 목록입니다. 다음 중 어느 것을 포함하는 문자열 배열:
'지오레플리카'
공공 네트워크 접근 이 mongo 클러스터에 대한 퍼블릭 엔드포인트 액세스가 허용되는지 여부입니다. '사용 안 함'
'사용'
replicaParameters 복제본 mongo 클러스터를 만들 매개 변수입니다. MongoClusterReplica매개변수
restoreParameters 지정 시간 복원 mongo 클러스터를 만드는 매개 변수입니다. MongoClusterRestoreParameters
서버 버전 Mongo DB 서버 버전입니다. 지정하지 않으면 기본적으로 사용 가능한 최신 버전으로 설정됩니다. 문자열
샤 딩 mongo 클러스터의 분할 속성입니다. ShardingProperties
저장소 mongo 클러스터의 스토리지 속성입니다. 스토리지속성

MongoClusterReplica매개변수

이름 설명 가치
소스 위치 원본 클러스터의 위치 string(필수)
sourceResourceId 복제 원본 클러스터의 ID입니다. string(필수)

MongoClusterRestoreParameters

이름 설명 가치
포인트인타임UTC MONgo 클러스터를 복원하기 위한 UTC 지정 시간 문자열
sourceResourceId 복원할 원본 클러스터를 찾는 리소스 ID 문자열

ShardingProperties

이름 설명 가치
샤드 카운트 클러스터에서 프로비전할 분할된 데이터베이스 수입니다. 정수 (int)

스토리지속성

이름 설명 가치
IOPS 각 서버에 할당된 스토리지의 IOPS입니다. 형식이 'PremiumSSDv2'인 경우에만 적용됩니다. 정수 (int)
크기Gb 각 서버에 할당된 데이터 디스크의 크기입니다. 정수 (int)
처리량 각 서버에 할당된 저장소의 처리량입니다. 형식이 'PremiumSSDv2'인 경우에만 적용됩니다. 정수 (int)
유형 클러스터 서버를 프로비저닝하는 데 사용할 스토리지 유형입니다. '프리미엄SSD'
'프리미엄SSDv2'

TrackedResource태그

이름 설명 가치

사용 예제

Azure 확인된 모듈

다음 Azure 확인된 모듈 사용하여 이 리소스 유형을 배포할 수 있습니다.

모듈 설명
Cosmos DB for MongoDB(vCore) MongoDB용 Cosmos DB용 AVM 리소스 모듈(vCore)

ARM 템플릿 리소스 정의

mongoClusters 리소스 종류는 다음을 대상으로 하는 작업으로 배포할 수 있습니다.

각 API 버전에서 변경된 속성 목록은 변경 로그참조하세요.

리소스 형식

Microsoft.DocumentDB/mongoClusters 리소스를 만들려면 템플릿에 다음 JSON을 추가합니다.

{
  "type": "Microsoft.DocumentDB/mongoClusters",
  "apiVersion": "2025-04-01-preview",
  "name": "string",
  "location": "string",
  "properties": {
    "administrator": {
      "password": "string",
      "userName": "string"
    },
    "authConfig": {
      "allowedModes": [ "string" ]
    },
    "backup": {
    },
    "compute": {
      "tier": "string"
    },
    "createMode": "string",
    "dataApi": {
      "mode": "string"
    },
    "highAvailability": {
      "targetMode": "string"
    },
    "previewFeatures": [ "string" ],
    "publicNetworkAccess": "string",
    "replicaParameters": {
      "sourceLocation": "string",
      "sourceResourceId": "string"
    },
    "restoreParameters": {
      "pointInTimeUTC": "string",
      "sourceResourceId": "string"
    },
    "serverVersion": "string",
    "sharding": {
      "shardCount": "int"
    },
    "storage": {
      "iops": "int",
      "sizeGb": "int",
      "throughput": "int",
      "type": "string"
    }
  },
  "tags": {
    "{customized property}": "string"
  }
}

속성 값

Microsoft.DocumentDB/mongoClusters

이름 설명 가치
API버전 api 버전 '2025-04-01-미리보기'
위치 리소스가 있는 지리적 위치 string(필수)
이름 리소스 이름 문자열

제약 조건:
최소 길이 = 3
최대 길이 = 40
패턴 = ^[a-z0-9]+(-[a-z0-9]+)*(필수)
속성 이 리소스에 대한 리소스별 속성입니다. MongoClusterProperties
태그 리소스 태그 태그 이름 및 값의 사전입니다. 템플릿 태그를 참조하세요.
유형 리소스 종류 'Microsoft.DocumentDB/mongoClusters'

관리자속성

이름 설명 가치
암호 관리자 암호입니다. 문자열

제약 조건:
중요한 값입니다. 보안 매개 변수로 전달합니다.
사용자 이름 관리자 사용자 이름입니다. 문자열

AuthConfigProperties

이름 설명 가치
allowedModes 클러스터에서 데이터 액세스에 대해 허용된 인증 모드입니다. 다음 중 어느 것을 포함하는 문자열 배열:
'마이크로소프트 엔트라ID'
'네이티브 인증'

백업 속성

이름 설명 가치

컴퓨트프로퍼티

이름 설명 가치
단계 각 계층이 가상 코어 및 메모리 크기에 매핑되는 클러스터에 할당할 컴퓨팅 계층입니다. 예제 값: 'M30', 'M40'. 문자열

DataApiProperties

이름 설명 가치
모드 Mongo Data API를 클러스터에 사용할 수 있는지 여부를 나타내는 모드입니다. '사용 안 함'
'사용'

고가용성속성

이름 설명 가치
타겟 모드 클러스터에 대해 요청된 대상 고가용성 모드입니다. '사용 안 함'
'사임존'
'ZoneRedundantPreferred'

MongoClusterProperties

이름 설명 가치
관리자 mongo 클러스터의 로컬 관리자 속성입니다. 관리자속성
인증 구성 클러스터에 대한 인증 구성입니다. AuthConfigProperties
백업 mongo 클러스터의 백업 속성입니다. 백업 속성
계산하다 mongo 클러스터의 컴퓨팅 속성입니다. computeProperties
크리에이션모드 mongo 클러스터를 만드는 모드입니다. 기본값
'지오레플리카'
'PointInTimeRestore'
'레플리카'
데이터 API mongo 클러스터의 데이터 API 속성입니다. DataApiProperties
고가용성 mongo 클러스터의 고가용성 속성입니다. 고가용성속성
미리보기기능 프라이빗 엔드포인트 연결 목록입니다. 다음 중 어느 것을 포함하는 문자열 배열:
'지오레플리카'
공공 네트워크 접근 이 mongo 클러스터에 대한 퍼블릭 엔드포인트 액세스가 허용되는지 여부입니다. '사용 안 함'
'사용'
replicaParameters 복제본 mongo 클러스터를 만들 매개 변수입니다. MongoClusterReplica매개변수
restoreParameters 지정 시간 복원 mongo 클러스터를 만드는 매개 변수입니다. MongoClusterRestoreParameters
서버 버전 Mongo DB 서버 버전입니다. 지정하지 않으면 기본적으로 사용 가능한 최신 버전으로 설정됩니다. 문자열
샤 딩 mongo 클러스터의 분할 속성입니다. ShardingProperties
저장소 mongo 클러스터의 스토리지 속성입니다. 스토리지속성

MongoClusterReplica매개변수

이름 설명 가치
소스 위치 원본 클러스터의 위치 string(필수)
sourceResourceId 복제 원본 클러스터의 ID입니다. string(필수)

MongoClusterRestoreParameters

이름 설명 가치
포인트인타임UTC MONgo 클러스터를 복원하기 위한 UTC 지정 시간 문자열
sourceResourceId 복원할 원본 클러스터를 찾는 리소스 ID 문자열

ShardingProperties

이름 설명 가치
샤드 카운트 클러스터에서 프로비전할 분할된 데이터베이스 수입니다. 정수 (int)

스토리지속성

이름 설명 가치
IOPS 각 서버에 할당된 스토리지의 IOPS입니다. 형식이 'PremiumSSDv2'인 경우에만 적용됩니다. 정수 (int)
크기Gb 각 서버에 할당된 데이터 디스크의 크기입니다. 정수 (int)
처리량 각 서버에 할당된 저장소의 처리량입니다. 형식이 'PremiumSSDv2'인 경우에만 적용됩니다. 정수 (int)
유형 클러스터 서버를 프로비저닝하는 데 사용할 스토리지 유형입니다. '프리미엄SSD'
'프리미엄SSDv2'

TrackedResource태그

이름 설명 가치

사용 예제

Terraform(AzAPI 공급자) 리소스 정의

mongoClusters 리소스 종류는 다음을 대상으로 하는 작업으로 배포할 수 있습니다.

각 API 버전에서 변경된 속성 목록은 변경 로그참조하세요.

리소스 형식

Microsoft.DocumentDB/mongoClusters 리소스를 만들려면 템플릿에 다음 Terraform을 추가합니다.

resource "azapi_resource" "symbolicname" {
  type = "Microsoft.DocumentDB/mongoClusters@2025-04-01-preview"
  name = "string"
  parent_id = "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"
      }
      highAvailability = {
        targetMode = "string"
      }
      previewFeatures = [
        "string"
      ]
      publicNetworkAccess = "string"
      replicaParameters = {
        sourceLocation = "string"
        sourceResourceId = "string"
      }
      restoreParameters = {
        pointInTimeUTC = "string"
        sourceResourceId = "string"
      }
      serverVersion = "string"
      sharding = {
        shardCount = int
      }
      storage = {
        iops = int
        sizeGb = int
        throughput = int
        type = "string"
      }
    }
  }
}

속성 값

Microsoft.DocumentDB/mongoClusters

이름 설명 가치
위치 리소스가 있는 지리적 위치 string(필수)
이름 리소스 이름 문자열

제약 조건:
최소 길이 = 3
최대 길이 = 40
패턴 = ^[a-z0-9]+(-[a-z0-9]+)*(필수)
parent_id 이 확장 리소스를 적용할 리소스의 ID입니다. string(필수)
속성 이 리소스에 대한 리소스별 속성입니다. MongoClusterProperties
태그 리소스 태그 태그 이름 및 값의 사전입니다.
유형 리소스 종류 "Microsoft.DocumentDB/mongoClusters@2025-04-01-preview"

관리자속성

이름 설명 가치
암호 관리자 암호입니다. 문자열

제약 조건:
중요한 값입니다. 보안 매개 변수로 전달합니다.
사용자 이름 관리자 사용자 이름입니다. 문자열

AuthConfigProperties

이름 설명 가치
allowedModes 클러스터에서 데이터 액세스에 대해 허용된 인증 모드입니다. 다음 중 어느 것을 포함하는 문자열 배열:
'마이크로소프트 엔트라ID'
'네이티브 인증'

백업 속성

이름 설명 가치

컴퓨트프로퍼티

이름 설명 가치
단계 각 계층이 가상 코어 및 메모리 크기에 매핑되는 클러스터에 할당할 컴퓨팅 계층입니다. 예제 값: 'M30', 'M40'. 문자열

DataApiProperties

이름 설명 가치
모드 Mongo Data API를 클러스터에 사용할 수 있는지 여부를 나타내는 모드입니다. '사용 안 함'
'사용'

고가용성속성

이름 설명 가치
타겟 모드 클러스터에 대해 요청된 대상 고가용성 모드입니다. '사용 안 함'
'사임존'
'ZoneRedundantPreferred'

MongoClusterProperties

이름 설명 가치
관리자 mongo 클러스터의 로컬 관리자 속성입니다. 관리자속성
인증 구성 클러스터에 대한 인증 구성입니다. AuthConfigProperties
백업 mongo 클러스터의 백업 속성입니다. 백업 속성
계산하다 mongo 클러스터의 컴퓨팅 속성입니다. computeProperties
크리에이션모드 mongo 클러스터를 만드는 모드입니다. 기본값
'지오레플리카'
'PointInTimeRestore'
'레플리카'
데이터 API mongo 클러스터의 데이터 API 속성입니다. DataApiProperties
고가용성 mongo 클러스터의 고가용성 속성입니다. 고가용성속성
미리보기기능 프라이빗 엔드포인트 연결 목록입니다. 다음 중 어느 것을 포함하는 문자열 배열:
'지오레플리카'
공공 네트워크 접근 이 mongo 클러스터에 대한 퍼블릭 엔드포인트 액세스가 허용되는지 여부입니다. '사용 안 함'
'사용'
replicaParameters 복제본 mongo 클러스터를 만들 매개 변수입니다. MongoClusterReplica매개변수
restoreParameters 지정 시간 복원 mongo 클러스터를 만드는 매개 변수입니다. MongoClusterRestoreParameters
서버 버전 Mongo DB 서버 버전입니다. 지정하지 않으면 기본적으로 사용 가능한 최신 버전으로 설정됩니다. 문자열
샤 딩 mongo 클러스터의 분할 속성입니다. ShardingProperties
저장소 mongo 클러스터의 스토리지 속성입니다. 스토리지속성

MongoClusterReplica매개변수

이름 설명 가치
소스 위치 원본 클러스터의 위치 string(필수)
sourceResourceId 복제 원본 클러스터의 ID입니다. string(필수)

MongoClusterRestoreParameters

이름 설명 가치
포인트인타임UTC MONgo 클러스터를 복원하기 위한 UTC 지정 시간 문자열
sourceResourceId 복원할 원본 클러스터를 찾는 리소스 ID 문자열

ShardingProperties

이름 설명 가치
샤드 카운트 클러스터에서 프로비전할 분할된 데이터베이스 수입니다. 정수 (int)

스토리지속성

이름 설명 가치
IOPS 각 서버에 할당된 스토리지의 IOPS입니다. 형식이 'PremiumSSDv2'인 경우에만 적용됩니다. 정수 (int)
크기Gb 각 서버에 할당된 데이터 디스크의 크기입니다. 정수 (int)
처리량 각 서버에 할당된 저장소의 처리량입니다. 형식이 'PremiumSSDv2'인 경우에만 적용됩니다. 정수 (int)
유형 클러스터 서버를 프로비저닝하는 데 사용할 스토리지 유형입니다. '프리미엄SSD'
'프리미엄SSDv2'

TrackedResource태그

이름 설명 가치

사용 예제

Terraform 샘플

Azure Cosmos DB를 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    = ["*"]
}