链接到在 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
必须是 map
或 set
[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_acl
的 name
参数是唯一的,可以识别该特定资源的所有实例,您可以编写 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 需要在计划阶段知道该值,以便解释计划在应用时将创建哪些资源实例。
如何链接到使用计数创建的资源?或者如果我想将额外的资源链接到它们,我不应该用 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
必须是 map
或 set
[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_acl
的 name
参数是唯一的,可以识别该特定资源的所有实例,您可以编写 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 需要在计划阶段知道该值,以便解释计划在应用时将创建哪些资源实例。