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)}" }")}"
}
Вопрос: Что является более коротким / более элегантным способом кодирования этого?
Примечание: Я нашел один ответ сам, но чувствую себя готовым помочь еще лучше.