Terraform新增Route53 TXT记录时意外修改现有记录问题
问题根因
两个问题共同导致这个异常:
- 配置笔误:你写的
easydmarc_txt资源块中,name参数名后面多打了一个英文句号,写成了name. = "_dmarc.example.com"。HCL语法下这行根本不会给name属性传值,带尾随点的写法属于未定义的无效属性,Terraform不会解析后面的域名值。 - 状态绑定错误:从plan输出的现有id
Z0N3ID_example.com_TXT和现有fqdnexample.com可以看出,你当前的Terraform状态里,module.route53.aws_route53_record.easydmarc_txt这个资源地址,已经绑定了现存的根域名TXT记录——基本是之前测试配置时,你曾经把这个资源地址配成过根域名TXT并执行过apply,把关联关系写进了状态,后续改配置时既没修正笔误,也没处理错误的状态绑定。
两个问题叠加后,Terraform会认为你要修改这个已经绑定在状态里的根域名TXT记录,把它的name改成_dmarc前缀、records换成DMARC值,才会出现替换原有记录而非新增的计划。
另外你写的DMARC记录值前面多打了一个双引号,plan里显示的+ ""v=DMARC1;...就是这个笔误,不修正的话部署后记录值带多余引号,会直接导致DMARC校验失效。
修复步骤
- 先修正配置里的两处笔误:删掉
name后面多余的句号,删掉DMARC记录值开头多余的双引号,正确配置如下:
resource "aws_route53_record" "easydmarc_txt" { zone_id = aws_route53_zone.example_com.zone_id name = "_dmarc.example.com" type = "TXT" ttl = "300" records = ["v=DMARC1; p=quarantine; rua=mailto:somename@somedomain.us, mailto:dmarc-reports@example.com; ruf=mailto:somename@ruf.somedomain.us; fo=1"] }
- 解除错误的状态绑定,执行以下命令把误绑定的资源从Terraform状态中移除,该操作不会删除AWS上真实存在的域名记录,只是清除错误的关联关系:
terraform state rm module.route53.aws_route53_record.easydmarc_txt
- 重新执行plan校验结果:
terraform plan -target module.route53.aws_route53_record.easydmarc_txt
此时输出的计划会正常显示新增_dmarc.example.com的TXT记录,不会再改动原有的根域名TXT记录,确认无误后再执行apply即可。
内容的提问来源于stack exchange,提问作者Mike D
相关产品推荐
相关产品推荐

