Terraform Apply 始终修改适当的安全组

Terraform Apply always modifies a Security Group in place

当我 运行 terraform apply 时,我的 Terraform 项目似乎总是就地修改此 aws_security_group.jacobs_rds_security_group_tf 资源。一切仍然有效,当我总是有一个额外的资源被修改时,它只会让调试变得奇怪,即使它没有任何变化。

我有2个安全组; 1 用于我的 RDS 数据库,它将传入流量列入白名单,另一个用于任务,它附加到我的 ECS 和 Lambda 任务,以便它们可以访问此 RDS 数据库。任务安全组在 RDS 安全组中列入白名单。

RDS 安全组 (aws_security_group.jacobs_rds_security_group_tf) 是始终在原地进行修改的组。下面是代码。

resource "aws_vpc" "jacobs_vpc_tf" {
  cidr_block = "10.0.0.0/16"
  enable_dns_hostnames = true

}

resource "aws_security_group" "jacobs_task_security_group_tf"{
    name = "jacobs_security_group for tasks"
    description = "Connect Tasks to RDS"
    vpc_id = aws_vpc.jacobs_vpc_tf.id

    ingress {
    from_port        = 0
    to_port          = 0
    protocol         = "-1"
    cidr_blocks      = ["0.0.0.0/0"]
    ipv6_cidr_blocks = ["::/0"]
  }

    egress {
    from_port        = 0
    to_port          = 0
    protocol         = "-1"
    cidr_blocks      = ["0.0.0.0/0"]
    ipv6_cidr_blocks = ["::/0"]
  }
}

resource "aws_security_group" "jacobs_rds_security_group_tf" {
  name        = "jacobs_security_group for rds"
  description = "Allow Jacobs Traffic to RDS"
  vpc_id      = aws_vpc.jacobs_vpc_tf.id

  ingress {
    description      = "Custom IP Addresses"
    from_port        = 5432
    to_port          = 5432
    protocol         = "tcp"
    cidr_blocks      = var.jacobs_cidr_block

  }

  ingress {
    description      = "Other Security Groups"
    from_port        = -1
    to_port          = -1
    protocol         = "all"
    security_groups  = [aws_security_group.jacobs_task_security_group_tf.id] # this should be changed to vpc_security_group_ids ?
  }


  # outbound
  egress {
    from_port        = 0
    to_port          = 0
    protocol         = "-1"
    cidr_blocks      = ["0.0.0.0/0"]
    ipv6_cidr_blocks = ["::/0"]
  }

}

我大约每个月研究一次这个问题,并使用 Terraform 来尝试修复它,但没有成功。我遇到的 github 问题似乎不适用于我的设置,但也许我遗漏了一些明显的东西?如有任何帮助,我们将不胜感激!

我认为你的问题是你有这个入口规则:

ingress {
    description      = "Other Security Groups"
    from_port        = -1
    to_port          = -1
    protocol         = "all"
    security_groups  = [aws_security_group.jacobs_task_security_group_tf.id]
  }

您将 from_portto_port 设置为 -1。您应该将它们设置为 0。来自 docs:

If you select a protocol of -1 (semantically equivalent to all, which is not a valid value here), you must specify a from_port and to_port equal to 0.

在这种情况下发生的是 Terraform(或 Terraform 使用的 AWS API)将它们设置为 0,而不会出错。由于在 apply 之后发生了变化,Terraform 将尝试在您再次执行 plan 时检测到它。

此外,我认为这里的文档不准确,这里允许将 all 设置为 protocol(至少对于我尝试过的 Terraform 版本,v1.0.11,AWS提供商版本 3.70.0).