You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于var.zone_id条件创建带for_each的AWS Route53记录?

解决Terraform中基于var.zone_id条件创建Route53记录的问题

解决方案

直接在for_each表达式中加入条件判断,当var.zone_id为null时返回空Map,此时不会创建任何Route53记录;否则正常生成用于遍历的Map:

resource "aws_route53_record" "cert-validation" {
  for_each = var.zone_id == null ? {} : {
    for dvo in aws_acm_certificate.main.domain_validation_options : dvo.domain_name => {
      name   = dvo.resource_record_name
      type   = dvo.resource_record_type
      records = [dvo.resource_record_value]
      // 保留你需要的其他属性
    }
  }

  zone_id = var.zone_id
  name    = each.value.name
  type    = each.value.type
  records = each.value.records
  ttl     = 60
  // 其他资源属性
}

原理说明

  • Terraform的for_each接受空Map或空Set作为输入,此时不会创建任何资源实例,正好匹配var.zone_id为null时的需求。
  • 规避了count与for_each混用的语法错误(Terraform不允许同一资源同时配置这两个参数)。
  • 无需额外定义本地变量,直接在for_each中完成条件逻辑,代码更简洁且符合Terraform动态表达式规范。

关于你之前尝试的本地变量方法

本地变量可以正常引用资源,失败大概率是语法问题。如果偏好这种写法,正确示例如下(不过不如上述方案简洁):

locals {
  validation_records = var.zone_id == null ? {} : {
    for dvo in aws_acm_certificate.main.domain_validation_options : dvo.domain_name => {
      name   = dvo.resource_record_name
      type   = dvo.resource_record_type
      records = [dvo.resource_record_value]
    }
  }
}

resource "aws_route53_record" "cert-validation" {
  for_each = local.validation_records

  zone_id = var.zone_id
  name    = each.value.name
  type    = each.value.type
  records = each.value.records
  ttl     = 60
}

内容的提问来源于stack exchange,提问作者Héctor Valls

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:30:07