我试图在Terraform中构建一个Web资源https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/wafv2_web_acl
这个资源有嵌套块规则->action->块和规则-> 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 {}
}
}非常感谢你的帮助!
发布于 2021-12-17 01:05:24
我能想象到的唯一边际改进是将dynamic块移动到更深一级,也许可以向读者表明,action块将始终存在,而具有动态行为的是内部的count或block块:
action {
dynamic "count" {
for_each = var.block ? [] : [1]
content {}
}
dynamic "block" {
for_each = var.block ? [1] : []
content {}
}
}您还可以用其他一些方法来构造这两个for_each表达式,以便输入可以具有不同的形状,但是您需要自己为该变量编写一个合适的类型约束,该约束与您想要应用到的任何条件相匹配。
https://stackoverflow.com/questions/70382612
复制相似问题