iacInfrastructure as Codeterraformterragrunt

Terragrunt là gì? Và nó hoạt động như thế nào?

Sau khi hiểu Terraform, đã đến lúc tìm hiểu Terragrunt—một công cụ giúp quản lý Infrastructure as Code ở quy mô production bằng cách giảm lặp code, quản lý dependency và tổ chức repository hiệu quả.

26 thg 7, 20265 min readCập nhật 26 thg 7, 2026
Terragrunt là gì? Và nó hoạt động như thế nào?

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:

code
terragrunt apply

Điều đầu tiên Terragrunt làm không phải là gọi AWS.

Nó sẽ:

  1. Đọc terragrunt.hcl
  2. Resolve các include
  3. Tính toán local variables
  4. Đọc dependency
  5. Sinh file Terraform cần thiết
  6. Download module (nếu cần)
  7. Tạo thư mục làm việc tạm
  8. Gọi terraform init
  9. Gọi terraform plan
  10. 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ì.

Bình luận

0/2000

Đang tải bình luận…

Trung Nguyen

Trung Nguyen

Software engineer xây dựng các hệ thống đơn giản, đáng tin cậy. Mình viết về kiến trúc, Java và những gì mình học được trên chặng đường.

Xem thêm về mình