在避免这5个新手错误之前,别动 Terraform
Source: Dev.to
🌟 介绍
欢迎回来,开发者们!
几周前,我分享了《Terraform 的 5 条最佳安全实践》。该指南面向已经每天使用 Terraform——在大规模基础设施上工作、审查模块、通过 CI/CD 流水线推送更改的朋友们。
但初学者怎么办?
那些刚刚掌握 DevOps 基础——Linux、网络、Docker、Git——并正迈入云世界的人。对他们来说,基础设施即代码(IaC)一开始可能会让人望而生畏。Terraform 看起来很简单,但当你开始编写配置时,学习曲线会变得相当陡峭。IaC 起初是一颗难啃的坚果。
为了让你的学习之路更顺畅、避免困惑,让我们拆解 初学者在学习 Terraform 时常犯的 5 大错误——以及如何规避它们。
不多说了…… 让我们开始吧!
🌟 在深入之前…先做这些
确保你的系统已经安装了 Terraform。除非你能运行 terraform init 和 terraform apply,否则一切都没有意义。
因为我是 AWS Community Builder,演示通常使用 AWS。要跟着操作,你需要把 Terraform 连接到你的 AWS 账户。可以通过两种方式完成:
-
直接在终端导出 AWS 凭证
export AWS_ACCESS_KEY_ID=YOUR_KEY_ID export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY这样可以工作,但并不是长期使用的最佳方案。
-
安装 AWS CLI(推荐)——更干净、更安全,并且可以轻松管理多个配置文件。
aws configure创建一个具有相应权限的 IAM 用户,然后运行上面的命令。
当你的 CLI 和 AWS 凭证配置好后,你就可以开始探索初学者常犯的错误以及如何避免它们了。
❌ 错误 1:把 Terraform 当作脚本工具使用
大多数新人已经接触过某种编程语言——Python、Go、Bash 等——于是认为 Terraform 也会以同样的方式工作:
“我先写了第 1 行,所以 Terraform 会先执行第 1 行……对吗?”
不是的。 Terraform 是 声明式 的,而不是 命令式 的。它 不会 按行逐句执行代码,也不在乎你写资源的顺序。
Terraform 会读取 所有 资源,构建一个 依赖图,并根据实际的依赖关系而非行号来决定执行顺序。
要点: 使用 Terraform 时,你声明 想要什么(例如 EC2 实例、VPC、安全组),让 Terraform 去决定 如何 创建它们。
❌ 错误 2:硬编码所有内容而不使用变量
官方 Terraform 文档经常展示硬编码值的示例(区域、AMI ID、实例类型等)。这在快速测试时没问题,但一旦超出玩具项目,硬编码就会成为负担。
为什么硬编码是问题
- 复制环境时需要手动编辑每个资源。
- 小的改动会变得耗时且容易出错。
解决方案:使用变量
将可配置的值存放在 variables.tf 文件中,并在代码中引用它们。
variable "instance_type" {
description = "EC2 instance type"
type = string
default = "t2.micro"
}
现在你只需在一个地方修改实例类型,Terraform 会在所有使用该变量的地方自动传播更改。
❌ 错误 3:通过 AWS 控制台手动更改资源
Terraform 维护着一个 状态文件(terraform.tfstate),它代表了你基础设施的当前实际状态。在 AWS 控制台手动更改会产生 漂移——即实际存在的资源与 Terraform 认为存在的资源不一致。
漂移的后果
- Terraform 可能会意外地重新创建或删除资源。
- 调试变得异常困难,尤其是对初学者而言。
最佳实践
如果你使用 Terraform 进行资源的创建,就始终使用 Terraform 来更新或删除这些资源。
把 Terraform 当作唯一的真相来源,避免 “ClickOps” 的捷径。
❌ 错误 4:忽视 Terraform 资源之间的依赖关系
Terraform 会自动构建依赖图,但当资源缺少显式引用时,它无法推断出关系。常见的导致顺序错误的场景包括:
- 在 S3 bucket 尚未创建时就应用 bucket policy。
- 在 IAM role 本身创建之前就附加 IAM role。
- 在 Lambda 函数准备好之前就创建 Lambda permission。
解决方案:使用 depends_on
当隐式依赖不足以保证正确顺序时,使用 depends_on 元参数强制排序。
resource "aws_s3_bucket_policy" "example" {
bucket = aws_s3_bucket.example.id
policy = data.aws_iam_policy_document.example.json
depends_on = [aws_s3_bucket.example]
}
显式声明依赖可以确保 Terraform 按正确顺序创建资源。
❌ 错误 5:未使用模块实现可复用性
(如果原文中有第五个错误,请在此处补充;否则请省略此段落。)
牢记这五大陷阱,并采用上述解决方案,你就能避免让 Terraform 初学者最常卡住的障碍。祝你部署愉快!