🚀 Terraform 第20天:使用自定义 Terraform 模块构建生产基础设施
发布: (2025年12月26日 GMT+8 00:33)
4 min read
原文: Dev.to
Source: Dev.to
🧠 什么是 Terraform 模块?
Terraform 模块是一个可复用、独立的 Terraform 代码包。
模块中的典型文件:
main.tf– 资源variables.tf– 输入outputs.tf– 暴露的值
Terraform 将每个目录视为一个模块。
模块可以帮助你:
- 封装复杂性
- 强制执行标准
- 重用基础设施模式
- 在团队和环境之间清晰扩展
🧩 Terraform 模块的类型
1️⃣ 公共模块
- 可从 Terraform Registry 获取
- 由提供者或社区维护
- 不能在内部修改
2️⃣ 合作伙伴模块
- 由 HashiCorp 与合作伙伴共同管理
- 已验证且可用于生产
- 仍然受外部控制
3️⃣ 自定义模块 (Day 20 的重点)
- 由你或你的组织创建并维护
- 完全掌控代码、版本、安全和更新
生产系统在很大程度上依赖自定义模块。
🏗 根模块 vs 自定义模块
🔹 根模块
- Terraform 项目的入口点
- 执行
terraform init和terraform apply的位置 - 编排整个基础设施
- 引用并连接自定义模块
🔹 自定义模块
- 作为子目录存放在根模块内部
- 每个模块承担单一职责
- 彼此之间不直接通信
- 根模块充当中心协调者
📂 典型项目结构(Day 20 风格)
terraform-project/
├── main.tf # Root module
├── variables.tf
├── outputs.tf
├── modules/
│ ├── vpc/
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ └── outputs.tf
│ ├── eks/
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ └── outputs.tf
│ ├── iam/
│ └── secrets/
每个模块封装一个单独的基础设施领域。
🔁 模块之间的交互(非常重要)
自定义模块之间永远不直接通信。所有交互都通过根模块完成:
- 根模块调用自定义模块。
- 传递输入变量。
- 自定义模块创建资源。
- 自定义模块暴露输出。
- 根模块使用这些输出。
- 将输出作为输入传递给其他模块。
这确保了:
- 松耦合
- 清晰的依赖流
- 可维护的架构
🔗 示例:VPC → EKS 依赖流
- VPC 模块输出
vpc_id。 - 根模块捕获
vpc_id。 - 根模块将
vpc_id传递给 EKS 模块。 - EKS 资源在正确的 VPC 中创建。
随着基础设施的增长,这种模式能够平滑扩展。
📥 模块化设计中的变量与输出
变量
- 定义模块期望的输入。
- 由根模块传入。
- 让模块保持灵活。
输出
- 定义模块暴露的内容。
- 被根模块使用。
- 实现模块间的协同。
模块的行为类似函数:输入 → 处理 → 输出。
🏁 结论
Day 20 将 Terraform 从学习模式转向架构模式。本节重点强调:
- Terraform 不仅仅是管理资源。
- Terraform 关乎系统设计。
- 自定义模块是生产 IaC 的支柱。
掌握模块化的 Terraform 架构后,你就能构建大型、可维护、企业级的云平台——这正是 Terraform 在真实世界中的使用方式。