main.tf (108 lines of code) (raw):
resource "azurerm_cosmosdb_account" "this" {
location = var.location
name = var.name
offer_type = "Standard"
resource_group_name = var.resource_group_name
access_key_metadata_writes_enabled = var.access_key_metadata_writes_enabled
analytical_storage_enabled = var.analytical_storage_enabled
automatic_failover_enabled = var.automatic_failover_enabled
default_identity_type = local.normalized_cmk_default_identity_type
free_tier_enabled = var.free_tier_enabled
ip_range_filter = local.trimmed_ip_range_filter
is_virtual_network_filter_enabled = length(var.virtual_network_rules) > 0 ? true : false
key_vault_key_id = local.normalized_cmk_key_url
kind = length(var.mongo_databases) > 0 ? "MongoDB" : "GlobalDocumentDB"
local_authentication_disabled = length(var.sql_databases) > 0 ? var.local_authentication_disabled : false
minimal_tls_version = var.minimal_tls_version
mongo_server_version = length(var.mongo_databases) > 0 ? var.mongo_server_version : null
multiple_write_locations_enabled = var.backup.type == local.periodic_backup_policy ? var.multiple_write_locations_enabled : false
network_acl_bypass_for_azure_services = var.network_acl_bypass_for_azure_services
network_acl_bypass_ids = var.network_acl_bypass_resource_ids
partition_merge_enabled = var.partition_merge_enabled
public_network_access_enabled = var.public_network_access_enabled
tags = var.tags
consistency_policy {
consistency_level = var.consistency_policy.consistency_level
max_interval_in_seconds = var.consistency_policy.consistency_level == local.bounded_staleness_consistency ? var.consistency_policy.max_interval_in_seconds : null
max_staleness_prefix = var.consistency_policy.consistency_level == local.bounded_staleness_consistency ? var.consistency_policy.max_staleness_prefix : null
}
dynamic "geo_location" {
for_each = local.normalized_geo_locations
content {
failover_priority = geo_location.value.failover_priority
location = geo_location.value.location
zone_redundant = geo_location.value.zone_redundant
}
}
dynamic "analytical_storage" {
for_each = var.analytical_storage_config != null ? [1] : []
content {
schema_type = var.analytical_storage_config.schema_type
}
}
backup {
type = var.backup.type
interval_in_minutes = var.backup.type == local.periodic_backup_policy ? var.backup.interval_in_minutes : null
retention_in_hours = var.backup.type == local.periodic_backup_policy ? var.backup.retention_in_hours : null
storage_redundancy = var.backup.type == local.periodic_backup_policy ? var.backup.storage_redundancy : null
tier = var.backup.type == local.continuous_backup_policy ? var.backup.tier : null
}
dynamic "capabilities" {
for_each = var.capabilities
content {
name = capabilities.value.name
}
}
capacity {
total_throughput_limit = var.capacity.total_throughput_limit
}
dynamic "cors_rule" {
for_each = var.cors_rule != null ? [1] : []
content {
allowed_headers = var.cors_rule.allowed_headers
allowed_methods = var.cors_rule.allowed_methods
allowed_origins = var.cors_rule.allowed_origins
exposed_headers = var.cors_rule.exposed_headers
max_age_in_seconds = var.cors_rule.max_age_in_seconds
}
}
dynamic "identity" {
for_each = local.managed_identities.system_assigned_user_assigned
content {
type = identity.value.type
identity_ids = identity.value.user_assigned_resource_ids
}
}
dynamic "virtual_network_rule" {
for_each = var.virtual_network_rules
content {
id = virtual_network_rule.value.subnet_id
ignore_missing_vnet_service_endpoint = false
}
}
lifecycle {
precondition {
condition = var.backup.type == local.continuous_backup_policy && var.multiple_write_locations_enabled ? false : true
error_message = "Continuous backup mode and multiple write locations cannot be enabled together."
}
precondition {
condition = var.analytical_storage_enabled && var.partition_merge_enabled ? false : true
error_message = "Analytical storage and partition merge cannot be enabled together."
}
precondition {
condition = contains(var.capabilities, "EnableServerless") && length(local.normalized_geo_locations) > 1 ? false : true
error_message = "Serverless mode can only be enabled in a single region."
}
precondition {
condition = !(length(var.sql_databases) > 0 && length(var.mongo_databases) > 0)
error_message = "You can only create either SQL or MongoDB databases, not both."
}
}
}
resource "time_sleep" "wait_180_seconds_for_destroy" {
count = length(var.diagnostic_settings) > 0 ? 1 : 0
destroy_duration = "180s"
triggers = {
account_id = azurerm_cosmosdb_account.this.id
}
}