es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
                         } 
                       }
Tags:  

Answer

  1. Avatar for 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 objetos Customer. Una vez que tengas este mapa, puedes usar otra expresión for para recorrer cada Customer y extraer las salidas name y public_ip_address para crear un mapa de objetos que el módulo AzureSQLFirewall pueda consumir.

    Aquí tienes un ejemplo de fragmento de código:

    module "Customer" {
      for_each      = var.customers
      source        = "./customer"
      customerName  = each.value["name"]
    }
    
    locals {
      customer_map = { for k, v in module.Customer : k => v }
      allowed_ips  = { for k, v in local.customer_map : k => { 
        name      = v.name
        ipAddress = v.public_ip_address 
      }}
    }
    
    module "AzureSQLFirewall" {
      source               = "./azureSQLFirewall"
      azureSQLServerID     = module.BaseInfrastructure.sql_server_id
      azureSQLAllowedIPs   = local.allowed_ips
    }
    

    En este ejemplo, la expresión for crea un customer_map de todas las instancias del módulo Customer. Luego, se crea el mapa allowed_ips recorriendo cada par clave-valor en customer_map y extrayendo las salidas name y public_ip_address en un nuevo objeto.

    El mapa resultante allowed_ips puede pasarse al módulo AzureSQLFirewall como una variable, como se muestra en el ejemplo. Ten en cuenta que la variable azureSQLAllowedIPs en el módulo AzureSQLFirewall tiene un tipo de map(object(...)) para que coincida con el formato del mapa allowed_ips.

    Con esta configuración, el módulo AzureSQLFirewall puede usar el metargumento for_each para crear un recurso azurerm_mssql_firewall_rule para cada objeto en el mapa allowed_ips.

Comments are closed.