我经常用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在创建data.dns_a_record_set.lb_dns_a之前等待(例如)2分钟。
最好的解决方案是等到名称被成功解析后再继续。
P.S.:我只对ELB有这个问题。ALB和北草坪会议大楼似乎更快,或者仅仅需要足够长的时间来创建侦听器和目标组,以便它们的DNS名称在创建输出时始终是可解析的。
发布于 2018-11-04 20:30:03
有一种叫做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,我在构建图中注入一些只能在创建了data.dns_a_record_set.lb_dns_a之后才能创建的东西,但是必须在创建data.dns_a_record_set.lb_dns_a之前进行。那正是我要我按住计时器的地方。使用null_resource,我可以使用local-exec提供程序让TF运行bash命令sleep 300,这将导致Terraform在创建elb和执行查找之间等待5分钟。问题解决了。
更复杂的解决方案是让local-exec实际执行名称解析,直到它至少成功一次。
https://stackoverflow.com/questions/53125583
复制相似问题