当前位置: 首页 > 知识库问答 >
问题:

处理Terraform重新创建带有负载均衡器的AWS子网,导致死锁

岳阳飙
2023-03-14

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

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

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

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

我如何管理它,以便可以重新配置VPC,而不总是触发问题,导致我每次都必须销毁和重新创建整个应用程序套件。在我的例子中,我实际上没有更改子网中的任何内容,只是对地形资源名称进行了标准化,但总是要考虑这个解决方案,这似乎是一个非常恼人的问题。

共有1个答案

东方旭东
2023-03-14

如果您正在更改Terraform资源名称,您可以编辑状态文件以在状态中重命名这些名称。

您可以使用terraformstate 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\u子网。az-a,然后创建了一个名为aws\u子网的全新资源。az_a忽略这两种资源在其他方面相等的事实。因此,它会想要销毁aws\u子网。az-a资源在下一个应用并创建aws\u子网。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
 类似资料:
  • 我一直在寻找一个合适的方法,以地面化我的内部虚拟机规模与内部负载均衡器,不暴露于互联网与公共IP。但是,节点应该能够访问internet以下载GitHub中的一些包。 我面临的问题是,负载均衡器和规模集都已部署,但我没有来自规模集节点的internet带外连接... 我读了这篇文章,但它没有告诉如何继续 根据我的理解,我应该有互联网访问从我的节点下载包,因为我使用了一个标准的负载均衡器,但它不工作

  • 目标是在一个简单的堆栈中包含 HTTP/2 支持:在多个 EC2 实例中部署的 Web 应用程序是启用了 PROXY 协议策略 (SSL:443 ➝ TCP:80) 的传输级 CLB,以便卸载 SSL/TLS 并平衡传入的 HTTPS 流量。 PROXY协议的几个原因:(1)地理定位逻辑的执行;(2)执行简单的访问控制规则;(3)日志记录。所有这些功能都需要访问可靠的(即不可轻易伪造的)客户端IP

  • 我有3个节点kafka集群(zookeeper也安装在相同的3个节点上)。我不确定我是否在我的经纪人面前部署了AWS NLB。我有3个生产者,即使平均分配给所有3个经纪人,他们也会决定在哪里分区等等。我不知道我能从AWS NLB中得到什么好处,也不知道它的缺点是什么。

  • 我通过以下terraform语句将Azure AKS集群部署到现有的VNET中。它工作了,AKS集群是用Azure负载均衡器和分配给它的公共IP地址创建的。我只需要一个内部Azure负载平衡器的设置。我必须如何更改terraform代码来只获得一个内部Azure负载均衡器?谢谢

  • 我在将https添加到我的EC2实例时遇到了一个问题,也许你们可以找到让它工作的答案。 我有一个负载平衡器,它正在将连接转发到我的EC2实例,我已将SSL证书添加到负载平衡器,一切正常,我已将侦听器添加到端口443,该端口将转发到我的实例的端口443,我已将Apache配置为在端口443和80上侦听,现在这里是我的负载平衡器的屏幕截图: SSL证书有效,在端口80(HTTP)上一切正常,但如果我尝

  • 我一直在尝试使用Terraform在AWS上创建一个具有自管理节点的EKS集群,但我无法让我的库伯内特斯入口创建负载均衡器。没有错误,但没有创建负载均衡器,它只是超时。 我确实首先在我的帐户中手动创建了一个负载均衡器,并验证了负载均衡器角色是否存在。当我的Terraform代码运行时,将访问策略。 我非常依赖本教程 TFVAR: 地形代码: