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 用于此类情况。
我经常使用 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 用于此类情况。