使用 `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 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 `for_each` 和 `count` 循环
- Terraform 内置函数
- 条件表达式与扩展表达式
- 用于嵌套配置的动态块