【问题标题】:Terraform is deleting resources randomly when using for_eachTerraform 在使用 for_each 时随机删除资源
【发布时间】:2021-09-22 12:01:57
【问题描述】:

我正在尝试从 Terraform 中的对象映射创建安全组规则,但有时 terraform 会删除这些角色,这是随机发生的。我们使用 s3 作为后端和 dynamodb 锁。

这是我的安全组资源

resource "aws_security_group" "ec2_jumper_sg" {
  name        = "${var.app_name}-private-sg"
  description = "Security Group for Private EC2 instance"
  vpc_id      = var.vpc_id

  egress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = [var.vpc_cidr]
  }
}

这些是使用附加到上述安全组的for_each 创建的规则:

resource "aws_security_group_rule" "ec2_jumper_sg_databases_egress" {
  for_each = var.databases

  security_group_id        = aws_security_group.ec2_jumper_sg.id
  from_port                = each.value.port
  to_port                  = each.value.port
  source_security_group_id = each.value.securityGroupId
  protocol                 = "tcp"
  type                     = "egress"
}

这是我的变量映射:

variable "databases" {
  type = map(object({
    id: string
    securityGroupId: string
    port: number
  }))

  default = {
    "db-1": {
      id : "db-1",
      securityGroupId : "sg-000000000",
      port : 5432
    },
    "db-2": {
      id : "db2",
      securityGroupId : "sg-000000000",
      port : 3306
    }
  }
}

当规则不存在时,它会创建它们,但是当它们存在时,它将删除它们:

      - {
              - cidr_blocks      = []
              - description      = ""
              - from_port        = 3306
              - ipv6_cidr_blocks = []
              - prefix_list_ids  = []
              - protocol         = "tcp"
              - security_groups  = [
                  - "sg-0000000",
                ]
              - self             = false
              - to_port          = 3306
            },
          - {
              - cidr_blocks      = []
              - description      = ""
              - from_port        = 5432
              - ipv6_cidr_blocks = []
              - prefix_list_ids  = []
              - protocol         = "tcp"
              - security_groups  = [
                  - "sg-00000000",
                ]
              - self             = false
              - to_port          = 5432
            },

为什么会这样?

【问题讨论】:

    标签: amazon-web-services terraform


    【解决方案1】:

    不能混合 egressaws_security_group 中定义的 aws_security_group_rule 资源。来自docs

    Terraform 目前提供独立的安全组规则资源(单个入口或出口规则)和内嵌定义入口和出口规则的安全组资源。目前,您不能将具有内联规则的安全组与任何安全组规则资源结合使用。这样做会导致规则设置冲突,并会覆盖规则。

    你只能使用其中之一,不能同时使用。

    【讨论】:

    • 是的,这确实是正确的答案,我只是感到困惑,因为我有一个类似的设置,没有for_each,它工作正常。谢谢
    • @Matteo 没问题。很高兴它解决了:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 2023-02-08
    • 1970-01-01
    • 2021-07-21
    • 2021-10-04
    • 2021-11-25
    • 2020-12-09
    相关资源
    最近更新 更多