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_port
和 to_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
).
当我 运行 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_port
和 to_port
设置为 -1。您应该将它们设置为 0
。来自 docs:
If you select a protocol of
-1
(semantically equivalent toall
, which is not a valid value here), you must specify afrom_port
andto_port
equal to0
.
在这种情况下发生的是 Terraform(或 Terraform 使用的 AWS API)将它们设置为 0
,而不会出错。由于在 apply
之后发生了变化,Terraform 将尝试在您再次执行 plan
时检测到它。
此外,我认为这里的文档不准确,这里允许将 all
设置为 protocol
(至少对于我尝试过的 Terraform 版本,v1.0.11
,AWS提供商版本 3.70.0
).