在避免这5个新手错误之前,别动 Terraform

发布: (2025年12月6日 GMT+8 23:48)
7 min read
原文: Dev.to

Source: Dev.to

🌟 介绍

欢迎回来,开发者们!

几周前,我分享了《Terraform 的 5 条最佳安全实践》。该指南面向已经每天使用 Terraform——在大规模基础设施上工作、审查模块、通过 CI/CD 流水线推送更改的朋友们。

但初学者怎么办?

那些刚刚掌握 DevOps 基础——Linux、网络、Docker、Git——并正迈入云世界的人。对他们来说,基础设施即代码(IaC)一开始可能会让人望而生畏。Terraform 看起来很简单,但当你开始编写配置时,学习曲线会变得相当陡峭。IaC 起初是一颗难啃的坚果。

为了让你的学习之路更顺畅、避免困惑,让我们拆解 初学者在学习 Terraform 时常犯的 5 大错误——以及如何规避它们。

不多说了…… 让我们开始吧!

🌟 在深入之前…先做这些

确保你的系统已经安装了 Terraform。除非你能运行 terraform initterraform apply,否则一切都没有意义。

因为我是 AWS Community Builder,演示通常使用 AWS。要跟着操作,你需要把 Terraform 连接到你的 AWS 账户。可以通过两种方式完成:

  1. 直接在终端导出 AWS 凭证

    export AWS_ACCESS_KEY_ID=YOUR_KEY_ID
    export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY

    这样可以工作,但并不是长期使用的最佳方案。

  2. 安装 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 初学者最常卡住的障碍。祝你部署愉快!

Back to Blog

相关文章

阅读更多 »