我正在尝试使用模块概念创建 53 号路线。但低于错误。 “‘for_each’值取决于资源属性,这些属性在应用之前无法确定,因此 Terraform 无法预测将创建多少个实例。” for_each = var.create-route53 ? local.recordsets : tomap({})
local.recordsets只有在apply之后才知道 var.create-route53 为 true
有人可以指导我吗?
实际代码:
module "route53" {
...
...
records = [
{
name = "test-name"
type = "A"
ttl = 300
records = [for instance in module.ec2: instance.ec2-IP
]
},
]
vpc_id = "${module.vpc.vpc_id}"
}
Inside modules folder below code will be there in route53 folder:
locals {
records = try(jsondecode(var.records), var.records)
recordsets = {
for rs in local.records :
join(" ", compact(["${rs.name} ${rs.type}", lookup(rs, "set_identifier", "")])) => merge(rs, {
records = jsonencode(try(rs.records, null))
})
}
}
resource "aws_route53_record" "this" {
for_each = var.create-route53 ? local.recordsets : tomap({})
zone_id = aws_route53_zone.private.zone_id
name = each.value.name != "" ? "${each.value.name}" : "test"
type = each.value.type
ttl = lookup(each.value, "ttl", null)
records = jsondecode(each.value.records)
set_identifier = lookup(each.value, "set_identifier", null)
health_check_id = lookup(each.value, "health_check_id", null)
multivalue_answer_routing_policy = lookup(each.value, "multivalue_answer_routing_policy", null)
allow_overwrite = lookup(each.value, "allow_overwrite", false)
}
问题出在模块中
jsondecode(var.records)
的使用上。由于 var.records
包含计算属性,因此 jsondecode
的结果也标记为已计算,并且 Terraform 会抛出错误。
我怀疑 Terraform 不会在计划时执行 jsondecode 函数,只要其操作数包含计算属性(当它不包含任何计算属性时,它确实会在计划时执行),但我不完全确定。这可以解释为什么它没有弄清楚
local.recordset
中的键实际上在计划时是已知的。
在问题评论中链接到的示例模块中,似乎他们试图通过显式接受json编码的输入来解决这个问题(它不太可能包含计算的属性,否则你也可以将其传递给通过
var.records
将模块作为普通的 HCL 映射/对象;我怀疑这些记录包含来自当前状态之外的信息)作为单独的输入变量。
因此,作为一个快速修复:如果这些记录是由在状态中计算的信息构造的,则不要对
jsondecode
输入变量应用 records
函数。