0Pricing
Terraform Infrastructure as Code · 课时

使用 `for_each` 和 `count` 循环

学习使用 `count` 和 `for_each` 创建资源或模块的多个实例,从而高效处理集合和映射。

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

循环简介

使用 Terraform 管理基础设施时,您经常需要创建多个相似的资源。想象一下,您需要创建 10 台 Web 服务器或 5 个数据库实例。如果反复编写相同的代码块,会非常繁琐且容易出错!

本课将介绍 Terraform 的两个强大功能:count 和 for_each。它们可以帮助您高效地配置多个资源,同时保持配置简洁且易于扩展。

为什么使用 `count` 和 `for_each`?

使用 count 和 for_each 这样的循环可以带来显著好处:

  • 减少重复:只需编写一次基础设施代码,即可重复使用。
  • 提高可读性:让您的配置更加简洁,也更易于理解。
  • 可扩展性:只需更改单个值或集合,即可轻松调整资源数量。
  • 保持一致:确保所有相似资源都以相同方式配置。

使用 `count` 进行简单重复

当您需要创建某个资源或模块的多个几乎完全相同的实例时,count 元参数非常适合。您提供一个整数值,Terraform 就会创建相应数量的实例。

使用 count 创建的每个实例都会获得一个索引,从 0 开始,到 count - 1 结束。您可以使用 count.index 访问此索引。

示例:使用 `count` 创建多个 EC2 实例

让我们配置三个完全相同的 AWS EC2 实例。请注意,如何使用 count.index 为每台服务器设置唯一名称。

provider "aws" {
  region = "us-east-1"
}

resource "aws_instance" "web_server" {
  count         = 3
  ami           = "ami-053b0dcd10dcf2f56" # Ubuntu Server 20.04 LTS
  instance_type = "t2.micro"
  tags = {
    Name = "WebServer-${count.index}"
  }
}

理解 `count.index`

在前面的示例中,${count.index} 会针对每个实例自动解析为 0、1 和 2。这样,您就可以创建唯一标识符,或为每个实例调整属性。

如果没有 count.index,三台服务器的“Name”标签将完全相同,这可能会在 AWS 中造成混淆或引发问题。

认识 `for_each`

count 非常适合简单重复,而 for_each 提供了更大的灵活性。它会遍历字符串集合或字符串映射,为每个元素创建一个实例。

当您需要管理具有不同配置的资源,或资源数量由非数值集合决定时(例如环境名称列表或用户设置映射),for_each 尤其适合。

示例:使用集合配合 `for_each`

这里创建三个 S3 存储桶,每个存储桶都以 for_each 集合中的一个元素命名。我们使用 each.value 访问当前迭代项。

provider "aws" {
  region = "us-east-1"
}

resource "aws_s3_bucket" "app_buckets" {
  for_each = toset(["prod-app-data", "dev-app-logs", "test-app-assets"])
  bucket   = each.value
  acl      = "private"
  tags = {
    Environment = split("-", each.value)[0]
  }
}

示例:使用映射配合 `for_each`

使用映射可以为每个资源定义更复杂且独特的配置。这里根据环境键创建具有不同版本控制设置的 S3 存储桶。

您可以使用 each.key 访问键,使用 each.value 访问值。

provider "aws" {
  region = "us-east-1"
}

resource "aws_s3_bucket" "configured_bucket" {
  for_each = {
    production = { name = "prod-data-bucket", versioning = true }
    development = { name = "dev-logs-bucket", versioning = false }
  }
  bucket        = each.value.name
  acl           = "private"
  versioning {
    enabled = each.value.versioning
  }
  tags = {
    Environment = each.key
  }
}

`count` 与 `for_each`:明智选择

什么时候应该使用哪一个?

  • 使用 count:适用于简单的数值迭代,用于创建相同的资源,重点在于资源数量。当您只需要通过索引进行区分时,它是不错的选择。
  • 使用 for_each:适用于遍历复杂集合(集合或映射),以及资源需要根据集合元素生成唯一标识符或属性的情况。当每个实例都有清晰且唯一的逻辑标识符时,通常优先选择它。

快速检查:循环

请考虑这样一种场景:您需要为组织中的每个团队创建一个 S3 存储桶,并且每个存储桶都需要使用该团队定义的特定保留策略。

回顾:高效创建资源

做得很好!您已经学会了如何利用 count 和 for_each,让 Terraform 配置更加动态和高效。

  • count 用于对相同资源进行简单的数值重复,并使用 count.index 进行区分。
  • for_each 用于遍历集合或映射,使用 each.key 和 each.value 创建具有唯一属性的不同资源。

这些结构是以代码形式管理可扩展且易于维护的基础设施的基础!

常见问题解答

「使用 `for_each` 和 `count` 循环」课时是免费的吗?

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

「使用 `for_each` 和 `count` 循环」这节课中我会学到什么?

学习使用 `count` 和 `for_each` 创建资源或模块的多个实例,从而高效处理集合和映射。 你通过在浏览器中直接运行的动手代码来练习 Terraform Infrastructure as Code,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

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

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

「使用 `for_each` 和 `count` 循环」课时需要多长时间?

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

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

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

此课程中的所有课时

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