sam*_*sam 5 amazon-web-services amazon-route53 terraform terraform-provider-aws
我正在尝试使用模块概念创建 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)
}
Run Code Online (Sandbox Code Playgroud)
小智 0
jsondecode(var.records)
问题出在模块中的使用上。由于var.records
包含计算的属性,因此结果jsondecode
也被标记为计算的,并且 Terraform 会抛出错误。
我怀疑 Terraform 不会在计划时执行 jsondecode 函数,前提是其操作数包含计算的属性(当它不包含任何计算的属性时,它确实会在计划时执行),但我不完全确定。这可以解释为什么它没有弄清楚其中的密钥local.recordset
实际上在计划时是已知的。
在问题评论中链接的示例模块中,似乎他们试图通过显式接受 json 编码的输入来解决这个问题(这不太可能包含计算的属性,否则您也可以将其传递给模块,就像正常的 HCL 映射/对象通过var.records
;我怀疑这些记录包含来自当前状态之外的信息)作为单独的输入变量。
因此,作为一个快速修复:如果这些记录是由在状态中计算的信息构造的,则不要在输入变量jsondecode
上应用该函数。records
归档时间: |
|
查看次数: |
11578 次 |
最近记录: |