链接到在 Terraform 中使用计数创建的资源

Chain to resources created with count in Terraform

如何链接到使用计数创建的资源?或者如果我想将额外的资源链接到它们,我不应该用 count 创建它们吗?按照下面的方式进行,在初始资源中使用 count 并在链接资源中使用 for_each 会出现以下错误:

The given "for_each" argument value is unsuitable: the "for_each" argument must be a map, or set of strings, and you have provided a value of type number.

我明白为什么会出现这个错误,但我也对这里的最佳实践感到困惑。

resource "aws_wafv2_web_acl" "waf_acl_regional" {
  count       = var.env == "prod" ? 1 : 0
  name        = "${var.project}-${var.env}"
  description = "A simple WAF ACL for ${var.env} environment."
  scope       = "REGIONAL"

  default_action {
    allow {}
  }

  rule {
    ...
  }

  visibility_config {
    ...
  }
}

resource "aws_wafv2_web_acl_association" "example" {
  for_each     = aws_wafv2_web_acl.waf_acl_regional
  resource_arn = aws_lb.hasura.arn
  web_acl_arn  = each.value.arn
}

感谢您的帮助!

您已指示 aws_wafv2_web_acl 资源使用 count meta-argument [1],顾名思义,它使用数字。它创建一个数组,您可以在其中通过引用数组的元素来访问元素。在你的情况下,那将是 aws_wafv2_web_acl.waf_acl_regional[0]。另一方面,for_each meta-argument [2] 使用 key/value 对。这意味着为了获取一个值,您必须有一个键,该键将用作对值的引用。例如,这将类似于 aws_wafv2_web_acl.waf_acl_regional["prod"]。这进一步意味着 var.env 必须是 mapset [3] 类型。这些类型是 Terraform 中的复杂类型。


[1] https://www.terraform.io/language/meta-arguments/count

[2] https://www.terraform.io/language/meta-arguments/for_each

[3] https://www.terraform.io/language/expressions/type-constraints#complex-types

为了将 count 产生的内容投射到 for_each 需要的内容中,您需要编写一个稍微更详细的表达式来向 Terraform 解释它应该使用哪些键来识别实例。

例如,如果 aws_wafv2_web_aclname 参数是唯一的,可以识别该特定资源的所有实例,您可以编写 for expression 将对象列表投影到键是 name 值的映射:

  for_each = {
    for acl in aws_wafv2_web_acl.waf_acl_regional : acl.name => acl
  }

这依赖于 count 资源生成列表这一事实,该列表是使用 for 表达式投影的合适值。执行此操作时,重要的是 select 一个属性,其值在配置中静态定义,而不是在应用步骤期间由远程系统动态选择。例如,许多资源类型的 id 属性是远程系统动态选择的唯一 ID,因此不适合用作 for_each 键。

这很重要,因为 Terraform 需要在计划阶段知道该值,以便解释计划在应用时将创建哪些资源实例。