Hi there,
I seem to have an issue and hoping someone can point me in the right direction when it comes to using templatefile to create an map(object) variable.
I have 3 environments. I am trying to create deploy to all 3 environments (in the same sub) for each GW listener we have (around 10)
Main TF looks like this:
data "azurerm_application_gateway" "gw" {
name = var.application_gateway_name
resource_group_name = data.azurerm_resource_group.rg.name
}
locals {
https_listener_names = [for listener in data.azurerm_application_gateway.gw.http_listener : listener.name]
waf_rules_json = templatefile("./template.j2.tpl", {
listeners = local.https_listener_names
environment_domain = "domain"
})
waf_rules = jsondecode(trimspace(local.waf_rules_json))
waf_rules_map = merge([for rule in local.waf_rules : rule]...)
}
module "waf_policies" {
source = "../modules/az_waf_policies"
resource_group_name = data.azurerm_resource_group.rg.name
location = data.azurerm_resource_group.rg.location
application_gateway_name = data.azurerm_application_gateway.gw
policy_mode = var.policy_mode
custom_listener_rules = local.waf_rules_map
}
A snippet of my WAF policy which is just a generic for_each
resource "azurerm_web_application_firewall_policy" "gw" {
for_each = {
for listener in var.gw_application_gateway_name.http_listener : listener.name => merge(
{
mode = var.policy_mode
managed_rule_type = "OWASP"
rule_version = "3.2"
custom_rules = []
rule_group_exclusions = []
rule_group_overrides = []
},
lookup(var.custom_listener_rules, listener.name, {
mode = var.policy_mode
managed_rule_type = "OWASP"
rule_version = "3.2"
custom_rules = []
rule_group_exclusions = []
rule_group_overrides = []
})
)
}
name = "${each.key}--waf-policy"
resource_group_name = var.resource_group_name
location = var.location
...
The templatefile looks like:
{
"custom_listener_rules": {
%{ for listener in listeners }
"${listener}-https-local": {
"custom_rules": [
{
"action": "Allow",
"match_conditions": [
{
"match_values": [
"domain1",
"domain2",
"domain3"
],
"operator": "Contains",
"variable_name": "RequestUri"
},
{
"match_values": [
"https://${environment_domain}/search"
],
"operator": "Equal",
"selector": "Referer",
"variable_name": "RequestHeaders"
}
],
"name": "Domains",
"priority": 1,
"rule_type": "MatchRule"
},
...
When i run my terraform, i am getting a var.custom_listener_rules - No value for requred Variable. So it’s not passing it in. Any ideas?
Thanks.