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

时间:2018-11-02 20:43:52

标签: amazon-web-services terraform amazon-elb aws-load-balancer

我经常使用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

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

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

2 个答案:

答案 0 :(得分:1)

有一种叫做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在创建弯头和进行查找之间等待5分钟。问题解决了。

更复杂的解决方案实际上是local-exec进行名称解析,直到至少成功一次。

答案 1 :(得分:0)

Terraform 13现在具有depends_on_module [1]子句,可以利用该子句。 另外,在这种情况下也有time provider [2]。

[1] https://github.com/hashicorp/terraform-guides/pull/218/files [2] https://registry.terraform.io/providers/hashicorp/time/latest/docs/resources/sleep