您可以在 Terraform 中将块作为变量传递,引用资源的嵌套块内容的类型吗?

Pat*_*one 12 terraform hcl

我正在尝试在 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 {}
    }

   ...
}
Run Code Online (Sandbox Code Playgroud)

与计数:

resource "aws_wafv2_web_acl" "example" {
  ...

  rule {
   ...

    action {
      count {}
    }

   ...
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我可以通过布尔变量和动态块以非常非声明性的方式实现此结果。

我的问题是,变量的类型可以引用嵌套块的类型,从而可以将嵌套块的内容传递到变量中吗?

我想要实现的目标与此类似(非工作语法):

resource "aws_wafv2_web_acl" "example" {
  ...

  rule {
   ...

    action = var.action_block

   ...
  } 
}
Run Code Online (Sandbox Code Playgroud)
variable "action_block" {
  description = "Action of the rule"
  type         = <whatever type is accepted by aws_wafv2_web_acl->rule->action>
}
Run Code Online (Sandbox Code Playgroud)

以便它可以以与此类似的方式传递下去

module "my_waf" {
  source                   = "../modules/waf"
  action_block {
    block {}
  }
}
Run Code Online (Sandbox Code Playgroud)

作为参考,我试图避免:

    dynamic "action" {
      for_each = var.block  ? [] : [1]
      content {
        count {}
      }
    }

    dynamic "action" {
      for_each = var.block ? [1] : []
      content {
        block {}
      }
    }

Run Code Online (Sandbox Code Playgroud)

非常感谢你的帮助!

Mar*_*ins 9

我能想象到的唯一边际改进是将dynamic块移得更深一层,也许是为了让读者清楚该action块将始终存在,并且内部的countblock块具有动态行为:

  action {
    dynamic "count" {
      for_each = var.block ? [] : [1]
      content {}
    }
    dynamic "block" {
      for_each = var.block ? [1] : []
      content {}
    }
  }
Run Code Online (Sandbox Code Playgroud)

您还可以通过其他一些方法来制定这两个for_each表达式,以便输入可以具有不同的形状,但是您需要自己为该变量编写一个合适的类型约束,该约束与您想要应用于它的任何条件相匹配。