如何基于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
相关产品推荐
相关产品推荐

