我经常使用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名称在创建输出时始终可以解析。
答案 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