Как сослаться на альтернативные ресурсы в Terraform? - PullRequest
0 голосов
/ 12 декабря 2018

Terraform (на сегодняшний день) имеет несколько тревожное ограничение: нельзя создавать ресурс с интерполированным (вычисленным) атрибутом lifecycle prevent_destroy.

Обходной путь довольно прост для программирования, просто создайте 2 ресурса с «чередующимися» счетчиками.Когда у вас есть 1 «производственный» ресурс, который не позволяет уничтожить, у вас есть 0 «тестирующих» ресурсов, которые можно уничтожить.Или наоборот.(Подробности см. В ответе на вопрос stackoverflow, связанный выше).

Однако это поднимает новый вопрос.Когда я хочу сослаться на «один из альтернативных ресурсов, который существует для этого выполнения», как мне это сделать?

В псевдокоде что-то вроде

"${local.production ? "${aws_eip.commander_production.public_ip}" : "${aws_eip.commander_testing.public_ip}" }" 

Этот псевдокод не можетработать по нескольким причинам:

  • aws_eip.commander_production больше не является единственным ресурсом, это список, поэтому вам нужен синтаксис *
  • , один из списковвсегда пустой, и Terraform легко жалуется, что не может определить тип пустого списка.(Я полагаю, потому что троичный оператор требует, чтобы альтернативы имели одинаковый тип)
  • при доступе к пустому списку вы получите ошибку (С семантикой C неиспользуемый альтернативный объект не будет оцениваться, но Terraform, кажется,работают по-другому, и я получаю ошибки при попытке это кодировать)

Чтобы обойти тех, я пришел к следующему хакерскому решению: расширить списки с помощью фиктивного элемента в конце, а затем обратиться к первомуэлемент расширенного списка.Код для этого довольно ужасно набирать, но, похоже, он работает

locals  {
  dummy = [ "foo" ]
}


output "0101: address" {
  value = "${format("Public IP is %s", "${local.production ? "${element("${concat("${aws_eip.commander_production.*.public_ip}", "${local.dummy}")}", 0)}" : "${element("${concat("${aws_eip.commander_testing.*.public_ip}", "${local.dummy}")}", 0)}" }")}"

}

Вопрос: Что является более коротким / более элегантным способом кодирования этого?

Примечание: Я нашел один ответ сам, но чувствую себя готовым помочь еще лучше.

1 Ответ

0 голосов
/ 12 декабря 2018

Немного короче код:

output "0101: address" {
   value = "${format("Public IP is %s", "${element("${concat("${aws_eip.commander_production.*.public_ip}", "${aws_eip.commander_testing.*.public_ip}")}", 0)}")}"

}

В простом тексте: объединить списки и взять первый элемент результата.Один список имеет один элемент, а другой - ноль, поэтому мы получим желаемый результат независимо от того, находится ли элемент в первом или втором списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...