Chuyển tới nội dung chính

Bước 2: Cấu trúc project & Git

Nội dung đang được chuẩn bị. Quay lại sớm nhé!

Sắp có trong bài này

Tạo thư mục và khởi tạo Git

mkdir terraform-ec2 && cd terraform-ec2
git init

Tạo .gitignore ngay từ đầu

Đây là bước quan trọng nhất trước khi viết bất kỳ file Terraform nào:

# .gitignore cho Terraform project
cat > .gitignore << 'EOF'
# =============================================
# TERRAFORM — KHÔNG COMMIT
# =============================================

# State files — chứa thông tin nhạy cảm, thay đổi liên tục
*.tfstate
*.tfstate.*
*.tfstate.backup

# Thư mục terraform tải về (providers, modules)
.terraform/
.terraform.tfstate

# Crash log files
crash.log
crash.*.log

# Override files (dùng cho local testing, không chia sẻ)
override.tf
override.tf.json
*_override.tf
*_override.tf.json

# tfvars files có thể chứa secrets
# ⚠️ THẢO LUẬN bên dưới — tùy project
*.tfvars
*.tfvars.json

# Terraform plan output (binary file)
*.tfplan

# =============================================
# LUÔN COMMIT
# =============================================
# ✅ *.tf — code hạ tầng
# ✅ *.tf.json — code dạng JSON
# ✅ .terraform.lock.hcl — lock provider versions
# ✅ *.tfvars.example — template tfvars (không có secrets)
EOF

Quy tắc: File nào commit, file nào không?

FileCommit?Lý do
*.tf✅ Luôn commitCode hạ tầng, cần review và version control
.terraform.lock.hcl✅ Luôn commitLock provider versions cho cả team
*.tfvars.example✅ Commit (template)Mẫu để người khác biết cần khai báo gì
terraform.tfstate❌ Không commitChứa secrets, thay đổi liên tục, dùng remote state
*.tfstate.backup❌ Không commitBackup của state file
.terraform/❌ Không commitProviders binary, modules cache — tải lại bằng terraform init
*.tfvars (có secrets)❌ Không commitAPI keys, passwords, account IDs nhạy cảm
dev.tfvars (không secrets)🤔 Tùy teamNếu chỉ có region, instance type → commit được
*.tfplan❌ Không commitBinary file, outdated nhanh

Thảo luận: .tfvars nên commit không?

Trường hợp 1: Commit .tfvars (giá trị không nhạy cảm)

# dev.tfvars — an toàn để commit
aws_region = "ap-southeast-1"
instance_type = "t2.micro"
environment = "dev"

Trường hợp 2: Không commit .tfvars (có secrets)

# prod.tfvars — KHÔNG commit
db_password = "super-secret-password"
api_key = "sk-xxxxxxxxxxxx"
account_id = "123456789012"

Best practice: Dùng prod.tfvars.example làm template, prod.tfvars thực tế trong .gitignore.

Cấu trúc files Terraform

# Tạo cấu trúc files
touch versions.tf providers.tf main.tf networking.tf
touch variables.tf outputs.tf locals.tf
touch dev.tfvars prod.tfvars.example
touch README.md

Quy ước tách file (không bắt buộc nhưng được khuyến nghị):

FileNội dung
versions.tfterraform {} block — required_version, required_providers
providers.tfprovider "aws" {} config
networking.tfVPC, subnets, IGW, route tables, security groups
main.tfEC2, key pair, IAM role — resources chính
variables.tfTất cả variable blocks
outputs.tfTất cả output blocks
locals.tflocals block — computed values, tags

Commit đầu tiên

git add .gitignore README.md
git commit -m "chore: khởi tạo terraform project với gitignore"

Kết nối với GitHub

# Tạo repo trên GitHub (không init README để tránh conflict)
git remote add origin git@github.com-tronghuan:username/terraform-ec2.git
git branch -M main
git push -u origin main