Sử dụng Terraform để khởi tạo hạ tầng VPS tự động (Infrastructure as Code)
Sử dụng Terraform để khởi tạo hạ tầng VPS tự động (Infrastructure as Code)
Trong kỷ nguyên DevOps năm 2026, việc đăng nhập vào giao diện web của các nhà cung cấp như DigitalOcean, Vultr hay AWS để click chuột tạo từng máy chủ đã trở nên lạc hậu. Phương pháp này không chỉ tốn thời gian mà còn dễ gây ra sai sót cấu hình giữa các môi trường (Dev, Staging, Production). Infrastructure as Code (IaC) với trọng tâm là Terraform ra đời để giải quyết bài toán này: Biến hạ tầng thành những dòng mã nguồn có thể quản lý, chia sẻ và tái sử dụng.
Bài viết này sẽ đi sâu vào cách sử dụng Terraform để định nghĩa toàn bộ tài nguyên hệ thống từ VPS, Firewall cho đến Network chỉ thông qua một file cấu hình duy nhất. Chỉ với một câu lệnh, bạn có thể triển khai hàng chục server trong vài phút.
1. Terraform là gì và tại sao Developer cần biết?
Terraform là một công cụ mã nguồn mở được phát triển bởi HashiCorp, sử dụng ngôn ngữ khai báo HCL (HashiCorp Configuration Language). Thay vì viết script để thực hiện các bước (Imperative), bạn chỉ cần mô tả trạng thái cuối cùng mà bạn muốn (Declarative).
- Tính nhất quán: Đảm bảo môi trường Production luôn giống hệt môi trường Staging.
- Quản lý phiên bản: Bạn có thể lưu trữ hạ tầng trên Git, thực hiện Pull Request để review các thay đổi về cấu hình server.
- Đa nền tảng (Multi-provider): Sử dụng cùng một logic để quản lý cả DigitalOcean, Google Cloud, hay Proxmox.
// Ví dụ về logic kiểm tra trạng thái hạ tầng trong một hệ thống quản lý Terraform
interface InfrastructureState {
resourcesCreated: number;
provider: string;
isProvisioned: boolean;
}
function checkDeploymentProgress(state: InfrastructureState): string {
if (state.isProvisioned) {
return `Hạ tầng trên ${state.provider} đã sẵn sàng với ${state.resourcesCreated} tài nguyên.`;
}
return "Đang trong quá trình khởi tạo hoặc cập nhật...";
}
const myProjectState: InfrastructureState = {
resourcesCreated: 5,
provider: "DigitalOcean",
isProvisioned: true
};
console.log(checkDeploymentProgress(myProjectState));
2. Cấu trúc cốt lõi của một dự án Terraform
Để bắt đầu tự động hóa VPS, bạn cần hiểu 3 thành phần chính: Provider (Nhà cung cấp), Resource (Tài nguyên) và Variables (Biến số). Terraform sẽ sử dụng các thành phần này để xây dựng "đồ thị tài nguyên" và quyết định thứ tự khởi tạo sao cho tối ưu nhất.
Ví dụ, Firewall phải được tạo trước khi áp dụng vào VPS, và Network phải tồn tại trước khi gán IP cho máy chủ. Terraform tự động tính toán các phụ thuộc này thay vì bạn phải làm thủ công.
// Cấu trúc khai báo Resource mẫu trong Terraform HCL (Giả lập bằng TypeScript interface)
interface TerraformResource {
type: string;
name: string;
properties: {
region: string;
size: string;
image: string;
ssh_keys?: string[];
};
}
const webServer: TerraformResource = {
type: "digitalocean_droplet",
name: "web-vps-01",
properties: {
region: "sgp1", // Singapore
size: "s-1vcpu-2gb",
image: "ubuntu-22-04-x64",
ssh_keys: ["id_rsa_my_mac"]
}
};
console.log(`Đang định nghĩa tài nguyên: ${webServer.type}.${webServer.name}`);
3. Quy trình 4 bước triển khai hạ tầng tự động
Khi làm việc với Terraform, bạn sẽ luôn tuân thủ một chu trình khép kín giúp hạn chế tối đa rủi ro làm sập hệ thống đang chạy.
| Lệnh thực thi | Mục đích | Hành động của hệ thống |
|---|---|---|
| terraform init | Khởi tạo dự án | Tải về các plugin của nhà cung cấp (DigitalOcean, AWS...) |
| terraform plan | Lập kế hoạch | So sánh file code với thực tế và liệt kê các thay đổi dự kiến |
| terraform apply | Thực thi | Gửi yêu cầu API đến nhà cung cấp để tạo/sửa tài nguyên |
| terraform destroy | Hủy bỏ | Xóa sạch toàn bộ hạ tầng đã tạo để tiết kiệm chi phí |
4. Biến số (Variables) và Tính tái sử dụng
Đừng bao giờ "hard-code" các thông số như IP hay dung lượng RAM vào file chính. Sử dụng variables.tf để linh hoạt hóa cấu hình. Điều này cho phép bạn dùng chung một bộ mã nguồn nhưng có thể tạo ra môi trường Small VPS cho Dev và High-end VPS cho Production.
// Logic xử lý biến số trong hệ thống quản lý hạ tầng
type VpsSize = "1gb" | "2gb" | "4gb" | "8gb";
interface DeploymentConfig {
environment: "dev" | "prod";
vpsSize: VpsSize;
}
function getPriceEstimation(config: DeploymentConfig): number {
const pricing = { "1gb": 5, "2gb": 10, "4gb": 20, "8gb": 40 };
const multiplier = config.environment === "prod" ? 1.5 : 1; // Prod có thêm phí backup
return pricing[config.vpsSize] * multiplier;
}
const myDeploy: DeploymentConfig = { environment: "prod", vpsSize: "4gb" };
console.log(`Chi phí dự kiến hàng tháng: ${getPriceEstimation(myDeploy)}$`);
5. Tự động hóa Firewall và Network Security
Một trong những sai lầm lớn nhất của quản trị viên là quên cấu hình tường lửa sau khi tạo VPS. Với Terraform, Firewall là một phần của "bản thiết kế". Bạn định nghĩa cổng nào được mở (80, 443, 22) ngay trong mã nguồn. Khi VPS được tạo ra, nó đã được bảo vệ ngay từ giây đầu tiên.
// Định nghĩa danh sách các cổng được phép truy cập (Firewall Rules)
interface FirewallRule {
protocol: "tcp" | "udp" | "icmp";
portRange: string;
sourceAddresses: string[];
}
const securityPolicy: FirewallRule[] = [
{ protocol: "tcp", portRange: "80", sourceAddresses: ["0.0.0.0/0"] },
{ protocol: "tcp", portRange: "443", sourceAddresses: ["0.0.0.0/0"] },
{ protocol: "tcp", portRange: "22", sourceAddresses: ["123.45.67.89/32"] } // Chỉ IP của bạn
];
console.log(`Đang áp dụng ${securityPolicy.length} quy tắc bảo mật vào hạ tầng.`);
6. Quản lý trạng thái với State File (.tfstate)
Terraform ghi nhớ những gì nó đã tạo thông qua một file gọi là terraform.tfstate. Đây là tệp cực kỳ quan trọng. Nếu bạn làm mất nó, Terraform sẽ không biết server nào đang chạy và sẽ cố gắng tạo mới mọi thứ, dẫn đến trùng lặp hoặc lỗi. Trong môi trường doanh nghiệp, file này thường được lưu trữ trên Cloud (S3, Terraform Cloud) để nhiều người cùng làm việc.
7. Kết hợp Terraform với Cloud-Init để cài đặt phần mềm
Tạo VPS trống là chưa đủ. Bạn cần cài đặt Nginx, Docker hay Node.js ngay khi máy chủ vừa bật lên. Terraform cho phép nhúng đoạn script User Data (Cloud-Init). Khi máy chủ hoàn tất quá trình khởi tạo phần cứng, nó sẽ tự động chạy script này để setup môi trường.
// Script Cloud-Init giả lập để setup môi trường Docker
const cloudInitScript = `
#!/bin/bash
apt-get update
apt-get install -y docker.io
systemctl start docker
docker run -d -p 80:80 nginx
`;
function getProvisioningScript(os: string): string {
console.log(`Đang gán script hậu khởi tạo cho hệ điều hành: ${os}`);
return cloudInitScript;
}
getProvisioningScript("Ubuntu 22.04");
8. Kết luận: Checklist chuyển đổi sang IaC
Trước khi chính thức sử dụng Terraform cho dự án tiếp theo, hãy đảm bảo bạn đã thực hiện các bước sau:
- Đã cài đặt Terraform CLI và cấu hình API Token của nhà cung cấp?
- Đã tách biệt file biến (variables) và file thực thi chính?
- Có kế hoạch lưu trữ file
.tfstatean toàn (Remote Backends)? - Đã kiểm tra kỹ lệnh
terraform planđể tránh xóa nhầm dữ liệu Production?
Terraform không chỉ là một công cụ, nó là một tư duy mới về quản lý hệ thống. Hãy bắt đầu tự động hóa ngay hôm nay để giải phóng bản thân khỏi những tác vụ thủ công lặp đi lặp lại!
