【发布时间】:2022-01-19 18:08:49
【问题描述】:
我正在尝试在 Terraform 中构建一个 Web ACL 资源 https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/wafv2_web_acl
这个资源有嵌套块规则->动作->块和规则->动作->计数
我想要一个变量,它的类型允许我将操作设置为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 {}
}
}
非常感谢您的帮助!
【问题讨论】:
-
研究更多,目前看来这不是一个选择:
There are no plans to support treating a nested block type as if it were an argument, if that’s what you mean.discuss.hashicorp.com/t/use-block-variables/5527/3 -
听起来你在问 Terraform DSL 是否支持泛型,在这种情况下,答案是:不。它们刚刚在最近的 1.18 中被引入到 Go 中,因此它们可能需要一段时间才能出现在派生的 DSL 中。
-
Terraform 语言中可用的内容与 Go 语言中可用的内容没有特别的关系。 Terraform 本身及其语言解析器是用 Go 编写的,但 Terraform 语言并非源自 Go 语言。