Мой план состоит в том, чтобы разрешить протоколы 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
Иметь возможность использовать несколько протоколов в одном и том же поле протокола правила безопасности.
Атрибут протокола не принимает список. Вам нужно либо создать два правила безопасности, либо использовать *
для протокола.
Поскольку 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 = []
},
]
}
Ах да извините. Я не проверял это, просто написал это вручную. Обновлю ответ.