0Pricing
Terraform Infrastructure as Code · 课时

用于嵌套配置的动态块

使用动态块以编程方式生成重复的嵌套配置块,免去为安全组规则等内容复制粘贴。

用于嵌套配置的动态块 是 CoddyKit 上的免费 Terraform Infrastructure as Code 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Terraform Infrastructure as Code 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Terraform Infrastructure as Code 课程共包含 4 节课。

重复问题

某些资源包含重复的嵌套块,例如安全组中的多个 ingress 规则。逐个手写既冗长,也难以保持 DRY。动态块可以根据集合生成这些块。

先看静态块

下面是手动编写的版本:三个几乎完全相同的 ingress 块。请想象一下维护十几个这样的块。

resource "aws_security_group" "web" {
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

动态块的组成

一个 dynamic 块包含:与嵌套块名称匹配的标签、一个 for_each 集合,以及用于描述每个生成实例的 content 块。

dynamic "ingress" {
  for_each = var.rules
  content {
    from_port   = ingress.value.port
    to_port     = ingress.value.port
    protocol    = "tcp"
    cidr_blocks = ingress.value.cidrs
  }
}

迭代器对象

在 content 中,可以通过以块标签命名的对象引用当前元素。该对象提供 .value(元素)和 .key(映射键或列表索引)。

定义输入变量

使用带类型的变量驱动动态块。对象列表可以让每条规则都清晰地说明自身含义。

variable "rules" {
  type = list(object({
    port  = number
    cidrs = list(string)
  }))
}

整合起来

现在,无论传入多少条规则,该资源都能保持简洁。

resource "aws_security_group" "web" {
  name = "web-sg"
  dynamic "ingress" {
    for_each = var.rules
    content {
      from_port   = ingress.value.port
      to_port     = ingress.value.port
      protocol    = "tcp"
      cidr_blocks = ingress.value.cidrs
    }
  }
}

重命名迭代器

iterator 参数可以重命名迭代变量。在嵌套动态块中,这有助于避免混淆。

dynamic "ingress" {
  for_each = var.rules
  iterator = rule
  content {
    from_port = rule.value.port
    to_port   = rule.value.port
  }
}

有条件地跳过块

传入空集合即可生成零个块。在 for_each 上使用三元表达式,可以让块变为可选项。

dynamic "logging" {
  for_each = var.enable_logging ? [1] : []
  content {
    target_bucket = var.log_bucket
  }
}

嵌套动态块

动态块可以嵌套。请使用不同的迭代器,使内部块能够明确引用两个层级。

dynamic "setting" {
  for_each = var.settings
  iterator = s
  content {
    namespace = s.value.namespace
    name      = s.value.name
    value     = s.value.value
  }
}

何时不应使用动态块

动态块会增加间接性,并可能降低可读性。如果只有一两个静态块,请直接保留其字面定义。当数量由数据驱动时,再使用动态块。

检查结果

运行计划,确认生成的块符合预期。Terraform 会将集合中的每个元素展开为一个具体的嵌套块。

terraform plan

快速检查

测试您对动态块的了解。

回顾:保持嵌套配置简洁

动态块可以根据数据生成嵌套配置:

  • for_each 驱动迭代;content 定义每个块。
  • 迭代器提供 .value 和 .key。
  • 空集合可以使块变为可选项。
  • 请谨慎使用,以保持配置的可读性。

常见问题解答

「用于嵌套配置的动态块」课时是免费的吗?

是的 — 「用于嵌套配置的动态块」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Terraform Infrastructure as Code 课程的其余内容,请升级到 CoddyKit PRO。 Terraform Infrastructure as Code 课程共包含 4 节课。

「用于嵌套配置的动态块」这节课中我会学到什么?

使用动态块以编程方式生成重复的嵌套配置块,免去为安全组规则等内容复制粘贴。 你通过在浏览器中直接运行的动手代码来练习 Terraform Infrastructure as Code,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Terraform Infrastructure as Code 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Terraform Infrastructure as Code 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「用于嵌套配置的动态块」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Terraform Infrastructure as Code 课中编写并运行代码吗?

能。每节 Terraform Infrastructure as Code 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 `for_each` 和 `count` 循环
  2. Terraform 内置函数
  3. 条件表达式与扩展表达式
  4. 用于嵌套配置的动态块
← 返回 Terraform Infrastructure as Code