Terraform – Dynamic Block使用

Terraform 的 dynamic block 是一种特殊的语法结构,用来动态生成嵌套块。它的主要作用是根据变量、列表或映射动态创建重复的块,从而避免复制粘贴大量几乎相同的代码,提高配置的灵活性和可维护性。

例如,在一个资源中,某些嵌套块(如安全组规则、拓扑配置等)可能只在特定条件下需要生成,通过 dynamic block 我们可以根据条件判断是否生成对应块。

基本语法

dynamic block 的基本语法格式如下:

dynamic "block_label" {
  for_each = <表达式>         # 要遍历的集合(列表、映射或集合)
  iterator = <迭代器名称>      # 可选,默认使用 block_label
  content {
    # 此处填写每个生成块的内容,可使用 iterator.value 引用当前元素
  }
}
  • block_label:指定生成的嵌套块的类型,例如 “ingress”、“topology” 等。
  • for_each:指定要遍历的集合。如果集合为空,则不会生成该嵌套块。
  • iterator:为当前迭代元素设置的变量名,默认为 block_label。常用属性有 key 和 value。
  • content:定义每个动态生成块的内容。

动态生成aws security group

当需要批量创建安全组规则时,也可以用 dynamic block 遍历一个规则列表,根据规则的类型动态生成 ingress 或 egress 块。

provider "aws" {
  region = "ap-southeast-1"
}

variable "sg_ports" {
  type = list(object({
    from_port   = number
    to_port     = number
    protocol    = string
    cidr_blocks = list(string)
  }))
  default = [
    {
      from_port   = 80
      to_port     = 80
      protocol    = "tcp"
      cidr_blocks = ["0.0.0.0/0"]
    },
    {
      from_port   = 443
      to_port     = 443
      protocol    = "tcp"
      cidr_blocks = ["0.0.0.0/0"]
    }
  ]
}

resource "aws_security_group" "sg1" {
  name = "dynamic_sg"

  dynamic "ingress" {
    for_each = var.sg_ports
    iterator = data
    content {
      from_port   = data.value.from_port
      to_port     = data.value.to_port
      protocol    = data.value.protocol
      cidr_blocks = data.value.cidr_blocks
    }
  }
}

Loading

Facebook评论