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

Posted

技术标签:

【中文标题】你可以在 Terraform 中将块作为变量传递,引用资源嵌套块内容的类型吗?【英文标题】:Can you pass blocks as variables in Terraform, referencing the type of a resource's nested block contents? 【发布时间】: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 语言。 【参考方案1】:

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

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

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

【讨论】:

感谢您的反馈。据我所知,没有什么可以做的了。问题主要是您是否可以将块作为来自变量的属性发送。似乎带有 for_each 的动态块是尝试完成此操作的唯一选择。

以上是关于你可以在 Terraform 中将块作为变量传递,引用资源嵌套块内容的类型吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PLSQL 过程中将绑定变量作为 IN OUT 参数传递

如何在数据块中将数据框作为笔记本参数传递?

Terraform 模块作为“自定义函数”

如何在 Objective-C 中将 BOOL 变量作为参数传递?

go语言中将函数作为变量传递

在 Terraform 中将多个 AWS 账户作为环境处理的最佳方式是啥?