Version Management
ใช้ tfenv หรือ asdf จัดการหลาย Terraform version — สำคัญใน team ที่มี project หลาย version
ทำไมต้องจัดการ Version?
- Project A ใช้ Terraform 1.5
- Project B ใช้ Terraform 1.9
- ติดตั้งแค่ version เดียว → switch ลำบาก
→ Version manager = solution
Tools
| Tool | Description | Best For |
|---|---|---|
| tfenv | Terraform-specific | Terraform only |
| asdf | Multi-language | Multiple tools (TF + Node + Python) |
| mise (rtx) | Modern asdf alternative | Faster, similar features |
tfenv
tfenv — most popular for Terraform
Install
# macOS
brew install tfenv
# Linux
git clone https://github.com/tfutils/tfenv.git ~/.tfenv
echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bashrc
Usage
# List available versions
tfenv list-remote
# Install
tfenv install 1.9.8
tfenv install 1.5.7
tfenv install latest
# Use
tfenv use 1.9.8
tfenv use latest
# Show current
tfenv version-name
# Uninstall
tfenv uninstall 1.4.0
Per-Project Version (.terraform-version)
.terraform-version
1.9.8
ใส่ใน root ของ project — tfenv auto switch เมื่อเข้า folder
$ cd project-a
$ terraform version
Terraform v1.5.7 # ← .terraform-version = 1.5.7
$ cd ../project-b
$ terraform version
Terraform v1.9.8 # ← .terraform-version = 1.9.8
Min/Latest Required
.terraform-version
min-required # ใช้ version ขั้นต่ำที่ระบุใน required_version
Terraform code:
terraform {
required_version = ">= 1.5.0"
}
→ tfenv install 1.5.0
asdf
asdf — multi-language version manager
Install
brew install asdf
echo '. $(brew --prefix asdf)/libexec/asdf.sh' >> ~/.zshrc
Add Terraform Plugin
asdf plugin add terraform
Usage
# List versions
asdf list all terraform
# Install
asdf install terraform 1.9.8
asdf install terraform 1.5.7
# Set global
asdf global terraform 1.9.8
# Set local (per-project)
asdf local terraform 1.9.8
→ Creates .tool-versions:
.tool-versions
terraform 1.9.8
nodejs 20.10.0
python 3.12.1
Auto Switch
asdf switches auto เมื่อเข้า folder ที่มี .tool-versions
mise (rtx)
mise — fast modern version manager
# Install
brew install mise
# Add to shell
echo 'eval "$(mise activate zsh)"' >> ~/.zshrc
# Use
mise use [email protected]
.mise.toml
[tools]
terraform = "1.9.8"
nodejs = "20"
Version Constraints in Terraform
ใช้คู่กับ version manager:
versions.tf
terraform {
required_version = ">= 1.5.0, < 2.0.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.70"
}
}
}
ถ้า CLI version ผิด → fail ทันที:
Error: Unsupported Terraform Core version
This configuration does not support Terraform version 1.4.0
CI/CD with Specific Version
.github/workflows/terraform.yml
- name: Setup Terraform
uses: hashicorp/setup-terraform@v3
with:
terraform_version: 1.9.8 # specific version
หรือใช้ .terraform-version:
- name: Setup Terraform
uses: hashicorp/setup-terraform@v3
with:
terraform_version: ${{ steps.tfver.outputs.version }}
- name: Read .terraform-version
id: tfver
run: echo "version=$(cat .terraform-version)" >> $GITHUB_OUTPUT
Upgrade Strategy
Patch Upgrades (e.g., 1.9.5 → 1.9.8)
- Safe — bug fixes only
- Test ใน CI ก่อน
Minor Upgrades (e.g., 1.5 → 1.9)
- New features, mostly backwards compatible
- Read release notes
- Test ใน dev environment
Major Upgrades (e.g., 0.x → 1.x)
- Breaking changes
- Read upgrade guide
- Plan migration carefully
Multi-Version in Team
.terraform-version (Project A)
1.5.7
.terraform-version (Project B)
1.9.8
ทุกคนติดตั้ง tfenv → auto switch — ทำงานร่วมกันได้
OpenTofu (Alternative to Terraform)
OpenTofu = community fork ของ Terraform (after BSL license change)
# Install OpenTofu
brew install opentofu
# Use tofu instead of terraform
tofu init
tofu plan
tofu apply
ใช้ syntax + provider เดียวกับ Terraform — drop-in replacement
tenv (alternative tfenv ใหม่)
tenv = modern version manager รองรับ:
- Terraform
- OpenTofu
- Terragrunt
- Atmos
brew install cosmtrek/tap/tenv
tenv tf install 1.9.8
tenv tofu install 1.7.0
tenv tg install 0.62.0
# Auto switch
tenv update-path
ตัวอย่าง: Project Setup
my-project/
├── .terraform-version # 1.9.8
├── .tflint.hcl
├── .pre-commit-config.yaml
├── main.tf
├── variables.tf
├── outputs.tf
└── versions.tf
versions.tf
terraform {
required_version = "~> 1.9.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.70"
}
}
}
.terraform-version
1.9.8
.pre-commit-config.yaml
repos:
- repo: https://github.com/antonbabenko/pre-commit-terraform
rev: v1.96.0
hooks:
- id: terraform_fmt
- id: terraform_validate
Best Practices
✅ DO:
- ใช้ tfenv / asdf / mise
- Pin version ใน .terraform-version
- Match version ระหว่าง local + CI
- Upgrade ใน dev ก่อน prod
- Read changelog ก่อน upgrade
❌ DON'T:
- ห้ามมีหลาย Terraform version ใน CI โดยไม่ตั้งใจ
- ห้าม pin patch ที่ stale มาก
- ห้าม skip changelog ตอน upgrade major
ตัวอย่าง: Upgrade Workflow
Step 1: Update .terraform-version
echo "1.10.0" > .terraform-version
tfenv install 1.10.0
Step 2: Read Changelog
Step 3: Plan + Test
terraform init -upgrade
terraform plan
# ดู diff — ควรเป็น 0 changes
Step 4: Update CI
- uses: hashicorp/setup-terraform@v3
with:
terraform_version: 1.10.0
Step 5: Apply Dev
terraform apply
Step 6: Apply Prod (after monitoring dev)
สรุป
- tfenv / asdf / mise = version managers
.terraform-version= per-project version- Match local + CI versions
- Upgrade carefully — patch first, then minor, then major
- OpenTofu = open-source fork (drop-in replacement)
- tenv = modern tool รองรับหลาย binary
ต่อไป → Terragrunt