4

我经常使用 Terraform 创建经典的负载均衡器。这些项目的 TF 输出应包括负载均衡器的(当前)IP 地址。为此,我的代码中有以下内容:

data "dns_a_record_set" "lb_dns_a" {
  host  = "${aws_elb.myelb.dns_name}"
}
output "load_balancer_ip" {
  value = "${data.dns_a_record_set.lb_dns_a.addrs}"
}

这确实有效,但最初创建 ELB 时除外。通常情况下,在创建 ELB 和它的 DNS 名称可解析之间存在相当大的延迟,因此我收到无法解析 DNS 名称的错误。几秒钟/分钟后,每个terraform refresh; terraform output;显示 ELB 的正确当前 IP 地址。我想在第一次部署基础设施时,我需要注入某种抑制计时器以使 DNS 记录有时间变得可用。

我怎样才能实现这样一个保持计时器,以便创建 ELB,然后 TF 在创建之前等待(比如说)2 分钟data.dns_a_record_set.lb_dns_a

最好的解决方案是等到可以成功解析名称,然后再继续。

PS:我只有ELB有这个问题。ALB 和 NLB 似乎更快,或者只需要足够长的时间来创建侦听器和目标组,以便在创建输出时始终可以解析它们的 DNS 名称。

4

2 回答 2

3

Terraform 13现在具有可以利用的depends_on_module子句。另外,对于这种情况,还有时间提供者。

于 2020-09-10T15:38:28.090 回答
2

有一个叫做 的东西null_resource,它可以和 结合使用depends_on,来搞乱 Terraform,像这样:

resource "null_resource" "patience" {
    depends_on = [ "aws_elb.myelb" ]
    triggers {
      lb_dns_name = "${aws_elb.myeln.dns_name}"
    }

    provisioner "local-exec" {
      command = "sleep 300"
    }
}

data "dns_a_record_set" "lb_dns_a" {
  depends_on = [ "null_resource.patience" ]
  host  = "${aws_elb.myelb.dns_name}"
}

有了这个null_resource,我在构建图中注入了一些东西,这些东西只能在创建 ELB 之后创建,但必须先于创建data.dns_a_record_set.lb_dns_a. 这正是我想要我的按住计时器的地方。有了null_resource我可以使用local-exec配置器让 TF 运行 bash 命令sleep 300,这会导致 Terraform 在创建 elb 和进行查找之间等待 5 分钟。问题解决了。

一个更复杂的解决方案local-exec实际上已经完成了名称解析,直到它至少成功一次。

于 2018-11-04T20:30:03.177 回答