Terraform переменные и количество = 0
Мы используем одни и те же определения терраформ во всех средах. До сих пор это работало хорошо, но теперь я сталкиваюсь с проблемой, которую пока не могу решить. У меня есть RDS и ElastiCache для службы, которая мне не нужна в демоверсии, которую я сейчас настраиваю, поэтому я установил count
в 0
, Для других сред мне нужно выставить их через выходную переменную:
resource "aws_elasticache_cluster" "cc_redis" {
cluster_id = "cc-${var.env}"
engine = "redis"
node_type = "cache.t2.small"
security_group_ids = ["..."]
count = "${var.env == "demo" ? 0 : 1}"
}
output "cc_redis_host" {
value = "${aws_elasticache_cluster.cc_redis.cache_nodes.0.address}"
}
Теперь я получаю эту ошибку:
output.cc_redis_host: Resource 'aws_elasticache_cluster.cc_redis' not found
for variable 'aws_elasticache_cluster.cc_redis.cache_nodes.0.address'
Я не против (много) иметь бесполезный набор переменных, но я не могу заставить его работать в первую очередь. Простое условное выражение не решает эту проблему, поскольку terraform оценивает ложную сторону условных выражений, даже если она не используется. Я нашел этот взлом, но не смог заставить его работать.
4 ответа
Попробуй это:
output "cc_redis" {
value = "${element(concat(aws_elasticache_cluster.cc_redis.*.cache_nodes.0.address, list("")), 0)}"
}
TF, кажется, не заботится о том, что счет может быть 0, если вы подстановочный знак выше в цепочке.
Это может вывести больше, чем вы хотите, но вы можете разобрать, что вам нужно от него.
Для людей, которые приходят из Google в эту тему, это новая версия terraform для обработки этого: метод tolist с квадратными скобками - это новый подход.
value = "${element(concat(aws_elasticache_cluster.cc_redis.cache_nodes.*. address, tolist([""])), 0)}"
Вы можете поставить что-то вроде ниже:
output "cc_redis" {
value = var.env == "demo" : null ? aws_elasticache_cluster.cc_redis.cache_nodes.0.address
}
Вывод также принимает нуль, и если он нулевой, он будет игнорировать его во время выполнения.
Измените ваш вывод на следующее:
output "cc_redis_host" {
value = "${element(concat(aws_elasticache_cluster.cc_redis.cache_nodes.*. address, list("")), 0)}"
}
Это задокументировано где-то на сайте terraform.