Construye una lista de objetos a partir de múltiples instancias de un módulo de terraform.
Estoy tratando de descubrir cómo convertir múltiples instancias de módulos en un mapa de objetos. Tengo un mapa de “Customer” (Cliente). Luego quiero obtener la IP pública de cada uno de los clientes creados para construir una lista de reglas de firewall. El módulo de Customer tiene muchas salidas, incluyendo “name” e “ipAddress”. El módulo de AzureSQLFirewall espera un mapa de objetos con los atributos “name” e “ipAddress”.
Módulo Principal:
module "Customer"{
for_each = var.customers
source = "./customer"
customerName = "${each.value["name"]}"
}
module "AzureSQLFirewall" {
source = "./azureSQLFirewall"
azureSQLServerID = module.BaseInfrastructure.sql_server_id
azureSQLAllowedIPs = { for v in module.Customer:
{
name = v.name,
ipAddress = v.public_ipaddress
}
}
}
AzureSQLFirewall.tf:
terraform {
required_version = ">= 0.14.9"
}
resource "azurerm_mssql_firewall_rule" "azureSQLFirewall" {
for_each = var.azureSQLAllowedIPs
name = each.value.name
server_id = var.azureSQLServerID
start_ip_address = each.value.ipAddress
end_ip_address = each.value.ipAddress
}
variable "azureSQLServerID" {
type = string
}
variable "azureSQLAllowedIPs" {
type = map(object({
name = string
ipAddress = string
}))
}
EDICIÓN: Resulta que estaba bastante cerca:
azureSQLAllowedIPs = { for k,v in module.Customer: k => {
name = v.customerName,
ipAddress = v.public_ip
}
}
davy.ai
Para convertir múltiples instancias de módulo en un mapa de objetos, puedes usar la expresión
for
en tu módulo principal para crear un mapa de objetosCustomer
. Una vez que tengas este mapa, puedes usar otra expresiónfor
para recorrer cadaCustomer
y extraer las salidasname
ypublic_ip_address
para crear un mapa de objetos que el móduloAzureSQLFirewall
pueda consumir.Aquí tienes un ejemplo de fragmento de código:
En este ejemplo, la expresión
for
crea uncustomer_map
de todas las instancias del móduloCustomer
. Luego, se crea el mapaallowed_ips
recorriendo cada par clave-valor encustomer_map
y extrayendo las salidasname
ypublic_ip_address
en un nuevo objeto.El mapa resultante
allowed_ips
puede pasarse al móduloAzureSQLFirewall
como una variable, como se muestra en el ejemplo. Ten en cuenta que la variableazureSQLAllowedIPs
en el móduloAzureSQLFirewall
tiene un tipo demap(object(...))
para que coincida con el formato del mapaallowed_ips
.Con esta configuración, el módulo
AzureSQLFirewall
puede usar el metargumentofor_each
para crear un recursoazurerm_mssql_firewall_rule
para cada objeto en el mapaallowed_ips
.