다음을 통해 공유


Microsoft.DocumentDB mongoClusters 2025-09-01

Bicep 리소스 정의

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

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

리소스 형식

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

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

속성 값

Microsoft.DocumentDB/mongoClusters

이름 Description 가치
identity 이 리소스에 할당된 관리 서비스 ID입니다. ManagedServiceIdentity
location 리소스가 있는 지리적 위치 string(필수)
이름 리소스 이름 string

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

관리자속성

이름 Description 가치
암호 관리자 암호입니다. string

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

AuthConfigProperties

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

백업 속성

이름 Description 가치

컴퓨트프로퍼티

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

CustomerManagedKeyEncryptionProperties

이름 Description 가치
keyEncryptionKeyIdentity 키 암호화 키에 액세스하는 데 사용되는 ID입니다. KeyEncryptionKeyIdentity
keyEncryptionKeyUrl 암호화에 사용되는 키 자격 증명 모음 키의 URI입니다. 문자열

DataApiProperties

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

EncryptionProperties

이름 Description 가치
customerManagedKeyEncryption 고객 관리형 키 암호화 설정. CustomerManagedKeyEncryption속성

고가용성속성

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

KeyEncryptionKeyIdentity

이름 Description 가치
identityType ID의 형식입니다. 'UserAssignedIdentity'만 지원됩니다. '사용자 할당 신원'
userAssignedIdentityResourceId 사용자가 할당한 ID 리소스 ID입니다. 문자열

ManagedServiceIdentity

이름 Description 가치
type 관리 서비스 ID의 유형입니다(SystemAssigned 및 UserAssigned 형식이 모두 허용되는 경우). 'None'
'SystemAssigned'
'시스템 할당, 사용자 할당'
'UserAssigned'(필수)
사용자 지정 ID 리소스와 연결된 사용자 할당 ID 집합입니다. userAssignedIdentities 사전 키는 '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName} 형식의 ARM 리소스 ID입니다. 사전 값은 요청에서 빈 개체({})일 수 있습니다. UserAssignedIdentities

MongoClusterProperties

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

MongoClusterReplica매개변수

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

MongoClusterRestoreParameters

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

ShardingProperties

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

스토리지속성

이름 Description 가치
크기Gb 각 서버에 할당된 데이터 디스크의 크기입니다. 정수 (int)
type 클러스터 서버를 프로비저닝하는 데 사용할 스토리지 유형입니다. '프리미엄SSD'
'프리미엄SSDv2'

TrackedResource태그

이름 Description 가치

UserAssignedIdentities

이름 Description 가치

UserAssignedIdentity

이름 Description 가치

사용 예제

Azure 확인된 모듈

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

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

ARM 템플릿 리소스 정의

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

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

리소스 형식

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

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

속성 값

Microsoft.DocumentDB/mongoClusters

이름 Description 가치
API버전 api 버전 '2025-09-01'
identity 이 리소스에 할당된 관리 서비스 ID입니다. ManagedServiceIdentity
location 리소스가 있는 지리적 위치 string(필수)
이름 리소스 이름 string

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

관리자속성

이름 Description 가치
암호 관리자 암호입니다. string

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

AuthConfigProperties

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

백업 속성

이름 Description 가치

컴퓨트프로퍼티

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

CustomerManagedKeyEncryptionProperties

이름 Description 가치
keyEncryptionKeyIdentity 키 암호화 키에 액세스하는 데 사용되는 ID입니다. KeyEncryptionKeyIdentity
keyEncryptionKeyUrl 암호화에 사용되는 키 자격 증명 모음 키의 URI입니다. 문자열

DataApiProperties

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

EncryptionProperties

이름 Description 가치
customerManagedKeyEncryption 고객 관리형 키 암호화 설정. CustomerManagedKeyEncryption속성

고가용성속성

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

KeyEncryptionKeyIdentity

