main.tf (198 lines of code) (raw):
resource "azurerm_api_management" "this" {
location = var.location
name = var.name
publisher_email = var.publisher_email
publisher_name = var.publisher_name
resource_group_name = var.resource_group_name
sku_name = var.sku_name
# Client certificate settings
client_certificate_enabled = var.client_certificate_enabled
# Gateway settings
gateway_disabled = var.gateway_disabled
min_api_version = var.min_api_version
# Notification sender email
notification_sender_email = var.notification_sender_email
# Public IP and network access settings
public_ip_address_id = var.public_ip_address_id
public_network_access_enabled = var.public_network_access_enabled
tags = var.tags
virtual_network_type = var.virtual_network_type
# Availability Zones
zones = var.zones
# Additional locations
dynamic "additional_location" {
for_each = var.additional_location
content {
location = additional_location.value.location
capacity = additional_location.value.capacity
gateway_disabled = additional_location.value.gateway_disabled
public_ip_address_id = additional_location.value.public_ip_address_id
zones = additional_location.value.zones
dynamic "virtual_network_configuration" {
for_each = additional_location.value.virtual_network_configuration != null ? [additional_location.value.virtual_network_configuration] : []
content {
subnet_id = virtual_network_configuration.value.subnet_id
}
}
}
}
# Certificates
dynamic "certificate" {
for_each = var.certificate
content {
encoded_certificate = certificate.value.encoded_certificate
store_name = certificate.value.store_name
certificate_password = certificate.value.certificate_password
}
}
# Delegation settings
dynamic "delegation" {
for_each = var.delegation != null ? [var.delegation] : []
content {
subscriptions_enabled = delegation.value.subscriptions_enabled
url = delegation.value.url
user_registration_enabled = delegation.value.user_registration_enabled
validation_key = delegation.value.validation_key
}
}
# Hostname configuration
dynamic "hostname_configuration" {
for_each = var.hostname_configuration != null ? [var.hostname_configuration] : []
content {
dynamic "developer_portal" {
for_each = hostname_configuration.value.developer_portal
content {
host_name = developer_portal.value.host_name
certificate = developer_portal.value.certificate
certificate_password = developer_portal.value.certificate_password
key_vault_id = developer_portal.value.key_vault_id
negotiate_client_certificate = developer_portal.value.negotiate_client_certificate
ssl_keyvault_identity_client_id = developer_portal.value.ssl_keyvault_identity_client_id
}
}
dynamic "management" {
for_each = hostname_configuration.value.management
content {
host_name = management.value.host_name
certificate = management.value.certificate
certificate_password = management.value.certificate_password
key_vault_id = management.value.key_vault_id
negotiate_client_certificate = management.value.negotiate_client_certificate
ssl_keyvault_identity_client_id = management.value.ssl_keyvault_identity_client_id
}
}
dynamic "portal" {
for_each = hostname_configuration.value.portal
content {
host_name = portal.value.host_name
certificate = portal.value.certificate
certificate_password = portal.value.certificate_password
key_vault_id = portal.value.key_vault_id
negotiate_client_certificate = portal.value.negotiate_client_certificate
ssl_keyvault_identity_client_id = portal.value.ssl_keyvault_identity_client_id
}
}
dynamic "proxy" {
for_each = hostname_configuration.value.proxy
content {
host_name = proxy.value.host_name
certificate = proxy.value.certificate
certificate_password = proxy.value.certificate_password
default_ssl_binding = proxy.value.default_ssl_binding
key_vault_id = proxy.value.key_vault_id
negotiate_client_certificate = proxy.value.negotiate_client_certificate
ssl_keyvault_identity_client_id = proxy.value.ssl_keyvault_identity_client_id
}
}
dynamic "scm" {
for_each = hostname_configuration.value.scm
content {
host_name = scm.value.host_name
certificate = scm.value.certificate
certificate_password = scm.value.certificate_password
key_vault_id = scm.value.key_vault_id
negotiate_client_certificate = scm.value.negotiate_client_certificate
ssl_keyvault_identity_client_id = scm.value.ssl_keyvault_identity_client_id
}
}
}
}
# Identity settings
dynamic "identity" {
for_each = local.managed_identities.system_assigned_user_assigned
content {
type = identity.value.type
identity_ids = identity.value.user_assigned_resource_ids
}
}
# HTTP protocol settings
dynamic "protocols" {
for_each = var.protocols != null ? [var.protocols] : []
content {
enable_http2 = protocols.value.enable_http2
}
}
# Security settings
dynamic "security" {
for_each = var.security != null ? [var.security] : []
content {
enable_backend_ssl30 = security.value.enable_backend_ssl30
enable_backend_tls10 = security.value.enable_backend_tls10
enable_backend_tls11 = security.value.enable_backend_tls11
enable_frontend_ssl30 = security.value.enable_frontend_ssl30
enable_frontend_tls10 = security.value.enable_frontend_tls10
enable_frontend_tls11 = security.value.enable_frontend_tls11
tls_ecdhe_ecdsa_with_aes128_cbc_sha_ciphers_enabled = security.value.tls_ecdhe_ecdsa_with_aes128_cbc_sha_ciphers_enabled
tls_ecdhe_ecdsa_with_aes256_cbc_sha_ciphers_enabled = security.value.tls_ecdhe_ecdsa_with_aes256_cbc_sha_ciphers_enabled
tls_ecdhe_rsa_with_aes128_cbc_sha_ciphers_enabled = security.value.tls_ecdhe_rsa_with_aes128_cbc_sha_ciphers_enabled
tls_ecdhe_rsa_with_aes256_cbc_sha_ciphers_enabled = security.value.tls_ecdhe_rsa_with_aes256_cbc_sha_ciphers_enabled
tls_rsa_with_aes128_cbc_sha256_ciphers_enabled = security.value.tls_rsa_with_aes128_cbc_sha256_ciphers_enabled
tls_rsa_with_aes128_cbc_sha_ciphers_enabled = security.value.tls_rsa_with_aes128_cbc_sha_ciphers_enabled
tls_rsa_with_aes128_gcm_sha256_ciphers_enabled = security.value.tls_rsa_with_aes128_gcm_sha256_ciphers_enabled
tls_rsa_with_aes256_cbc_sha256_ciphers_enabled = security.value.tls_rsa_with_aes256_cbc_sha256_ciphers_enabled
tls_rsa_with_aes256_cbc_sha_ciphers_enabled = security.value.tls_rsa_with_aes256_cbc_sha_ciphers_enabled
tls_rsa_with_aes256_gcm_sha384_ciphers_enabled = security.value.tls_rsa_with_aes256_gcm_sha384_ciphers_enabled
triple_des_ciphers_enabled = security.value.triple_des_ciphers_enabled
}
}
# Sign-in settings
dynamic "sign_in" {
for_each = var.sign_in != null ? [var.sign_in] : []
content {
enabled = sign_in.value.enabled
}
}
# Sign-up settings
dynamic "sign_up" {
for_each = var.sign_up != null ? [var.sign_up] : []
content {
enabled = sign_up.value.enabled
terms_of_service {
consent_required = sign_up.value.terms_of_service.consent_required
enabled = sign_up.value.terms_of_service.enabled
text = sign_up.value.terms_of_service.text
}
}
}
# Tenant access settings
dynamic "tenant_access" {
for_each = var.tenant_access != null ? [var.tenant_access] : []
content {
enabled = tenant_access.value.enabled
}
}
# This implementation uses a dynamic block with for_each to conditionally create the virtual_network_configuration block only when virtual_network_type is either "Internal" or "External".
# If the type is "None", the block won't be included in the resource.
dynamic "virtual_network_configuration" {
for_each = contains(["Internal", "External"], var.virtual_network_type) ? [1] : []
content {
subnet_id = var.virtual_network_subnet_id
}
}
lifecycle {
# This prevents errors when deleting products with subscriptions
create_before_destroy = true
# Optional: If you want to skip destroying default products
ignore_changes = [
# product
]
}
}
# Lock resource
resource "azurerm_management_lock" "this" {
count = var.lock != null ? 1 : 0
lock_level = var.lock.kind
name = coalesce(var.lock.name, "lock-${var.lock.kind}")
scope = azurerm_api_management.this.id
notes = var.lock.kind == "CanNotDelete" ? "Cannot delete resource or child resources." : "Cannot modify the resource or its children."
}
# Role assignments
resource "azurerm_role_assignment" "this" {
for_each = var.role_assignments
principal_id = each.value.principal_id
scope = azurerm_api_management.this.id
condition = each.value.condition
condition_version = each.value.condition_version
delegated_managed_identity_resource_id = each.value.delegated_managed_identity_resource_id
role_definition_id = strcontains(lower(each.value.role_definition_id_or_name), lower(local.role_definition_resource_substring)) ? each.value.role_definition_id_or_name : null
role_definition_name = strcontains(lower(each.value.role_definition_id_or_name), lower(local.role_definition_resource_substring)) ? null : each.value.role_definition_id_or_name
skip_service_principal_aad_check = each.value.skip_service_principal_aad_check
}