Мы используем terraform для управления нашей инфраструктурой, однако я обнаружил, что каждый раз, когда я добавляю cidr_block к правилу группы сетевой безопасности, Terraform будет его уничтожать и создавать новый, а не добавлять cidr_block к существующему NSG.
Я прочитал немного исходного кода провайдера AWS и обнаружил, что схема для правил NSG требует, чтобы каждый элемент, кроме description
, имел набор force_new
, что означает всякий раз, когда я обновляю cidr_block, Terraform будет обрабатывать его как новый и сначала уничтожать существующий. Что меня смущает, так это то, что тип cidr_block - это List, так как я предполагаю, что список добавляется безопасно, но Terraform всегда разрушит мое правило, в таком случае, почему бы не установить тип на string? Можно ли избежать повторного создания терраформой правила NSG при добавлении блока CIDR? Спасибо
"cidr_blocks": {
Type: schema.TypeList,
Optional: true,
ForceNew: true,
Elem: &schema.Schema{
Type: schema.TypeString,
ValidateFunc: validateCIDRNetworkAddress,
},
},
Мой скрипт, как показано ниже:
resource "aws_security_group" "allow_tls" {
name = "allow_tls"
description = "Allow TLS inbound traffic"
vpc_id = "${aws_vpc.main.id}"
ingress {
description = "test 25"
from_port = 25
to_port = 25
protocol = "tcp"
cidr_blocks = ["1.2.3.4/32"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "allow_tls"
}
}
, когда я добавляю диапазон IP-адресов к входу cidr_blocks, я ожидаю, что terraform может создать еще одно правило NSG вместо того, чтобы уничтожать существующий NSG и создайте новый вместо этого, ниже план terraform:
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
-/+ destroy and then create replacement
Terraform will perform the following actions:
# aws_security_group_rule.sg-0b9155434377b4b34 must be replaced
-/+ resource "aws_security_group_rule" "sg-0b9155434377b4b34" {
~ cidr_blocks = [ # forces replacement
"1.2.3.4/32",
+ "11.22.33.44/32",
]
description = "test 25"
from_port = 25
~ id = "sgrule-4170849876" -> (known after apply)
- ipv6_cidr_blocks = [] -> null
- prefix_list_ids = [] -> null
protocol = "tcp"
security_group_id = "sg-0b9155434377b4b34"
self = false
+ source_security_group_id = (known after apply)
to_port = 25
type = "ingress"
}
Plan: 1 to add, 0 to change, 1 to destroy.