Terragrunt là gì? Và nó hoạt động như thế nào?
Ở các bài viết trước, chúng ta đã dành nhiều thời gian để tìm hiểu Terraform.
Từ Infrastructure as Code, State, Plan & Apply, Repository Design cho đến Remote State Backend.
Nếu chỉ nhìn vào những ví dụ nhỏ, Terraform gần như hoàn hảo.
Nhưng khi bắt đầu làm việc với một hệ thống thực tế, bạn sẽ nhanh chóng gặp một vấn đề:
Terraform rất giỏi trong việc quản lý infrastructure, nhưng lại không giỏi trong việc quản lý nhiều Terraform project.
Đó chính là lý do Terragrunt ra đời.
Terraform không có vấn đề...
...cho đến khi project lớn lên.
Giả sử bạn có một môi trường production đơn giản.
Production
├── VPC
├── Security Groups
├── IAM
├── RDS
├── Redis
├── EKS
├── S3
├── CloudFront
└── Route53
Mỗi thành phần đều có lifecycle riêng.
Nếu đặt tất cả vào một Terraform project thì:
- plan rất lâu
- apply rất lâu
- state cực lớn
- khó rollback
- dễ conflict khi nhiều người làm việc
Vì vậy mọi người thường tách thành nhiều project nhỏ.
Ví dụ:
live/
production/
vpc/
eks/
rds/
redis/
dns/
iam/
network/
Đây là cách đúng.
Nhưng rồi vấn đề mới lại xuất hiện.
Hàng chục project Terraform
Khi số lượng project tăng lên, bạn sẽ phải viết rất nhiều file gần như giống hệt nhau.
Ví dụ:
terraform {
backend "s3" {
bucket = "company-tf-state"
key = "prod/vpc.tfstate"
region = "ap-southeast-1"
}
}
Project tiếp theo:
terraform {
backend "s3" {
bucket = "company-tf-state"
key = "prod/rds.tfstate"
region = "ap-southeast-1"
}
}
Tiếp tục:
terraform {
backend "s3" {
bucket = "company-tf-state"
key = "prod/eks.tfstate"
region = "ap-southeast-1"
}
}
Lặp lại.
Lặp lại.
Và tiếp tục lặp lại.
Không chỉ backend.
Provider cũng vậy.
provider "aws" {
region = "ap-southeast-1"
}
Biến môi trường cũng vậy.
environment = "production"
Remote state cũng vậy.
Tags cũng vậy.
Version cũng vậy.
Sau vài tháng, repository bắt đầu có hàng nghìn dòng code giống hệt nhau.
DRY bị phá vỡ
Terraform có Module.
Nhưng Module chỉ giải quyết việc tái sử dụng resource.
Ví dụ:
module "vpc" {
...
}
Module không quản lý:
- backend
- provider
- folder structure
- dependency giữa project
- nhiều environment
- orchestration
Nói cách khác:
Terraform Module giúp bạn tái sử dụng infrastructure.
Terragrunt giúp bạn tái sử dụng Terraform project.
Đây là hai khái niệm hoàn toàn khác nhau.
Một vấn đề khác: nhiều môi trường
Một công ty thường có:
dev
uat
staging
production
Mỗi môi trường đều chạy cùng một module.
Ví dụ:
modules/
vpc/
eks/
rds/
Nhưng phần cấu hình lại khác nhau.
Dev:
CIDR
10.0.0.0/16
Production:
CIDR
172.16.0.0/16
Region khác.
Account khác.
Remote State khác.
Provider khác.
Tags khác.
Nếu chỉ dùng Terraform, bạn sẽ phải copy rất nhiều folder.
Ví dụ:
dev/vpc
staging/vpc
production/vpc
Mỗi folder đều chứa gần như cùng một code.
Đó là duplication.
Và duplication luôn dẫn tới maintenance cost.
Dependency giữa các project
Một project RDS cần biết:
- subnet
- security group
- VPC
Những thông tin này lại nằm ở project khác.
Terraform có thể đọc Remote State.
Ví dụ:
data "terraform_remote_state" "network" {
...
}
Điều này hoạt động.
Nhưng khi dependency ngày càng nhiều:
VPC
↓
IAM
↓
EKS
↓
Helm
↓
Applications
↓
Monitoring
Việc tự quản lý thứ tự Apply trở nên rất khó.
Nếu apply sai thứ tự?
Project sẽ fail.
Người mới vào team gần như luôn phải đọc tài liệu để biết:
"À, phải apply VPC trước."
Terragrunt giúp tự động hóa việc này.
Quản lý nhiều AWS Account
Một hệ thống production thường không chỉ có một account.
Ví dụ:
AWS Organization
├── Shared
├── Development
├── Staging
├── Production
└── Sandbox
Provider gần như giống nhau.
Chỉ khác:
- Role
- Account ID
- Region
Nếu dùng Terraform thuần, bạn sẽ copy provider rất nhiều lần.
Điều này vừa dài dòng vừa dễ sai.
Terraform không sai
Đây là điều mình muốn nhấn mạnh.
Terraform không hề thiết kế để giải quyết những vấn đề trên.
Terraform chỉ có nhiệm vụ:
Provision Infrastructure.
Còn việc:
- tổ chức repository
- chạy nhiều project
- DRY configuration
- dependency
- orchestration
...không nằm trong phạm vi của Terraform.
Đó là khoảng trống mà Terragrunt xuất hiện.
Terragrunt là gì?
Terragrunt là một wrapper nằm bên ngoài Terraform.
Developer
│
▼
Terragrunt
│
▼
Terraform
│
▼
Cloud Provider
Nó không thay thế Terraform.
Nó không tạo resource.
Nó cũng không có provider riêng.
Terragrunt chỉ:
- sinh thêm Terraform configuration
- truyền biến
- tạo backend
- quản lý dependency
- điều phối nhiều Terraform project
Cuối cùng, Terraform vẫn là công cụ gọi API đến AWS, Azure hoặc GCP.
Terragrunt hoạt động như thế nào?
Giả sử bạn chạy:
terragrunt applyĐiều đầu tiên Terragrunt làm không phải là gọi AWS.
Nó sẽ:
- Đọc
terragrunt.hcl - Resolve các
include - Tính toán local variables
- Đọc dependency
- Sinh file Terraform cần thiết
- Download module (nếu cần)
- Tạo thư mục làm việc tạm
- Gọi
terraform init - Gọi
terraform plan - Gọi
terraform apply
Hay nói cách khác:
terragrunt apply
↓
Parse terragrunt.hcl
↓
Generate Terraform configuration
↓
Download Module
↓
terraform init
↓
terraform plan
↓
terraform apply
Terraform vẫn là engine thực sự.
Terragrunt chỉ đứng phía trước để chuẩn bị mọi thứ.
Vì sao Terragrunt được yêu thích?
Nếu hỏi một DevOps Engineer:
"Điều tuyệt nhất của Terragrunt là gì?"
Rất nhiều người sẽ trả lời:
Ít copy code hơn.
Nhưng thực tế, lợi ích lớn hơn nhiều.
Terragrunt giúp:
- Chuẩn hóa toàn bộ repository.
- Chia sẻ cấu hình giữa các environment.
- Quản lý dependency rõ ràng.
- Tự động generate backend và provider.
- Giảm lỗi do copy & paste.
- Dễ mở rộng khi số lượng project tăng lên.
- Giúp onboarding thành viên mới nhanh hơn.
- Repository luôn nhất quán giữa các team.
Đây là những giá trị mà bạn chỉ thật sự cảm nhận khi dự án có hàng chục hoặc hàng trăm Terraform project.
Tổng kết
Terraform và Terragrunt không phải đối thủ.
Chúng bổ sung cho nhau.
- Terraform chịu trách nhiệm quản lý infrastructure.
- Terragrunt chịu trách nhiệm quản lý nhiều Terraform project.
Nếu Terraform là engine của một chiếc xe, thì Terragrunt giống như hộp số và hệ thống điều khiển giúp chiếc xe vận hành mượt mà trong những hành trình dài và phức tạp.
Trong các bài tiếp theo, chúng ta sẽ đi sâu vào từng tính năng của Terragrunt để hiểu vì sao nó gần như trở thành tiêu chuẩn trong các repository Infrastructure as Code ở môi trường production.
Bài tiếp theo
Ở bài tiếp theo, chúng ta sẽ cùng xây dựng một cấu trúc repository production với Terragrunt, từ cách tổ chức thư mục, phân chia environment đến cách quản lý hàng chục Terraform project mà vẫn giữ được repository gọn gàng và dễ bảo trì.
