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.

Другие вопросы по тегам