Как создать правила безопасности с несколькими протоколами с помощью Terraform в Azure?

Мой план состоит в том, чтобы разрешить протоколы ICMP и TCP в одном и том же правиле безопасности, но у меня проблемы, связанные с «типом значения атрибута».

Мой код Terraform:

resource "azurerm_network_security_group" "example" {
  name                = "01-tf-SG"
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name

  security_rule {
    name                       = "test123"
    priority                   = 100
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = **["Icmp", "Tcp"]**  ---> iT FAILS!!! 
    source_port_range          = "*"
    destination_port_range     = "*"
    source_address_prefix      = "172.16.25.10/32"
    destination_address_prefix = "10.0.1.10/32"
  }

Я не нашел ни одного примера в репозитории terraform: https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/network_security_rule

Иметь возможность использовать несколько протоколов в одном и том же поле протокола правила безопасности.

Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
0
57
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Атрибут протокола не принимает список. Вам нужно либо создать два правила безопасности, либо использовать * для протокола.

Ответ принят как подходящий

Поскольку Mark B указано в его ответе, вы не можете предоставить список для protocol. Однако вы можете использовать динамический блок , чтобы он создавал два правила без необходимости определять их по отдельности, дублируя код.

resource "azurerm_network_security_group" "example" {
  name                = "01-tf-SG"
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name

  dynamic "security_rule" {
    for_each = toset(["Icmp", "Tcp"])
    content {
      name                       = "test123"
      priority                   = 100
      direction                  = "Inbound"
      access                     = "Allow"
      protocol                   = security_rule.value
      source_port_range          = "*"
      destination_port_range     = "*"
      source_address_prefix      = "172.16.25.10/32"
      destination_address_prefix = "10.0.1.10/32"
    }
  }
}

Спасибо @Крис Дойл. Ваше решение самое эффективное.

Просто обратите внимание, что вы забыли функцию [ ] into toset. Таким образом, окончательный код будет таким:

resource "azurerm_network_security_group" "example" {
  name                = "01-tf-SG"
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name

  dynamic "security_rule" {
    for_each = toset(["Icmp", "Tcp"])
    content {
      name                       = "test123"
      priority                   = 100
      direction                  = "Inbound"
      access                     = "Allow"
      protocol                   = security_rule.value
      source_port_range          = "*"
      destination_port_range     = "*"
      source_address_prefix      = "172.16.25.10/32"
      destination_address_prefix = "10.0.1.10/32"
    }
  }
}

Результат:

# azurerm_network_security_group.example will be created
  + resource "azurerm_network_security_group" "example" {
      + id                  = (known after apply)
      + location            = "westeurope"
      + name                = "01-tf-SG"
      + resource_group_name = "RG_AZ_Terraform"
      + security_rule       = [
          + {
              + access                                     = "Allow"
              + description                                = ""
              + destination_address_prefix                 = "10.0.1.10/32"
              + destination_address_prefixes               = []
              + destination_application_security_group_ids = []
              + destination_port_range                     = "*"
              + destination_port_ranges                    = []
              + direction                                  = "Inbound"
              + name                                       = "test123"
              + priority                                   = 100
              + protocol                                   = "Icmp"
              + source_address_prefix                      = "172.16.25.10/32"
              + source_address_prefixes                    = []
              + source_application_security_group_ids      = []
              + source_port_range                          = "*"
              + source_port_ranges                         = []
            },
          + {
              + access                                     = "Allow"
              + description                                = ""
              + destination_address_prefix                 = "10.0.1.10/32"
              + destination_address_prefixes               = []
              + destination_application_security_group_ids = []
              + destination_port_range                     = "*"
              + destination_port_ranges                    = []
              + direction                                  = "Inbound"
              + name                                       = "test123"
              + priority                                   = 100
              + protocol                                   = "Tcp"
              + source_address_prefix                      = "172.16.25.10/32"
              + source_address_prefixes                    = []
              + source_application_security_group_ids      = []
              + source_port_range                          = "*"
              + source_port_ranges                         = []
            },
        ]
    }

Ах да извините. Я не проверял это, просто написал это вручную. Обновлю ответ.

Chris Doyle 19.11.2022 22:19

Другие вопросы по теме

Похожие вопросы

Развертывание функции Azure для одного скрипта Python и процесс установки файла requirements.txt в функциях Azure.
Сохраните pandas в фрейме данных API искры в новую таблицу в лазурных блоках данных
Фабрика данных Azure — повторите попытку для действия копирования вставки (AzureSQL DB)
Pyspark: динамически добавить одну строку в окончательный фрейм данных
Каков отраслевой стандарт метода дедупликации в потоках данных?
Как снова использовать вновь созданный столбец в преобразовании производного столбца в том же преобразовании производного столбца?
Можно ли запустить Node-Red в докере на виртуальной машине EFLOW (Azure IoT Edge на устройстве Windows)?
Как проверить, пусты ли файлы в каталоге озера данных с помощью Фабрики данных Azure?
Azure Databricks: непредвиденный сбой при ожидании готовности кластера. Причина Кластер непригоден для использования, так как драйвер неисправен
Напишите сценарий PowerShell с помощью модуля Runbook, чтобы сделать моментальный снимок виртуальной машины: Запуск от имени учетной записи: Azure