所以我有两个项目,彼此分离和隔离,使用单独的地形状态文件来管理自己。
项目 A:VPC、网络、子网、弹性公网、GW 层。此项目是我工作组中所有项目的共享 VPC。我们在同一 VPC 中启动所有项目
项目 B:应用程序、负载均衡器、安全组、ecs 容器、API 网关。此项目是应用程序本身,您可以使用安全组相应地配置负载均衡器,这些安全组允许它需要的任何端口并在 ecs 上运行软件。
问题:当我想更改 VPC 配置中的一些小东西时,甚至没有实际信息,只是一些资源名称,似乎我不小心触发了子网的重新创建。这意味着它将尝试删除它们。但它不能,因为附加了负载均衡器。所以它不断失败。现在陷入僵局,因为我部署了 20 个项目,每个项目都有自己的负载均衡器
我如何管理它,以便可以重新配置 VPC,而不会总是触发导致我每次都必须销毁和重新创建整个应用程序套件的问题。这似乎是一个非常烦人的问题,总是必须考虑该解决方案,而就我而言,我实际上没有更改子网中的任何内容,只是规范化了地形资源名称。
如果要更改 Terraform 资源名称,则可以编辑状态文件以在状态中重命名这些名称。
您可以使用terraform state mv
命令执行此操作。
所以如果你以前有过这样的事情:
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_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