Не удалось выполнить итерацию группы безопасности с использованием for_each в Terraform v0.13

#azure #terraform #terraform-provider-azure

Вопрос:

Я пытаюсь использовать пару значений ключа for_each, но получаю ошибку, похожую на то, что у этого объекта нет атрибута с именем «destination_address_prefix». Этот объект не имеет атрибута с именем «source_address_prefix».

 resource "azurerm_network_security_group" "nsg" {
  
  
  name                = "testsg"
  location            = "east us"
  resource_group_name = "test-rg"
  
 dynamic security_rule {
    for_each = var.securitygroup
    content {
    name                       = security_rule.name
    priority                   = security_rule.priority
    direction                  = security_rule.direction
    access                     = security_rule.access
    protocol                   = security_rule.protocol
    source_port_range          = security_rule.source_port_range
    destination_port_range     = security_rule.destination_port_range
    source_address_prefix      = security_rule.source_address_prefix
    destination_address_prefix = security_rule.destination_address_prefix

    }

  }

}

Var.tf:

variable "securitygroup" {

    type = map 
    default = {
    name                       = "test123"
    priority                   = "100"
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "Tcp"
    source_port_range          = "*"
    destination_port_range     = "*"
    source_address_prefix      = "*"
    destination_address_prefix = "*"   

    }

}
 

Ответ №1:

Вам не нужен динамический блок для вашего варианта использования, так как у вас есть только одно правило, и нет ничего, что нужно повторять, кроме отдельных элементов в этом единственном правиле. Таким образом, это должно быть:

 resource "azurerm_network_security_group" "nsg" {
    
  name                = "testsg"
  location            = "east us"
  resource_group_name = "test-rg"
  
 security_rule  {
    name                       = var.securitygroup.name
    priority                   = var.securitygroup.priority
    direction                  = var.securitygroup.direction
    access                     = var.securitygroup.access
    protocol                   = var.securitygroup.protocol
    source_port_range          = var.securitygroup.source_port_range
    destination_port_range     = var.securitygroup.destination_port_range
    source_address_prefix      = var.securitygroup.source_address_prefix
    destination_address_prefix = var.securitygroup.destination_address_prefix
   }
  }
}
 

Комментарии:

1. Спасибо за ответ, что делать, если существует несколько правил, как показано ниже. Тогда как бы я указал несколько правил в var.tf и как бы я повторил их, используя динамический блок security_rule { имя, приоритет..}, {имя, приоритет }

2. я хочу использовать 3 правила безопасности входящих сообщений, не знаю точного синтаксиса.

3. @SharatBhaskar Я бы предложил задать для этого новый вопрос с новым примером правил безопасности.

Ответ №2:

Ваша переменная не является переменной типа списка или набора, это переменная одного типа объекта, поэтому вам не нужна итерационная логика azurerm_network_security_group , вот пример:

 resource "azurerm_network_security_group" "nsg" {
  
  name                = "testsg"
  location            = "east us"
  resource_group_name = "test-rg"

  security_rule = var.securitygroup

}