Amazon web services 处理Terraform重新创建连接了负载平衡器的AWS子网导致死锁
所以我有两个项目,彼此分离,使用单独的地形状态文件来管理自己 项目A:专有网络、网络、子网、eip、gw层。此项目是我工作组中所有项目的共享专有网络。我们在同一专有网络内启动所有项目 项目B:应用程序、负载平衡器、安全组、ecs容器、api网关。此项目是应用程序本身,您可以使用安全组相应地配置负载平衡器,这些安全组允许其需要的任何端口,并在ecs上运行软件 问题: 当我想更改VPC配置中的一些小事情时,甚至不是实际信息,只是一些资源的名称,似乎我意外地触发了子网的重新创建。这意味着它将尝试删除它们。但它不能,因为有负载平衡器连接到它。所以它总是失败。它现在处于死锁状态,因为我部署了20个项目,每个项目都有自己的负载平衡器Amazon web services 处理Terraform重新创建连接了负载平衡器的AWS子网导致死锁,amazon-web-services,terraform,terraform-provider-aws,Amazon Web Services,Terraform,Terraform Provider Aws,所以我有两个项目,彼此分离,使用单独的地形状态文件来管理自己 项目A:专有网络、网络、子网、eip、gw层。此项目是我工作组中所有项目的共享专有网络。我们在同一专有网络内启动所有项目 项目B:应用程序、负载平衡器、安全组、ecs容器、api网关。此项目是应用程序本身,您可以使用安全组相应地配置负载平衡器,这些安全组允许其需要的任何端口,并在ecs上运行软件 问题: 当我想更改VPC配置中的一些小事情时,甚至不是实际信息,只是一些资源的名称,似乎我意外地触发了子网的重新创建。这意味着它将尝试删除它
我如何管理它,以便可以重新配置VPC,而不总是触发问题,导致我每次都必须销毁和重新创建整个应用程序套件。在我的例子中,我实际上没有更改子网中的任何内容,只是对地形资源名称进行了标准化。这似乎是一个非常恼人的问题。如果您要更改地形资源名称,您也可以编辑状态文件以在状态中重命名这些名称 您可以使用 如果你以前有过这样的经历:
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会看到您“删除”了资源aws_subnet.az-a
,然后创建了一个名为aws_subnet.az_a
的全新资源,而忽略了这两个资源在其他方面相等的事实。因此,它将在下一次应用时销毁aws\u子网.az-a
资源,并创建aws\u子网.az\u 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
存在许多API不支持看似简单的更改的资源类型。在许多情况下,名称更改就是其中之一。子网名称的更改肯定是错误的。如果你用你改变的确切资源和你试图改变的内容编辑你的问题,有人可能会回答“这就是你的问题。”但你可能会在查看文档时得到更快的答案(如果Terraform文档不清楚是什么触发了替换还是更新,CloudFormation文档就是)哇,这是我以前没见过的地形,谢谢!