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

问题描述 投票:0回答:1

我正在尝试使用模块概念创建 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)
}
amazon-web-services terraform terraform-provider-aws amazon-route53
1个回答
0
投票

问题出在模块中

jsondecode(var.records)
的使用上。由于
var.records
包含计算属性,因此
jsondecode
的结果也标记为已计算,并且 Terraform 会抛出错误。

我怀疑 Terraform 不会在计划时执行 jsondecode 函数,只要其操作数包含计算属性(当它不包含任何计算属性时,它确实会在计划时执行),但我不完全确定。这可以解释为什么它没有弄清楚

local.recordset
中的键实际上在计划时是已知的。

在问题评论中链接到的示例模块中,似乎他们试图通过显式接受json编码的输入来解决这个问题(它不太可能包含计算的属性,否则你也可以将其传递给通过

var.records
将模块作为普通的 HCL 映射/对象;我怀疑这些记录包含来自当前状态之外的信息)作为单独的输入变量。

因此,作为一个快速修复:如果这些记录是由在状态中计算的信息构造的,则不要对

jsondecode
输入变量应用
records
函数。

© www.soinside.com 2019 - 2024. All rights reserved.