Terraform:等待经典负载均衡器的 A 记录

Terraform: Wait for classic load balancer's A record

我经常使用 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 名称的错误。在几个 seconds/minutes 之后,每个 terraform refresh; terraform output; 显示 ELB 的正确当前 IP 地址。我想我需要注入某种抑制计时器,以便在首次部署基础架构时让 DNS 记录有时间可用。

我如何实现这样的抑制计时器,以便创建 ELB,然后 TF 在创建 data.dns_a_record_set.lb_dns_a 之前等待(比如说)2 分钟?

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

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

有一个叫做 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 实际上会解析名称,直到至少成功一次。

Terraform 13 现在有 depends_on_module 子句可以利用。 此外,还有一个 time provider 用于此类情况。