Почему Terraform уничтожает, а затем создает новую группу безопасности сети? - PullRequest
0 голосов
/ 21 апреля 2020

Мы используем 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.
...