Giới thiệu
Ở bài trước chúng ta đã tìm hiểu về Terraform Module. Ở bài này chúng ta sẽ tìm hiểu về một chủ đề quan trọng tiếp theo là Terraform Backend, đây là tính năng của Terraform để nhiều người có thể cùng làm việc trên một dự án Terraform.
Vấn đề
Khi chúng ta làm việc với Terraform, nếu chỉ làm có một mình ta làm thì mọi chuyện rất yên ổn và không có gì xảy ra, nhưng nếu có thêm một người khác tham gia vào để viết cấu hình Terraform cùng với ta, thì sẽ có rất nhiều vấn đề xảy ra.
Vấn đề đầu tiên là làm sao ta có thể chia sẻ source code với nhau, và làm sao chúng ta chia sẻ tệp tin State với nhau. Nên lưu ý là khi ta chạy câu lệnh apply
, khi Terraform chạy xong thì nó sẽ lưu cấu hình hệ thống của ta vào tệp tin State, hiện tại thì tệp tin State của ta đang được tạo ra là lưu ở máy local
. Nếu có người khác tham gia vào làm việc cùng với ta thì ta chia sẻ tệp tin State này thế nào?
Cách mà ta hay làm là ta sẽ đẩy nó lên trên Github và để người khác kéo xuống. Nhưng nếu ta dùng Github để lưu và chia sẻ tệp tin State, thì mỗi lần ta chạy câu lệnh apply
và tệp tin State mới của ta được tạo ra, ta phải đẩy nó lên lại Github, và thành viên khác trong đội phải kéo xuống trước khi họ chạy apply
. Nếu ta dùng cách như vậy thì rất dễ gây ra xung đột.
Vấn đề thứ hai là nếu cùng lúc có cả hai người chạy apply
, thì hạ tầng của ta sẽ thế nào?
Để giải quyết những vấn đề trên thì ta sẽ sử dụng một tính năng của Terraform là Backend.
Terraform Backend
Một Backend trong Terraform sẽ đóng vai trò quyết định tệp tin State sẽ được lưu ở đâu và Terraform CLI như terraform plan
hoặc terraform apply
sẽ chạy như thế nào. Trong Terraform sẽ có ba loại Backend như sau:
- Local Backend.
- Standard Backend.
- Remote Backend (Enhanced Backend).
Local Backend
Đây là loại Backend mặc định khi ta chạy Terraform. Terraform Runtime sẽ được thực thi ở máy local
và sau khi chạy xong nó sẽ lưu lại kết quả ở tệp tin State dưới local
.
Loại Backend này phù hợp khi ta làm dự án một mình. Nhưng nó gây ra vấn đề giống như ta nói ở trên, khi cùng lúc có nhiều người chạy câu lệnh terraform apply
lên trên một Terraform Project thì hạ tầng của ta sẽ bị xung đột.
Nên để nhiều người có thể cùng nhau làm việc trên một Terraform Project, ta sẽ cần phải sử dụng loại Backend tiếp theo.
Standard Backend
Ở loại Backend này thì Terraform Runtime vẫn được thực thi ở máy local
, nhưng sau khi nó chạy xong thì kết quả của nó sẽ được lưu ở một nơi khác (Remote State). Nơi ta dùng để lưu trữ tệp tin State có thể là AWS S3, GCP Cloud Storage, …
Lúc này thì ta có thể lưu source code ở trên Github, không cần phải lưu tệp tin State vì nó được lưu ở một chỗ khác. Vậy nếu nhiều người cùng lúc chạy câu lệnh Terraform thì ta vẫn bị xung đột vậy? Standard Backend có giải quyết vấn đề này cho ta không? Câu trả lời là có.
Ngoài trừ việc lưu trữ tệp tin State ở một nơi khác, Standard Backend còn hỗ trợ cho ta một tính năng là Lock Remote State. Khi một người dùng chạy câu lệnh terraform apply
, Terraform sẽ khóa lại tệp tin State của ta, cùng lúc đó nếu một người dùng khác chạy câu lệnh Terraform, Terraform kiểm tra thấy tệp tin State của ta đã bị khóa, nó sẽ từ chối câu lệnh terraform apply
của người dùng thứ hai => từ đó giải quyết vấn đề nhiều người cùng lúc chạy câu lệnh terraform apply
.
Ngoài ra khi ta sử dụng Standard Backend thì ta có thể tăng độ bảo mật lên một chút vì các cấu hình của hạ tầng mà liên quan tới Database như Password, thì nó sẽ được lưu trữ ở Remote State, không phải ai cũng có thể vào Remote State để xem được.
Ví dụ khi ta xài S3 Standard Backend thì ta sẽ cấu hình như sau.
terraform {
backend "s3" {
bucket = "state-bucket"
key = "team/rocket"
region = "us-west-2"
encrypt = true
role_arn = "arn:aws:iam::<ACCOUNT_ID>:role/state-bucket-assume-role"
dynamodb_table = "state-assume-lock"
}
required_version = ">= 0.15"
required_providers {
null = {
source = "hashicorp/null"
version = "~> 3.0"
}
}
}
Nhưng ta cũng sẽ gặp một vấn đề nữa là những cấu hình yêu cầu để ta chạy Terraform vẫn phải lưu ở local
, ví dụ như là khi ta chạy Terraform để tạo hạ tầng trên AWS ta cần phải cấu hình secret key
ở dưới máy local
của ta, và cho tiện thì hầu hết mọi người đều tạo Account mà có toàn bộ quyền với AWS, sau đó lưu secret key
của Account này dưới máy local
=> không bảo mật.
Nên để giải quyết vấn đề trên thì ta sẽ sử dụng loại Backend tiếp theo, là Remote Backend.
Remote Backend
Ở loại Backend này Terraform Runtime của ta sẽ được thực thi ở Remote Server, và Terraform CLI ở máy local
của ta chỉ có nhiệm vụ Streaming kết quả được in ra từ Remote Server về máy local
của ta. Và sau khi nó chạy xong thì tệp tin State của ta cũng sẽ được lưu trữ ở Remote Server.
Lúc này cả cấu hình cho Terraform và tệp tin State đều được lưu ở Remote Server. Remote Backend cũng có tính năng khóa tệp tin State để ngăn chặn việc nhiều người chạy apply
cùng lúc.
Ví dụ khi ta xài Remote Backend thì ta sẽ cấu hình như sau.
terraform {
backend "remote" {
hostname = "app.terraform.io"
organization = "hpi"
workspaces {
name = "pro"
}
}
}
Ta sẽ xài Remote Backend khi làm việc với đội và sử dụng Remote Backend ta có thể tập trung tất cả cấu hình ở cùng một chỗ.
Ngoài việc lựa chọn Backend cho Terraform, khi làm thực tế ta cũng thường phải xây dựng CI/CD cho một Terraform Project. Để làm CI/CD cho Terraform cũng khá mất thời gian nên để tiết kiệm thời gian ta có thể xài một nền tảng có sẵn của Terraform là Terraform Cloud.
Terraform Cloud
Đây là một nền tảng được Hashicorp (công ty phát triển Terraform) xây dựng. Nó sẽ hỗ trợ ta trong việc sử dụng Terraform một cách rất dễ dàng.
Khi xài Terraform Cloud thì những thứ ta cần làm rất đơn giản, chỉ cần viết code và đẩy lên Github, Terraform Cloud sẽ kéo code xuống và chạy cho ta.
Cách sử dụng Terraform Cloud mình sẽ nói ở bài khác.
Kết luận
Vậy là ta đã tìm hiểu xong về lý thuyết của Terraform Backend, ở trên là ba loại Backend mà Terraform hỗ trợ khi mình viết bài này, Local Backend thích hợp khi ta làm dự án một mình, Standard và Remote Backend phù hợp khi ta làm theo đội nhóm. Tùy vào trường hợp thì ta sẽ xài loại phù hợp.
Tác giả @Quân Huỳnh
Nếu bài viết có gì sai hoặc cần cập nhật thì liên hệ Admin.
Tham gia nhóm chat của DevOps VN tại Telegram.
Kém tiếng Anh và cần nâng cao trình độ giao tiếp: Tại sao bạn học không hiệu quả?