我正试图弄清楚如何从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
等等。如果您修改顺序,比如删除record
2,TF将不得不在新值2和3下重新部署3和4。
因此,最好不要使用索引,例如:
for_each = {for hosted in flatten(local.dnsrecords):
"${hosted.dnsName}-${hosted.dnsValue}" => hosted
}
以上内容不取决于订单。