이름 Description 가치
identityType ID의 형식입니다. 'UserAssignedIdentity'만 지원됩니다. '사용자 할당 신원'
userAssignedIdentityResourceId 사용자가 할당한 ID 리소스 ID입니다. 문자열

ManagedServiceIdentity

이름 Description 가치
type 관리 서비스 ID의 유형입니다(SystemAssigned 및 UserAssigned 형식이 모두 허용되는 경우). 'None'
'SystemAssigned'
'시스템 할당, 사용자 할당'
'UserAssigned'(필수)
사용자 지정 ID 리소스와 연결된 사용자 할당 ID 집합입니다. userAssignedIdentities 사전 키는 '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName} 형식의 ARM 리소스 ID입니다. 사전 값은 요청에서 빈 개체({})일 수 있습니다. UserAssignedIdentities

MongoClusterProperties

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

MongoClusterReplica매개변수

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

MongoClusterRestoreParameters

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

ShardingProperties

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

스토리지속성

이름 Description 가치
크기Gb 각 서버에 할당된 데이터 디스크의 크기입니다. 정수 (int)
type 클러스터 서버를 프로비저닝하는 데 사용할 스토리지 유형입니다. '프리미엄SSD'
'프리미엄SSDv2'

TrackedResource태그

이름 Description 가치

UserAssignedIdentities

이름 Description 가치

UserAssignedIdentity

이름 Description 가치

사용 예제

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

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

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

리소스 형식

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

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

속성 값

Microsoft.DocumentDB/mongoClusters

이름 Description 가치
identity 이 리소스에 할당된 관리 서비스 ID입니다. ManagedServiceIdentity
location 리소스가 있는 지리적 위치 string(필수)
이름 리소스 이름 string

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

관리자속성

이름 Description 가치
암호 관리자 암호입니다. string

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

AuthConfigProperties

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

백업 속성

이름 Description 가치

컴퓨트프로퍼티

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

CustomerManagedKeyEncryptionProperties

이름 Description 가치
keyEncryptionKeyIdentity 키 암호화 키에 액세스하는 데 사용되는 ID입니다. KeyEncryptionKeyIdentity
keyEncryptionKeyUrl 암호화에 사용되는 키 자격 증명 모음 키의 URI입니다. 문자열

DataApiProperties

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

EncryptionProperties

이름 Description 가치
customerManagedKeyEncryption 고객 관리형 키 암호화 설정. CustomerManagedKeyEncryption속성

고가용성속성

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

KeyEncryptionKeyIdentity

이름 Description 가치
identityType ID의 형식입니다. 'UserAssignedIdentity'만 지원됩니다. '사용자 할당 신원'
userAssignedIdentityResourceId 사용자가 할당한 ID 리소스 ID입니다. 문자열

ManagedServiceIdentity

이름 Description 가치
type 관리 서비스 ID의 유형입니다(SystemAssigned 및 UserAssigned 형식이 모두 허용되는 경우). 'None'
'SystemAssigned'
'시스템 할당, 사용자 할당'
'UserAssigned'(필수)
사용자 지정 ID 리소스와 연결된 사용자 할당 ID 집합입니다. userAssignedIdentities 사전 키는 '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName} 형식의 ARM 리소스 ID입니다. 사전 값은 요청에서 빈 개체({})일 수 있습니다. UserAssignedIdentities

MongoClusterProperties

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

MongoClusterReplica매개변수

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

MongoClusterRestoreParameters

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

ShardingProperties

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

스토리지속성

이름 Description 가치
크기Gb 각 서버에 할당된 데이터 디스크의 크기입니다. 정수 (int)
type 클러스터 서버를 프로비저닝하는 데 사용할 스토리지 유형입니다. '프리미엄SSD'
'프리미엄SSDv2'

TrackedResource태그

이름 Description 가치

UserAssignedIdentities

이름 Description 가치

UserAssignedIdentity

이름 Description 가치

사용 예제

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    = ["*"]
}