您能否在 Terraform 中将块作为变量传递,引用资源的嵌套块内容的类型?
Can you pass blocks as variables in Terraform, referencing the type of a resource's nested block contents?
我正在尝试在 Terraform 中构建 Web ACL 资源
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/wafv2_web_acl
此资源有嵌套块 rule->action->block 和 rule->action->count
我想要一个类型允许我将操作设置为 count {}
或 block{}
的变量,以便可以进行以下两种配置:
有方块:
resource "aws_wafv2_web_acl" "example" {
...
rule {
...
action {
block {}
}
...
}
计数:
resource "aws_wafv2_web_acl" "example" {
...
rule {
...
action {
count {}
}
...
}
到目前为止,我可以使用布尔变量和动态块以非常非声明的方式实现此结果。
我的问题是,变量的类型是否可以引用嵌套块的类型,从而将嵌套块的内容传入变量?
我想要实现的是类似于此的东西(无效语法):
resource "aws_wafv2_web_acl" "example" {
...
rule {
...
action = var.action_block
...
}
}
variable "action_block" {
description = "Action of the rule"
type = <whatever type is accepted by aws_wafv2_web_acl->rule->action>
}
这样它就可以以类似的方式传递下去
module "my_waf" {
source = "../modules/waf"
action_block {
block {}
}
}
供参考,我要避免的事情:
dynamic "action" {
for_each = var.block ? [] : [1]
content {
count {}
}
}
dynamic "action" {
for_each = var.block ? [1] : []
content {
block {}
}
}
非常感谢您的帮助!
我能想到的唯一边际改进是将 dynamic
块更深一层,也许可以让 reader 清楚 action
块将始终存在里面的 count
或 block
块具有动态行为:
action {
dynamic "count" {
for_each = var.block ? [] : [1]
content {}
}
dynamic "block" {
for_each = var.block ? [1] : []
content {}
}
}
还有一些其他方法可以制定这两个 for_each
表达式,以便输入可以具有不同的形状,但是您需要自己为该变量写出一个合适的类型约束,以匹配任何内容您要应用的条件。
我正在尝试在 Terraform 中构建 Web ACL 资源 https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/wafv2_web_acl
此资源有嵌套块 rule->action->block 和 rule->action->count
我想要一个类型允许我将操作设置为 count {}
或 block{}
的变量,以便可以进行以下两种配置:
有方块:
resource "aws_wafv2_web_acl" "example" {
...
rule {
...
action {
block {}
}
...
}
计数:
resource "aws_wafv2_web_acl" "example" {
...
rule {
...
action {
count {}
}
...
}
到目前为止,我可以使用布尔变量和动态块以非常非声明的方式实现此结果。
我的问题是,变量的类型是否可以引用嵌套块的类型,从而将嵌套块的内容传入变量?
我想要实现的是类似于此的东西(无效语法):
resource "aws_wafv2_web_acl" "example" {
...
rule {
...
action = var.action_block
...
}
}
variable "action_block" {
description = "Action of the rule"
type = <whatever type is accepted by aws_wafv2_web_acl->rule->action>
}
这样它就可以以类似的方式传递下去
module "my_waf" {
source = "../modules/waf"
action_block {
block {}
}
}
供参考,我要避免的事情:
dynamic "action" {
for_each = var.block ? [] : [1]
content {
count {}
}
}
dynamic "action" {
for_each = var.block ? [1] : []
content {
block {}
}
}
非常感谢您的帮助!
我能想到的唯一边际改进是将 dynamic
块更深一层,也许可以让 reader 清楚 action
块将始终存在里面的 count
或 block
块具有动态行为:
action {
dynamic "count" {
for_each = var.block ? [] : [1]
content {}
}
dynamic "block" {
for_each = var.block ? [1] : []
content {}
}
}
还有一些其他方法可以制定这两个 for_each
表达式,以便输入可以具有不同的形状,但是您需要自己为该变量写出一个合适的类型约束,以匹配任何内容您要应用的条件。