使用Terraform资源aws_route53_record,从json文件导入aws route 53记录



我正试图弄清楚如何从json文件导入dns记录。我可以在同一个文件夹中有X个这样的json文件,每个json文件中可以有1个或多个记录:

[
{
"dnsName":"my-new-service",
"dnsValue":"transfer.something.com."
},
{
"dnsName":"import-service",
"dnsValue":"transfer.something.com."
}
]

我已经定义了我的本地代码来jsondecode文件:

locals {
jsonfiles = fileset("${path.module}/json/", "*.json")
dnsrecords = [for f in local.jsonfiles: jsondecode(file("${path.module}/json/${f}"))]
}

然后我通过添加

resource "aws_route53_record" "Route53dns" {
for_each = { for records, hosted in flatten(local.dnsrecords): records => hosted}
zone_id = "XXXXXXXXX"
name = each.value.dnsName
ttl = 120
type = "CNAME"
records = [each.value.dnsValue]
}

有趣的是,我第一次跑步,效果很好,所有53号路线的记录都到位了。当我进行更改时,假设我再添加3个json文件,并删除json文件中的一些值,我会得到以下错误:

│错误:[ERR]:生成变更集时出错:InvalidChangeBatch:[试图创建资源记录集[name='xxx.com.',type='name'],但它已存在]

│状态代码:400

或者有时我会遇到这样的错误:

│错误:找不到匹配的记录

对此有什么想法吗?Terraform在循环通过资源以确定状态时,是否会查看资源的顺序?

Terraform在循环通过资源以确定状态时,是否查看资源的顺序?

是的,订单很重要。在你的情况下,因为你有:

for_each = { for records, hosted in flatten(local.dnsrecords): records => hosted}

records将只是列表中的一个索引,0,1,2,3,4等等。如果您修改顺序,比如删除record2,TF将不得不在新值2和3下重新部署3和4。

因此,最好不要使用索引,例如:

for_each = {for hosted in flatten(local.dnsrecords): 
"${hosted.dnsName}-${hosted.dnsValue}" => hosted
}

以上内容不取决于订单。

相关内容

  • 没有找到相关文章

最新更新