demo_solution/base_layer/main.tf (173 lines of code) (raw):
# 001_mg
# Deploy Managenment Groups
# The user account that is used by Terraform to manage this module should have at least
# "Management Group Contributor" and one of "User Access Administrator" or "Owner" roles
# on the Tenant Root Management Group level. These rights on management group needs
# to delete management group correctly and move subscriptions into Tenant Root Management Group.
module "mg_lvl_0" {
for_each = { for group in var.mg_list_lvl_0 : group.name => group }
source = "../modules/repo_terraform.azurerm.mg"
name = each.value.name
display_name = each.value.display_name
role_assignment_list = lookup(each.value, "role_assignment_list", [])
subscription_association_list = try(each.value.subscription_association_list, [])
}
module "mg_lvl_1" {
depends_on = [module.mg_lvl_0]
for_each = { for group in var.mg_list_lvl_1 : group.name => group }
source = "../modules/repo_terraform.azurerm.mg"
name = each.value.name
display_name = each.value.display_name
parent_mg_id = "/providers/Microsoft.Management/managementGroups/${each.value.parent_mg_name}"
role_assignment_list = lookup(each.value, "role_assignment_list", [])
subscription_association_list = try(each.value.subscription_association_list, [])
}
module "mg_lvl_2" {
depends_on = [module.mg_lvl_1]
for_each = { for group in var.mg_list_lvl_2 : group.name => group }
source = "../modules/repo_terraform.azurerm.mg"
name = each.value.name
display_name = each.value.display_name
parent_mg_id = "/providers/Microsoft.Management/managementGroups/${each.value.parent_mg_name}"
role_assignment_list = lookup(each.value, "role_assignment_list", [])
subscription_association_list = try(each.value.subscription_association_list, [])
}
module "mg_lvl_3" {
depends_on = [module.mg_lvl_2]
for_each = { for group in var.mg_list_lvl_3 : group.name => group }
source = "../modules/repo_terraform.azurerm.mg"
name = each.value.name
display_name = each.value.display_name
parent_mg_id = "/providers/Microsoft.Management/managementGroups/${each.value.parent_mg_name}"
role_assignment_list = lookup(each.value, "role_assignment_list", [])
subscription_association_list = try(each.value.subscription_association_list, [])
}
# 004_policyinitiative
# Deploy Policy initiatives
module "policy_initiative" {
depends_on = [
module.mg_lvl_3
]
source = "../modules/repo_terraform.azurerm.policy_initiative"
for_each = { for policy_initiative in var.policy_initiatives : policy_initiative.initiative_name => policy_initiative }
scope = lookup(each.value, "scope", "subscription")
initiative_name = each.value.initiative_name
description = lookup(each.value, "description", null)
policy_type = lookup(each.value, "policy_type", "BuiltIn")
display_name = lookup(each.value, "display_name", each.value.initiative_name)
management_group_name = lookup(each.value, "management_group_name", null)
policy_definition_list = lookup(each.value, "policy_definition_list", [])
initiatives_store = lookup(each.value, "initiatives_store", null)
assignment_location = lookup(each.value, "location", null)
assignment_name = lookup(each.value, "assignment_name", null)
assignment_parameters = lookup(each.value, "parameters", null)
assignment_exemptions = lookup(each.value, "assignment_exemptions", null)
assignment_exclusions = lookup(each.value, "assignment_exclusions", [])
enforce = lookup(each.value, "enforce", false)
create_set_definition = lookup(each.value, "create_set_definition", false)
identity = lookup(each.value, "identity", { type = "SystemAssigned"
identity_ids = null })
}
# 005_rg
# Deploy Resource Groups
module "rg" {
source = "../modules/repo_terraform.azurerm.rg"
depends_on = [
module.policy_initiative
]
for_each = { for rg in var.rg_list : rg.name => rg }
name = each.key
location = each.value.location
tags = each.value.tags
}
module "rg_lock" {
source = "../modules/repo_terraform.azurerm.lock"
depends_on = [
module.rg
]
for_each = { for rg in var.rg_list : rg.name => rg if try(rg.lock_name, null) != null }
resource_id = module.rg[each.key].id
lock_name = each.value.lock_name
lock_level = each.value.lock_level
notes = each.value.lock_notes
}
# 006_useridentity
# Create user-assigned managed identities
module "user_identity" {
source = "../modules/repo_terraform.azurerm.user_assigned_identity"
depends_on = [
module.rg
]
for_each = { for id in var.user_identities : id.name => id }
name = each.value.name
location = each.value.location
rg_name = each.value.rg_name
tags = lookup(each.value, "tags", {})
}
# 010_loganalytics
# Create Log Analytics with Storage Accounts and RBAC
module "storage_account_la" {
source = "../modules/repo_terraform.azurerm.storage_account"
for_each = { for logAnalytic in var.logAnalytics : logAnalytic.name => logAnalytic }
depends_on = [
module.rg
]
# storage_name = basename(each.value.diagnostic_setting.storage_account_id)
storage_name = each.value.storage_account_name
rg_name = each.value.rg_name
allow_nested_items_to_be_public = false
# to avoid cyclic error while creating log analytics, diagnostic_setting for storage account must be null
# or link to existing log analytics
diagnostic_setting = null
tags = lookup(each.value, "tags", {})
}
module "logAnalytics" {
source = "../modules/repo_terraform.azurerm.log_analytics"
for_each = { for logAnalytic in var.logAnalytics : logAnalytic.name => logAnalytic }
depends_on = [
module.rg,
module.storage_account_la
]
name = each.value.name
rg_name = each.value.rg_name
pricing_tier = each.value.pricing_tier
retention_in_days = each.value.retention_in_days
location = try(each.value.location, null)
la_solutions = try(each.value.la_solutions, [])
activity_log_subs = lookup(each.value, "activity_log_subs", [])
diagnostic_setting = try(each.value.diagnostic_setting, null) != null ? {
name = each.value.diagnostic_setting.name
storage_account_id = module.storage_account_la[each.value.name].storage_account_id
log_category_group = each.value.diagnostic_setting.log_category_group
metric = each.value.diagnostic_setting.metric
} : null
tags = lookup(each.value, "tags", {})
}
module "la_rbac" {
source = "../modules/repo_terraform.azurerm.rbac"
depends_on = [
module.logAnalytics
]
for_each = { for logAnalytic in var.logAnalytics : logAnalytic.name => logAnalytic if try(logAnalytic.monitoring_contributor_assigment_ids, {}) != {} }
definition = null
assignment = {
scope = module.logAnalytics[each.value.name].id
description = each.value.assignment_description
role_definition_name = each.value.assignment_role_definition_name
}
principal_id = each.value.monitoring_contributor_assigment_ids
}
# 025_vnet
# Creating a Virtual Networks
module "vnet" {
source = "../modules/repo_terraform.azurerm.vnet"
depends_on = [
module.rg,
module.logAnalytics
]
for_each = { for vnet in var.vnets : vnet.vnet_name => vnet }
vnet_name = each.value.vnet_name
rg_name = each.value.rg_name
location = lookup(each.value, "location", null)
address_space = lookup(each.value, "address_space", ["10.0.0.0/16"])
ddos_protection_plan_name = lookup(each.value, "ddos_protection_plan_name", null)
dns_servers = lookup(each.value, "dns_servers", [])
subnets = lookup(each.value, "subnets", [])
diagnostic_setting = lookup(each.value, "diagnostic_setting", null)
tags = lookup(each.value, "tags", {})
}
module "vnet_rbac" {
source = "../modules/repo_terraform.azurerm.rbac"
depends_on = [
module.vnet
]
for_each = { for vnet in var.vnets : vnet.vnet_name => vnet if length(try(vnet.network_contributor_assigment_ids, [])) != 0 }
definition = null
assignment = {
scope = module.vnet[each.value.vnet_name].vnet_id
description = "Business LZ SPN assignment to configure peering"
role_definition_name = "Network Contributor"
}
principal_id = each.value.network_contributor_assigment_ids
}