Terraform:用count替代for_each解决导入时的参数无效问题
用count替代for_each解决Terraform导入ACM验证记录的错误
原问题代码(for_each写法)
你之前的aws_route53_record.subdomain_cert_validation大概是这样的:
resource "aws_route53_record" "subdomain_cert_validation" { for_each = { for dvo in aws_acm_certificate.cert.domain_validation_options : dvo.domain_name => { name = dvo.resource_record_name type = dvo.resource_record_type record = dvo.resource_record_value } } zone_id = aws_route53_zone.subdomain.zone_id name = each.value.name type = each.value.type records = [each.value.record] ttl = 60 }
修改为count的具体步骤
替换for_each为count
删掉for_each块,换成count = length(aws_acm_certificate.cert.domain_validation_options)。这里用列表长度作为count的取值,Terraform不需要提前知道具体域名信息,只需要确认元素数量就能正常执行,绕过了apply阶段才能获取值的限制。修改资源属性的引用方式
把所有each.value的引用,换成通过count.index访问domain_validation_options列表的对应元素:
- 用
aws_acm_certificate.cert.domain_validation_options[count.index].resource_record_name替代each.value.name - 用
aws_acm_certificate.cert.domain_validation_options[count.index].resource_record_type替代each.value.type - 用
[aws_acm_certificate.cert.domain_validation_options[count.index].resource_record_value]替代[each.value.record]
修改后的完整代码
resource "aws_route53_record" "subdomain_cert_validation" { count = length(aws_acm_certificate.cert.domain_validation_options) zone_id = aws_route53_zone.subdomain.zone_id name = aws_acm_certificate.cert.domain_validation_options[count.index].resource_record_name type = aws_acm_certificate.cert.domain_validation_options[count.index].resource_record_type records = [aws_acm_certificate.cert.domain_validation_options[count.index].resource_record_value] ttl = 60 }
导入资源的命令写法
因为count是基于索引的,导入时需要指定对应实例的索引(从0开始),命令格式如下:
terraform import aws_route53_record.subdomain_cert_validation[<索引编号>] <Route53区域ID>/<验证记录名称>/<记录类型>
比如要导入第一个验证记录,假设区域ID是Z0123456789ABCDEFGHIJ,记录名称是_abc123.example.com,类型是CNAME,命令就是:
terraform import aws_route53_record.subdomain_cert_validation[0] Z0123456789ABCDEFGHIJ/_abc123.example.com/CNAME
注意事项
- count是顺序敏感的,如果后续ACM证书的验证域名顺序发生变化,Terraform可能会重建资源,这点要留意。
- 导入前确保
aws_acm_certificate.cert已经存在(可以先导入证书本身,再导入Route53记录)。
内容的提问来源于stack exchange,提问作者Charmander
相关产品推荐
相关产品推荐

