Terraform: дождитесь записи A классического балансировщика нагрузки - PullRequest
0 голосов
/ 02 ноября 2018

Я часто создаю классические балансировщики нагрузки с помощью 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; показывает правильный текущий IP-адрес ELB. Я предполагаю, что мне нужно ввести какой-то таймер удержания, чтобы дать время записи DNS, чтобы стать доступным, при первом развертывании инфраструктуры.

Как я могу реализовать такой таймер удержания, чтобы создать ELB, а затем TF ждет (скажем) 2 минуты, прежде чем он создаст data.dns_a_record_set.lb_dns_a?

Лучшее решение - дождаться успешного разрешения имени, прежде чем продолжить.

П.С .: У меня есть эта проблема только с ELB. ALB и NLB кажутся более быстрыми, или это просто занимает достаточно много времени для создания слушателей и целевых групп, чтобы их DNS-имена всегда были разрешаемы к моменту создания выходных данных.

1 Ответ

0 голосов
/ 04 ноября 2018

Существует нечто, называемое 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 минут между созданием elb и выполнением поиска. Проблема решена.

Более сложное решение имеет local-exec, на самом деле разрешающее имя, пока оно не будет выполнено хотя бы один раз

...