Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 处理Terraform重新创建连接了负载平衡器的AWS子网导致死锁_Amazon Web Services_Terraform_Terraform Provider Aws - Fatal编程技术网

Amazon web services 处理Terraform重新创建连接了负载平衡器的AWS子网导致死锁

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配置中的一些小事情时,甚至不是实际信息,只是一些资源的名称,似乎我意外地触发了子网的重新创建。这意味着它将尝试删除它

所以我有两个项目,彼此分离,使用单独的地形状态文件来管理自己

项目A:专有网络、网络、子网、eip、gw层。此项目是我工作组中所有项目的共享专有网络。我们在同一专有网络内启动所有项目

项目B:应用程序、负载平衡器、安全组、ecs容器、api网关。此项目是应用程序本身,您可以使用安全组相应地配置负载平衡器,这些安全组允许其需要的任何端口,并在ecs上运行软件

问题: 当我想更改VPC配置中的一些小事情时,甚至不是实际信息,只是一些资源的名称,似乎我意外地触发了子网的重新创建。这意味着它将尝试删除它们。但它不能,因为有负载平衡器连接到它。所以它总是失败。它现在处于死锁状态,因为我部署了20个项目,每个项目都有自己的负载平衡器


我如何管理它,以便可以重新配置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文档就是)哇,这是我以前没见过的地形,谢谢!