Giới thiệu
Chào các bạn tới với series về Terraform, ở 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ề Terraform Backend, và tìm hiểu về những vấn đề như làm sao nhiều người có thể cùng làm việc trên cùng một terraform project, làm sao để share terraform state file giữa các member trong team, khi nhiều người cùng chạy câu lệnh apply lên trên một terraform project thì chuyện gì sẽ xảy ra? Ở phần này chúng ta sẽ tìm hiểu về lý thuyết, phần sau ta sẽ deploy dùng S3 standard backend.
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 terraform file 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ể share source code với nhau, và làm sao chúng ta share terraform state file với nhau. Nên lưu ý là khi ta chạy câu lệnh apply, khi terraform chạy xong nó sẽ lưu cấu hình hệ thống của ta vào state file, hiện tại thì state file của ta đang được tạo ra là lưu ở máy ta. Nếu có người khác tham gia vào làm việc cùng với ta thì ta share file này thế nào?
Cách mà ta hay làm là ta sẽ push nó lên trên github và để người khác pull xuống xài. Nhưng nếu ta dùng github để lưu và share state file, thì mỗi lần ta apply config mới ta lại phải push lên lại github, và thành viên khác trong team phải pull xuống trước khi họ chạy apply. Nếu ta dùng cách như vậy rất dễ gây ra conflict.
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 feature của terraform là Backend.
Terraform Backend
Một backend trong terraform sẽ đóng vai trò quyết định state file sẽ được lưu ở đâu và terraform CLI operations 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 sẽ được thực thi ở máy local và sau khi chạy xong nó sẽ lưu lại kết quả ở dưới state file.
Loại backend này phù hợp khi ta làm dự án một mình. Nhưng nó gặp vấn đề giống như ta nói ở trên, khi có nhiều người cùng lúc chạy câu lệnh terraform lên trên cùng một source code terraform, hạ tầng của ta sẽ bị conflict.
Nên để nhiều người có thể cùng nhau làm việc trên cùng một terraform source code, ta sẽ cần phải sử dụng loại backend tiếp theo.
Standard backend
Ở loại backend này thì Terraform 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 file). Nơi ta dùng để lưu trữ state file 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 state file vì state của ta đã đượ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ị conflict 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ữ state file ở một nơi khác, standard backend còn hỗ trợ cho ta một feature là lock remote state file. Khi một user chạy câu lệnh terraform apply, terraform sẽ lock lại state file của ta, cùng lúc đó nếu một user khác chạy câu lệnh terraform, terraform kiểm tra thấy state file của ta đã bị lock, nó sẽ reject câu lệnh terraform apply của user 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ư passwork, thì nó sẽ được lưu trữ ở remote state file, không phải ai cũng có thể vào remote state file để đọc được.
Ví dụ khi ta xài S3 standard backend thì ta sẽ config 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 config 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 admin account mà có full quyền với AWS, sau đó lưu secret key của admin account này dưới máy local => không bảo mật lắm.
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ề local CLI của ta. Và sau khi nó chạy xong, state file của ta cũng sẽ được lưu trữ ở remote server.
Lúc này cả config cho Terraform và state file đều được lưu ở remote server. Remote backend cũng có tính năng lock state file để 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ẽ config 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 team và sử dụng remote backend ta có thể centralize tất cả config ở 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 platform có sẵn của Terraform là Terraform Cloud.
Terraform Cloud
Đây là một platform được Hashicorp (công ty phát triển Terraform) xây ra. 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à push lên github, Terraform sẽ pull 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 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 team. Tùy vào trường hợp thì ta sẽ xài loại phù hợp. Nếu có thắc mắc hoặc cần giải thích rõ thêm chỗ nào thì các bạn có thể hỏi dưới phần comment. Ở bài tiếp theo ta nói về cách config và triển khai Terraform dùng S3 Standard Backend.
Mục tìm kiếm đồng đội
Hiện tại thì bên công ty mình, là Hoàng Phúc International, với hơn 30 năm kinh nghiệm trong lĩnh vực thời trang. Và là trang thương mại điện tử về thời trang lớn nhất Việt Nam. Team công nghệ của HPI đang tìm kiếm đồng đội cho các vị trí như:
- Senior Backend Engineer (Java). Link JD: https://tuyendung.hoang-phuc.com/job/senior-backend-engineer-1022
- Senior Front-end Engineer (VueJS). https://tuyendung.hoang-phuc.com/job/senior-frontend-engineer-1021
- Junior Backend Engineer (Java). https://tuyendung.hoang-phuc.com/job/junior-backend-engineer-1067
- Junior Front-end Engineer (VueJS). https://tuyendung.hoang-phuc.com/careers/job/1068
- App (Flutter). https://tuyendung.hoang-phuc.com/job/mobile-app-engineer-flutter-1239
- Senior Data Engineer. https://tuyendung.hoang-phuc.com/job/seniorjunior-data-engineer-1221
Với mục tiêu trong vòng 5 năm tới về mảng công nghệ là:
- Sẽ có trang web nằm trong top 10 trang web nhanh nhất VN với 20 triệu lượt truy cập mỗi tháng.
- 5 triệu loyal customers và có hơn 10 triệu transactions mỗi năm.
Team đang xây dựng một hệ thống rất lớn với rất nhiều vấn để cần giải quyết, và sẽ có rất nhiều bài toàn thú vị cho các bạn. Nếu các bạn có hứng thú trong việc xây dựng một hệ thống lớn, linh hoạt, dễ dàng mở rộng, và performance cao với kiến trúc microservices thì hãy tham gia với tụi mình.
Nếu các bạn quan tâm hãy gửi CV ở trong trang tuyển dụng của Hoàng Phúc International hoặc qua email của mình nha [email protected]
. Cảm ơn các bạn đã đọc.
Nguồn: viblo.asia