Terraform1.0搭配AWS Provider3.65配置ACM证书plan阶段for_each报错求解
解决方案
根因说明
该报错由两个叠加因素触发:
- 你当前配置中将
aws_acm_certificate的domain_name字段绑定了aws_route53_record.app.fqdn属性,该属性在首次执行plan阶段属于未确定值(Route53记录尚未创建),导致ACM证书的domain_validation_options集合长度无法被Terraform预判 - Terraform 1.0.x版本对
for_each参数的确定性要求更高:只要for_each对应的映射/集合长度无法在plan阶段确定,就会直接抛出该错误,这和AWS Provider v3升级指南的描述并不冲突——指南仅说明属性值未知不会报错,未涉及集合长度未知的场景
修复步骤
1. 预定义应用域名(根治方案)
你的应用域名可通过已有变量提前计算,完全不需要依赖Route53记录的输出属性。首先新增局部值预定义域名:
locals { # 直接通过已有变量计算域名,plan阶段即可确定值 app_domain = "${lookup(var.subdomain, terraform.workspace)}.${var.dns_zone_name}" }
2. 修改关联资源配置
将Route53记录和ACM证书的域名均绑定到上述预定义的局部值:
# 修改Route53记录的name字段 resource "aws_route53_record" "app" { zone_id = data.aws_route53_zone.zone.zone_id name = local.app_domain type = "CNAME" ttl = "300" records = [aws_lb.api.dns_name] } # 修改ACM证书的domain_name字段 resource "aws_acm_certificate" "app_cert" { domain_name = local.app_domain validation_method = "DNS" tags = local.common_tags lifecycle { create_before_destroy = true } }
修改完成后重新执行plan,此时domain_validation_options的长度可在plan阶段确定(单域名场景下长度固定为1),不会再抛出for_each相关错误。
临时兼容方案
如果因特殊场景无法修改上述配置,可先通过target参数单独创建ACM证书,再执行全量部署:
# 先单独创建ACM证书,获取验证信息 terraform apply -target=aws_acm_certificate.app_cert # 证书创建完成后执行全量部署 terraform plan terraform apply
内容的提问来源于stack exchange,提问作者Cameron Kerr
相关产品推荐
相关产品推荐

