首页 > 解决方案 > 如何在 for_loop 中指定条件

问题描述

我如何在 for_each 中使用条件,以便仅当 validation_method == "DNS" else 忽略资源的创建时才创建/触发以下资源。但是在早期的 terraform(11 个版本)中,我们可以使用

计数 = var.validation_method == "DNS" ?长度(var.domain_names):0

我的 var.domain_names 是 map(list(string)) ,例如

domain_names = {
    "foo.com" = ["*.foo.com"]
  }

请给我一些解决方案。使用 terraform 0.12.20 版本

resource "aws_route53_record" "validation" {
  for_each   = var.validation_method == "DNS" ? var.domain_names :
  name       = aws_acm_certificate.certificate[each.key].domain_validation_options.0.resource_record_name
  type       = aws_acm_certificate.certificate[each.key].domain_validation_options.0.resource_record_type
  zone_id    = data.aws_route53_zone.selected[each.key].zone_id
  ttl        = "300"
  records    = [aws_acm_certificate.certificate.domain_validation_options.0.resource_record_value]
  depends_on = [aws_acm_certificate.certificate.domain_name]
}

标签: terraformterraform-provider-awsterraform0.12+

解决方案


正如您所指出的,您需要在三元组的两侧具有一致的类型。由于您使用的map(list(string))是右侧,因此为了不创建资源,需要为空地图:{}

variable "domain_names" {
  type = map(list(string))
  default = {
    "foo.com" = ["*.foo.com"]
  }
}

resource "aws_route53_record" "validation" {
  for_each   = var.validation_method == "DNS" ? var.domain_names : {}
  ...
}

推荐阅读