处理 Terraform 重新创建附加了负载均衡器的 AWS 子网导致死锁
Handling Terraform recreating AWS subnets that have load balancers attached causing a deadlock
所以我有两个项目,彼此分离和隔离,使用单独的 terraform 状态文件来管理自己。
项目 A: VPC、网络、子网、eip、gw 层。该项目是我工作组中所有项目的共享 VPC。我们在同一个 VPC
中启动所有项目
项目 B: 应用程序、负载均衡器、安全组、ecs 容器、api-网关。该项目是应用程序本身,您使用安全组相应地配置负载均衡器,允许它需要的任何端口并在 ecs 上运行该软件。
问题:
当我想更改 VPC 配置中的一些小东西时,甚至不是实际信息,只是一些资源名称,似乎我不小心触发了子网的重新创建。这意味着它将尝试删除它们。但它不能,因为它附加了负载平衡器。所以它总是失败。现在陷入僵局,因为我部署了 20 个项目,每个项目都有自己的负载均衡器
我该如何管理它,以便可以重新配置 VPC 而不会总是触发导致我每次都必须销毁并重新创建整个应用程序套件的问题。这似乎是一个非常烦人的问题,因为在我的情况下,我实际上并没有更改子网中的任何内容,只是规范了 terraform 资源名称。
如果您要更改 Terraform 资源名称,您可以编辑状态文件以在状态中重命名这些资源。
您可以使用 terraform state mv
command。
所以如果你以前有过这样的事情:
data "aws_region" "current" {}
resource "aws_subnet" "az-a" {
vpc_id = "${aws_vpc.main.id}"
cidr_block = "10.0.1.0/24"
availability_zone = "${data.aws_region.current.name}-a"
tags = {
Name = "Main"
}
}
然后将资源从 az-a
重命名为 az_a
以遵循 Terraform 的一般命名模式,例如使用下划线而不是连字符:
data "aws_region" "current" {}
resource "aws_subnet" "az-a" {
vpc_id = "${aws_vpc.main.id}"
cidr_block = "10.0.1.0/24"
availability_zone = "${data.aws_region.current.name}-a"
tags = {
Name = "Main"
}
}
Terraform 会看到您拥有 "deleted" 资源 aws_subnet.az-a
,然后创建了一个名为 aws_subnet.az_a
的全新资源,并忽略了这两个资源在其他方面是相等的这一事实。因此,它会在下一次申请时销毁 aws_subnet.az-a
资源并创建 aws_subnet.az_a
.
在这种情况下,如果你 运行:
terraform state mv aws_subnet.az-a aws_subnet.az_a
然后 Terraform 将重命名状态中的资源,下一个计划将显示一个空差异。
您还可以在重构代码时使用它,将资源移入和移出模块,例如将子网资源移入名为 vpc
的模块中:
terraform state mv aws_subnet.az_a module.vpc.aws_subnet.az_a
所以我有两个项目,彼此分离和隔离,使用单独的 terraform 状态文件来管理自己。
项目 A: VPC、网络、子网、eip、gw 层。该项目是我工作组中所有项目的共享 VPC。我们在同一个 VPC
中启动所有项目项目 B: 应用程序、负载均衡器、安全组、ecs 容器、api-网关。该项目是应用程序本身,您使用安全组相应地配置负载均衡器,允许它需要的任何端口并在 ecs 上运行该软件。
问题: 当我想更改 VPC 配置中的一些小东西时,甚至不是实际信息,只是一些资源名称,似乎我不小心触发了子网的重新创建。这意味着它将尝试删除它们。但它不能,因为它附加了负载平衡器。所以它总是失败。现在陷入僵局,因为我部署了 20 个项目,每个项目都有自己的负载均衡器
我该如何管理它,以便可以重新配置 VPC 而不会总是触发导致我每次都必须销毁并重新创建整个应用程序套件的问题。这似乎是一个非常烦人的问题,因为在我的情况下,我实际上并没有更改子网中的任何内容,只是规范了 terraform 资源名称。
如果您要更改 Terraform 资源名称,您可以编辑状态文件以在状态中重命名这些资源。
您可以使用 terraform state mv
command。
所以如果你以前有过这样的事情:
data "aws_region" "current" {}
resource "aws_subnet" "az-a" {
vpc_id = "${aws_vpc.main.id}"
cidr_block = "10.0.1.0/24"
availability_zone = "${data.aws_region.current.name}-a"
tags = {
Name = "Main"
}
}
然后将资源从 az-a
重命名为 az_a
以遵循 Terraform 的一般命名模式,例如使用下划线而不是连字符:
data "aws_region" "current" {}
resource "aws_subnet" "az-a" {
vpc_id = "${aws_vpc.main.id}"
cidr_block = "10.0.1.0/24"
availability_zone = "${data.aws_region.current.name}-a"
tags = {
Name = "Main"
}
}
Terraform 会看到您拥有 "deleted" 资源 aws_subnet.az-a
,然后创建了一个名为 aws_subnet.az_a
的全新资源,并忽略了这两个资源在其他方面是相等的这一事实。因此,它会在下一次申请时销毁 aws_subnet.az-a
资源并创建 aws_subnet.az_a
.
在这种情况下,如果你 运行:
terraform state mv aws_subnet.az-a aws_subnet.az_a
然后 Terraform 将重命名状态中的资源,下一个计划将显示一个空差异。
您还可以在重构代码时使用它,将资源移入和移出模块,例如将子网资源移入名为 vpc
的模块中:
terraform state mv aws_subnet.az_a module.vpc.aws_subnet.az_a