demo_solution/modules/repo_terraform.azurerm.app_gtw/main.tf (229 lines of code) (raw):
# Get data of Resource Group
data "azurerm_resource_group" "appgtw" {
count = var.location == null ? 1 : 0
name = var.resource_group_name
}
# Get SSL certificate data from the Azure Key Vault
data "azurerm_key_vault" "ssl_cert" {
count = length(var.ssl_certificates)
name = var.ssl_certificates[count.index].kv_name
resource_group_name = lookup(var.ssl_certificates[count.index], "kv_rg_name", var.resource_group_name)
}
# Get Trusted Root Certificate data from the Azure Key Vault
data "azurerm_key_vault" "trust_ssl_cert" {
count = length(var.trusted_root_certificate)
name = var.trusted_root_certificate[count.index].kv_name
resource_group_name = lookup(var.trusted_root_certificate[count.index], "kv_rg_name", var.resource_group_name)
}
# Get certificate data from key vault
data "azurerm_key_vault_certificate" "ssl_certificate" {
count = length(var.ssl_certificates)
name = var.ssl_certificates[count.index].kv_cert_name
key_vault_id = data.azurerm_key_vault.ssl_cert[count.index].id
}
# Get Trusted Root Certificate data from key vault
data "azurerm_key_vault_certificate" "trusted_root_certificate" {
count = length(var.trusted_root_certificate)
name = var.trusted_root_certificate[count.index].kv_cert_name
key_vault_id = data.azurerm_key_vault.trust_ssl_cert[count.index].id
}
# Get subnet to associate with Azure firewall
data "azurerm_subnet" "subnet_associate" {
count = length(var.gateway_ip_configurations)
name = lookup(var.gateway_ip_configurations[count.index], "subnet_name", "myAGSubnet")
virtual_network_name = var.gateway_ip_configurations[count.index].vnet_name
resource_group_name = lookup(var.gateway_ip_configurations[count.index], "vnet_rg_name", var.resource_group_name)
}
# Get public IP data
data "azurerm_public_ip" "public_ip" {
count = length(var.frontend_ip_configurations)
name = var.frontend_ip_configurations[count.index].public_ip_name
resource_group_name = lookup(var.frontend_ip_configurations[count.index], "public_ip_rg_name", var.resource_group_name)
}
# Create application gateway
resource "azurerm_application_gateway" "app_gtw" {
name = var.name
resource_group_name = var.resource_group_name
location = var.location == null ? data.azurerm_resource_group.appgtw[0].location : var.location
zones = var.zones
enable_http2 = var.enable_http2
tags = var.tags
dynamic "identity" {
for_each = var.identity_ids != null ? [1] : []
content {
type = "UserAssigned"
identity_ids = var.identity_ids
}
}
dynamic "ssl_certificate" {
for_each = length(data.azurerm_key_vault_certificate.ssl_certificate) != 0 ? [1] : []
content {
name = data.azurerm_key_vault_certificate.ssl_certificate[0].name
key_vault_secret_id = data.azurerm_key_vault_certificate.ssl_certificate[0].secret_id
}
}
sku {
name = lookup(var.sku, "name")
tier = lookup(var.sku, "tier")
capacity = lookup(var.sku, "capacity", null)
}
dynamic "autoscale_configuration" {
for_each = var.autoscale_configuration != null ? [1] : []
content {
min_capacity = lookup(var.autoscale_configuration, "min_capacity")
max_capacity = lookup(var.autoscale_configuration, "max_capacity")
}
}
dynamic "gateway_ip_configuration" {
for_each = var.gateway_ip_configurations
content {
name = gateway_ip_configuration.value["name"]
subnet_id = data.azurerm_subnet.subnet_associate[index(var.gateway_ip_configurations, gateway_ip_configuration.value)].id
}
}
dynamic "frontend_port" {
for_each = length(var.frontend_ports) != 0 ? var.frontend_ports : []
content {
name = frontend_port.value.name
port = frontend_port.value.port
}
}
dynamic "frontend_ip_configuration" {
for_each = var.frontend_ip_configurations
content {
name = frontend_ip_configuration.value["name"]
public_ip_address_id = data.azurerm_public_ip.public_ip[index(var.frontend_ip_configurations, frontend_ip_configuration.value)].id
}
}
dynamic "trusted_root_certificate" {
for_each = var.trusted_root_certificate
iterator = trust
content {
name = trust.value.kv_cert_name
data = lookup(trust.value, "data", null)
key_vault_secret_id = lookup(data.azurerm_key_vault_certificate.trusted_root_certificate[index(var.trusted_root_certificate, trust.value)], "secret_id", null)
}
}
# The following dynamic blocks intended to use configurations from 'app_definitions' variable. It only supports request routing rules with defined backend.
# To set request routing rules with different configuration type, create one more instance of the following blocks and configure new variable with appropriate configuration.
# Investigation required
dynamic "backend_address_pool" {
for_each = length(var.app_definitions) != 0 ? var.app_definitions : []
content {
name = lookup(backend_address_pool.value.backend_address_pool, "name", "${backend_address_pool.value["app_suffix"]}-apbp")
fqdns = lookup(backend_address_pool.value.backend_address_pool, "fqdns", [])
ip_addresses = lookup(backend_address_pool.value.backend_address_pool, "ip_addresses", [])
}
}
dynamic "backend_http_settings" {
for_each = length(var.app_definitions) != 0 ? var.app_definitions : []
content {
name = "${backend_http_settings.value["app_suffix"]}-apht"
cookie_based_affinity = lookup(backend_http_settings.value.backend_http_settings, "cookie_based_affinity", "Disabled")
affinity_cookie_name = lookup(backend_http_settings.value.backend_http_settings, "affinity_cookie_name", null)
path = lookup(backend_http_settings.value.backend_http_settings, "path", null)
port = lookup(backend_http_settings.value.backend_http_settings, "port", null)
probe_name = lookup(backend_http_settings.value.backend_http_settings, "probe_name", null)
protocol = lookup(backend_http_settings.value.backend_http_settings, "protocol", null)
request_timeout = lookup(backend_http_settings.value.backend_http_settings, "request_timeout", 30)
host_name = lookup(backend_http_settings.value.backend_http_settings, "pick_host_name_from_backend_address", false) == true ? null : lookup(backend_http_settings.value.backend_http_settings, "host_name", null)
pick_host_name_from_backend_address = lookup(backend_http_settings.value.backend_http_settings, "pick_host_name_from_backend_address", false)
trusted_root_certificate_names = lookup(backend_http_settings.value.backend_http_settings, "trusted_root_certificate_names", [])
dynamic "authentication_certificate" {
for_each = { for cert in lookup(backend_http_settings.value.backend_http_settings, "authentication_certificate", []) : cert.name => cert }
content {
name = lookup(authentication_certificate.value, "name", null)
}
}
dynamic "connection_draining" {
for_each = lookup(backend_http_settings.value.backend_http_settings, "connection_draining", null) != null ? [1] : []
content {
enabled = lookup(connection_draining.value, "enabled", false)
drain_timeout_sec = lookup(connection_draining.value, "drain_timeout_sec", null)
}
}
}
}
dynamic "http_listener" {
for_each = length(var.app_definitions) != 0 ? var.app_definitions : []
content {
name = "${http_listener.value["app_suffix"]}-https-apls"
frontend_ip_configuration_name = lookup(http_listener.value.http_listener, "frontend_ip_configuration_name", null)
frontend_port_name = lookup(http_listener.value.http_listener, "frontend_port_name", null)
host_names = var.sku.tier == "Standard" ? null : lookup(http_listener.value.http_listener, "host_names", [])
protocol = lookup(http_listener.value.http_listener, "protocol", null)
require_sni = lookup(http_listener.value.http_listener, "require_sni", false)
ssl_certificate_name = lookup(http_listener.value.http_listener, "ssl_certificate_name", null)
firewall_policy_id = lookup(http_listener.value.http_listener, "firewall_policy_id", null)
ssl_profile_name = lookup(http_listener.value.http_listener, "ssl_profile_name", null)
dynamic "custom_error_configuration" {
for_each = { for error in lookup(http_listener.value.http_listener, "custom_error_configuration", []) : error.status_code => error }
content {
status_code = lookup(custom_error_configuration.value, "status_code", null)
custom_error_page_url = lookup(custom_error_configuration.value, "custom_error_page_url", null)
}
}
}
}
dynamic "request_routing_rule" {
for_each = length(var.app_definitions) != 0 ? var.app_definitions : []
content {
name = "${request_routing_rule.value["app_suffix"]}-aprl"
rule_type = lookup(request_routing_rule.value.request_routing_rule, "rule_type", "Basic")
http_listener_name = "${request_routing_rule.value["app_suffix"]}-https-apls"
backend_address_pool_name = lookup(request_routing_rule.value.request_routing_rule, "rule_type", "Basic") == "Basic" ? lookup(request_routing_rule.value.request_routing_rule, "backend_address_pool_name", null) : null
backend_http_settings_name = lookup(request_routing_rule.value.request_routing_rule, "rule_type", "Basic") == "Basic" ? "${request_routing_rule.value["app_suffix"]}-apht" : null
redirect_configuration_name = lookup(request_routing_rule.value.request_routing_rule, "rule_type", "Basic") == "Basic" ? lookup(request_routing_rule.value.request_routing_rule, "redirect_configuration_name", null) : null
rewrite_rule_set_name = lookup(request_routing_rule.value.request_routing_rule, "rule_type", "Basic") == "Basic" ? lookup(request_routing_rule.value.request_routing_rule, "rewrite_rule_set_name", null) : null
priority = lookup(request_routing_rule.value.request_routing_rule, "priority", null) != null ? lookup(request_routing_rule.value.request_routing_rule, "priority", null) + length(var.app_definitions) + 100 : null
}
}
dynamic "probe" {
for_each = try(var.app_definitions.probe, null) != null ? var.app_definitions : []
content {
name = lookup(probe.value.probe, "name", null) != null ? lookup(probe.value.probe, "name", null) : "${probe.value["app_suffix"]}-aphp"
interval = lookup(probe.value.probe, "interval", 30)
protocol = lookup(probe.value.probe, "protocol", null)
path = lookup(probe.value.probe, "path", null)
timeout = lookup(probe.value.probe, "timeout", 60)
unhealthy_threshold = lookup(probe.value.probe, "unhealthy_threshold", 3)
host = lookup(probe.value.probe, "host", null)
port = lookup(probe.value.probe, "port", null)
pick_host_name_from_backend_http_settings = lookup(probe.value.probe, "pick_host_name_from_backend_http_settings", false)
minimum_servers = lookup(probe.value.probe, "minimum_servers", null)
dynamic "match" {
for_each = lookup(probe.value.probe, "match", null) != null ? [1] : []
content {
body = lookup(probe.value.probe.match, "body", null)
status_code = lookup(probe.value.probe.match, "status_code", [])
}
}
}
}
dynamic "waf_configuration" {
for_each = var.waf_configuration != null ? [var.waf_configuration] : []
iterator = waf
content {
enabled = waf.value.enabled
firewall_mode = lookup(waf.value, "firewall_mode", "Prevention")
rule_set_type = lookup(waf.value, "rule_set_type", "OWASP")
rule_set_version = lookup(waf.value, "rule_set_version", "3.2")
}
}
}
# Manages a diagnostic setting for created appgtw
resource "azurerm_monitor_diagnostic_setting" "this" {
count = var.diagnostic_setting == null ? 0 : 1
name = var.diagnostic_setting.name
log_analytics_workspace_id = var.diagnostic_setting.log_analytics_workspace_id
target_resource_id = azurerm_application_gateway.app_gtw.id
storage_account_id = var.diagnostic_setting.storage_account_id
eventhub_name = var.diagnostic_setting.eventhub_name
eventhub_authorization_rule_id = var.diagnostic_setting.eventhub_authorization_rule_id
dynamic "enabled_log" {
for_each = var.diagnostic_setting.log_category != null ? toset(var.diagnostic_setting.log_category) : []
content {
category = enabled_log.key
}
}
dynamic "enabled_log" {
for_each = var.diagnostic_setting.log_category_group != null ? toset(var.diagnostic_setting.log_category_group) : []
content {
category_group = enabled_log.key
}
}
dynamic "metric" {
for_each = var.diagnostic_setting.metric != null ? toset(var.diagnostic_setting.metric) : []
content {
category = metric.key
}
}
}