#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
}