Как передать несколько типов значений в динамический блок для создания настраиваемых правил NSG azurerm в модуле Terraform?

Я создал сетевой модуль, который создает виртуальную сеть, набор подсетей в виртуальной сети, а затем группу безопасности сети для каждой подсети. Теперь я пытаюсь передать пользовательские правила безопасности nsg, используя цикл for_each динамического блока в настроенном списке nsg_rules в каждой сопоставленной подсети.

Это в основном работает. Однако всякий раз, когда правило безопасности требует значения, которое не является строкой, например, destination_port_ranges (который принимает значения списка), где я определяю несколько несмежных портов, ошибки модуля: Невозможно включить данное значение в шаблон строки: требуется строка.

resource "azurerm_network_security_group" "nsg" {
  for_each = var.subnets

  name                = "nsg-${each.value.subnet_name}"
  resource_group_name = azurerm_resource_group.network_rg.name
  location            = var.location
  dynamic "security_rule" {
    for_each = lookup(each.value, "nsg_rules", [])
    content {
      name                       = security_rule.value[0] == "" ? "Default_Rule" : security_rule.value[0]
      priority                   = security_rule.value[1]
      direction                  = security_rule.value[2] == "" ? "Inbound" : security_rule.value[2]
      access                     = security_rule.value[3] == "" ? "Allow" : security_rule.value[3]
      protocol                   = security_rule.value[4] == "" ? "Tcp" : security_rule.value[4]
      source_port_range          = "*"
      destination_port_ranges    = security_rule.value[5] == "" ? "*" : security_rule.value[5]
      source_address_prefix      = security_rule.value[6] == "" ? element(each.value.subnet_address_prefix, 0) : security_rule.value[6]
      destination_address_prefix = security_rule.value[7] == "" ? element(each.value.subnet_address_prefix, 0) : security_rule.value[7]
      description                = "${security_rule.value[2]}_Port_${security_rule.value[5]}"
    }
  }
}

Вот значения корневого модуля для правил безопасности:

module "network_us" {
source  = "app.terraform.io/some_workspace/network/azurerm"
version = "0.4.21"

zone_name      = var.zone_name
environment    = var.environment
location       = "eastus"
location_short = "eastus"
name_suffix    = "001"

address_space  = ["10.252.74.0/23"]
dns_servers    = []
subnets        = {
  bastion_subnet = {
    subnet_name           = "AzureBastionSubnet"
    subnet_address_prefix = ["10.252.75.64/27"]
    nsg_rules     = [
      # [name, priority, direction, access, protocol, destination_port_ranges, source_address_prefix, destination_address_prefix]
      ["AllowHttpsInbound", "120", "Inbound", "Allow", "Tcp", ["443"], "Internet", ""],
      ["AllowGatewayManagerInbound", "130", "Inbound", "Allow", "Tcp", ["443"], "GatewayManager", ""],
      ["AllowAzureLoadBalancerInbound", "140", "Inbound", "Allow", "Tcp", ["443"], "AzureLoadBalancer", ""],
      ["AllowBastionHostCommunication", "150", "Inbound", "Allow", "*", ["8080", "5701"], "VirtualNetwork", "VirtualNetwork"],
      ["AllowSshRdpOutbound", "100", "Outbound", "Allow", "*", ["22", "3389"], "*", "VirtualNetwork"],
      ["AllowAzureCloudOutbound", "110", "Outbound", "Allow", "Tcp", ["443"], "*", "AzureCloud"],
      ["AllowBastionCommunication", "120", "Outbound", "Allow", "*", ["8080", "5701"], "VirtualNetwork", "VirtualNetwork"],
      ["AllowGetSessionInformation", "130", "Outbound", "Allow", "*", ["80"], "*", "Internet"]
    ]
  }
}

}

Вот ошибка, которую я получаю при запуске приложения:

The given value is not suitable for child module variable "subnets" defined at
.terraform/modules/network_apac/variables.tf:37,1-17: all map elements must
have the same type.

Как я могу решить эту проблему?


person Scott McArron    schedule 17.03.2021    source источник
comment
Что такое variables.tf в строке 37?   -  person Marcin    schedule 18.03.2021
comment
это ссылка на переменную карты var.subnets в модуле, которому представлены указанные выше значения.   -  person Scott McArron    schedule 18.03.2021


Ответы (1)


Оказывается, проблема была просто в условном выражении для значения destination_port_ranges. Он ожидал строку и получил список. Мне на самом деле не нужны были эти условные обозначения сети безопасности, поэтому я просто удалил их, и модуль работает, как и ожидалось.

person Scott McArron    schedule 18.03.2021