如何通过Terraform输出AWS ACM证书提供的CNAME验证记录?
报错根因
两个问题的核心原因分别是:
- 属性不存在报错:Terraform模块默认做了属性封装,根配置无法直接访问模块内部的资源属性,必须在子模块内通过
output块显式声明要对外暴露的值,根模块才能引用。你之前直接写module.media_certificate.aws_acm_certificate.xxx的访问方式不符合Terraform的模块语法规则。 - apply卡住超时:
aws_acm_certificate_validation资源创建时会持续轮询ACM服务检查证书验证状态,直到DNS验证记录生效才会标记创建成功。你没有配置对应的CNAME验证记录,资源会一直等待直到超时。
解决步骤
第一步:在media_certificate模块内添加输出,暴露验证所需的CNAME信息
编辑media_certificate模块目录下的outputs.tf(文件不存在则新建),添加如下配置:
// media_certificate/outputs.tf output "acm_certificate_validation_records" { description = "ACM证书DNS验证所需的CNAME记录列表" value = aws_acm_certificate.dumdum.domain_validation_options }
说明:domain_validation_options是列表类型,每个元素对应一个待验证域名的CNAME配置,包含记录名、记录值、记录类型三个核心字段。
第二步:修正根配置的输出,引用模块暴露的输出值
回到根目录的Terraform配置,将之前写的错误输出配置修改为引用模块暴露的output值:
// 根目录main.tf output "media_certificate_says" { value = module.media_certificate.acm_certificate_validation_records }
第三步:分阶段执行获取验证记录
证书资源本身创建不需要等待验证完成,第一次执行不要直接跑全量apply,先单独创建证书资源拿到验证记录即可:
- 执行命令仅创建ACM证书资源,暂时跳过验证环节:
terraform apply -target=module.media_certificate.aws_acm_certificate.dumdum
- 命令执行完成后,执行
terraform output media_certificate_says即可拿到需要配置的CNAME记录信息,返回结构示例如下:
[ { "domain_name" = "media.dummy.com" "resource_record_name" = "_xxxx.media.dummy.com." "resource_record_type" = "CNAME" "resource_record_value" = "_xxxx.acm-validations.aws." }, ]
- 将输出中的CNAME记录配置到域名对应的DNS服务商解析中,等待解析生效,可通过
nslookup或dig命令确认记录可正常查询。 - 解析生效后执行全量
terraform apply,此时aws_acm_certificate_validation资源可正常检测到验证通过,不会出现卡住超时的问题。
可选优化
如果你的域名DNS服务也通过Terraform管理(比如使用AWS Route53、Cloudflare等对应的Terraform Provider),可以直接在模块内编写DNS记录资源,自动创建ACM对应的验证CNAME记录,无需手动操作,整个证书申请验证流程可以全自动完成,不需要分阶段执行。
内容的提问来源于stack exchange,提问作者ilrock
相关产品推荐
相关产品推荐

