在进行基础设施即代码(Infrastructure as Code,IaC)实践时,Terraform 状态文件的管理一直是一个重要话题。本文将介绍如何使用 Git 作为 Terraform 的后端存储,这是一个特别适合个人项目和小型团队的解决方案。

背景

在使用 Terraform 管理多个项目的 GitHub Actions 密钥时,我遇到了状态文件存储的问题:

  • AWS S3 虽然是常用选择,但需要额外的成本
  • Cloudflare R2 等替代方案配置复杂,且存在诸多限制
  • 对于开发者来说,Git 是最熟悉的版本控制工具

经过调研,我发现了 terraform-backend-git 这个优秀的工具,它完美地解决了上述问题。

实施步骤

1. 环境准备

首先需要安装 terraform-backend-git:

  1. 下载 terraform-backend-git 二进制文件

  2. 将其放置在系统 PATH 中(推荐放在 ~/.bin 目录)

  3. ~/.zshrc 中添加:

    export PATH=$PATH:$HOME/.bin
    

2. 项目结构

你可以参考我的模板仓库:https://github.com/zhaochunqi/terraform-git-backend-template

项目结构如下:

.
├── .envrc                 # 环境变量配置
├── justfile              # 任务自动化配置
├── README.md
├── sub/
│   └── terragrunt.hcl    # 子模块配置
└── terragrunt.hcl        # 主配置文件

3. 配置说明

项目使用了以下工具来优化工作流:

4. 实施流程

  1. 创建用于存储 Terraform 状态的 Git 仓库(注意:需要包含 README 文件,避免空仓库)
  2. 配置项目中的 state 路径,确保与 GitHub 仓库路径匹配
  3. 使用 just 命令启用 terraform-backend-git 后端(需要配置 GitHub Token)
  4. 执行标准的 Terraform 工作流(init、plan、apply 等)

最佳实践

  1. 确保 GitHub Token 安全存储,避免泄露
  2. 定期备份状态文件
  3. 在团队中统一使用相同的工具版本
  4. 遵循 Git 分支管理最佳实践

总结

使用 Git 作为 Terraform 后端存储是一个轻量级且高效的解决方案,特别适合:

  • 个人项目开发
  • 小型团队协作
  • 需要版本控制的基础设施管理

通过结合 direnv、just 和 terragrunt 等工具,我们可以构建一个更加强大和易于管理的 IaC 工作流。