for_each 值取决于资源属性,这些属性在应用之前无法确定,因此 Terraform 无法预测将创建多少个实例

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