Giới thiệu về Terraform Backend
Terraform là công cụ phổ biến giúp quản lý cơ sở hạ tầng một cách tự động hóa, tuy nhiên, việc lưu trữ trạng thái (state) là một vấn đề quan trọng mà người dùng cần lưu ý đặc biệt khi có nhiều người cùng làm việc. Trong bài viết này, chúng ta sẽ tìm hiểu về backend
trong Terraform - một tính năng giúp quản lý trạng thái của cơ sở hạ tầng.
Vấn đề gặp phải
Terraform quản lý infrastructure thông qua một file trạng thái gọi là terraform.tfstate
. Nếu chỉ làm việc một mình, việc này sẽ không gây ra vấn đề gì. Nhưng khi có nhiều người tham gia xây dựng và quản lý, điều này có thể dẫn đến xung đột trong trạng thái.
Giải pháp: Sử dụng Backend
Để giải quyết những xung đột này, Terraform cung cấp backend
block - một công cụ cho phép cấu hình vị trí lưu trữ state
.
Khai báo Backend trong File Config
Để cấu hình backend, bạn cần thêm backend
block vào trong terraform
block như sau:
hcl
terraform {
backend "remote" {
organization = "learning-journey"
workspaces {
name = "demo01"
}
}
}
Terraform hỗ trợ nhiều loại backend
cho việc lưu file trạng thái như local
, remote
, s3
, azurerm
,... Mặc định, trạng thái sẽ được lưu trữ trên local
.
Các Loại Backend
1. Local Backend
local
backend lưu trữ trạng thái trên máy tính của người dùng.- Cấu hình:
hcl
terraform {
backend "local" {
path = "relative/path/to/terraform.tfstate"
}
}
-
path
: xác định nơi lưu file trạng thái, mặc định là fileterraform.tfstate
ở root module. -
Loại backend này phù hợp khi triển khai cơ sở hạ tầng một mình. Tuy nhiên, nếu làm việc nhóm, bạn nên sử dụng một backend chung để tránh xung đột.
2. S3 Backend
- S3 backend lưu trạng thái trên Amazon S3, đảm bảo tính nhất quán bằng cách sử dụng hai phương pháp lock trạng thái:
- S3 state locking (
use_lockfile
) - chỉ có ở phiên bản Terraform 1.10 trở lên. - DynamoDB (
dynamodb_table
), vớiLockID
là partition key dạng string.
- S3 state locking (
Cấu hình S3 Backend
Trước tiên, bạn cần tạo một S3 bucket trên AWS với tên trùng với trường bucket
trong block backend
:
hcl
terraform {
backend "s3" {
bucket = "mybucket"
key = "your-state.tfstate"
region = "us-east-1"
profile = "Your_Profile"
dynamodb_table = "states_tb"
}
}
Bạn cần đảm bảo rằng profile bạn sử dụng đã có quyền truy cập vào S3. Nếu không, hãy thiết lập quyền thích hợp:
json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::mybucket"
},
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject"],
"Resource": ["arn:aws:s3:::mybucket/path/to/my/key"]
}
]
}
Lưu Trữ Trạng Thái Trên S3
- Tạo S3 bucket tên là
terraform-learning-triluong
. - Chỉnh sửa file
main.tf
để thêmbackend
block:
hcl
terraform {
backend "s3" {
bucket = "terraform-learning-triluong"
key = "terraform.state"
region = "us-east-1"
profile = "saa"
}
}
- Khởi tạo lại workspace với lệnh:
tf init
- Sau đó thực hiện các lệnh
terraform plan
vàterraform apply
để triển khai và kiểm tra kết quả trong S3 bucket.
Lock Trạng Thái
Locking bằng S3
Để bật tính năng lock trạng thái trên S3, thêm thông số use_lockfile
:
hcl
terraform {
backend "s3" {
bucket = "terraform-learning-triluong"
key = "terraform.state"
region = "us-east-1"
profile = "saa"
use_lockfile = true
}
}
- Nếu có nhiều người cùng thực hiện
apply
, một file lock sẽ được tạo ra trong S3 để tránh xung đột.
Locking bằng DynamoDB
Tạo bảng DynamoDB với tên terraform-states
và cấu hình:
hcl
terraform {
backend "s3" {
bucket = "terraform-learning-triluong"
key = "terraform.state"
region = "us-east-1"
profile = "saa"
dynamodb_table = "terraform-states"
}
}
- DynamoDB sẽ tạo một record để lock trạng thái trong quá trình thực hiện apply.
Kết Luận
- Việc sử dụng
backend
trong Terraform giúp xác định vị trí lưu trữ file trạng thái và hỗ trợ nhiều loại nhưlocal
,remote
, vàs3
. - S3 backend cung cấp tính năng lock trạng thái hữu ích thông qua lock file hoặc DynamoDB, giúp đồng bộ hóa các thao tác của nhiều người dùng.
Hãy cân nhắc sử dụng các backend phù hợp để tối ưu hóa quá trình quản lý cơ sở hạ tầng của bạn.
source: viblo