
Terraform vs Pulumi: So sánh hai công cụ IaC hàng đầu
Terraform và Pulumi là hai công cụ Hạ tầng dưới dạng Mã (IaC) hàng đầu. Terraform sử dụng HCL, trong khi Pulumi cho phép dùng ngôn ngữ lập trình như Python, TypeScript. Bài viết này so sánh chi tiết để giúp bạn chọn đúng công cụ.
Nội dung chính
Tổng quan
Terraform (HashiCorp)
- Ngôn ngữ: HCL (Ngôn ngữ cấu hình HashiCorp)
- Ra mắt: 2014
- Giấy phép: BSL (từ 2023, trước là MPL)
- Cách tiếp cận: Cấu hình khai báo
Pulumi
- Ngôn ngữ: Python, TypeScript, Go, C#, Java
- Ra mắt: 2018
- Giấy phép: Apache 2.0
- Cách tiếp cận: Lập trình mệnh lệnh
So sánh cú pháp
Tạo máy chủ EC2
Terraform (HCL):
resource "aws_instance" "may_chu_web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.micro"
tags = {
Name = "may-chu-web"
}
}
output "dia_chi_ip" {
value = aws_instance.may_chu_web.public_ip
}Pulumi (Python):
import pulumi
import pulumi_aws as aws
may_chu_web = aws.ec2.Instance("may_chu_web",
ami="ami-0c55b159cbfafe1f0",
instance_type="t3.micro",
tags={"Name": "may-chu-web"}
)
pulumi.export("dia_chi_ip", may_chu_web.public_ip)Pulumi (TypeScript):
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
const mayChuWeb = new aws.ec2.Instance("may-chu-web", {
ami: "ami-0c55b159cbfafe1f0",
instanceType: "t3.micro",
tags: { Name: "may-chu-web" }
});
export const diaChiIp = mayChuWeb.publicIp;Điểm mạnh của Terraform
1. Hệ sinh thái trưởng thành
# Hàng nghìn nhà cung cấp
terraform {
required_providers {
aws = { source = "hashicorp/aws" }
google = { source = "hashicorp/google" }
azure = { source = "hashicorp/azurerm" }
k8s = { source = "hashicorp/kubernetes" }
# ... hơn 3000 nhà cung cấp
}
}2. Dễ học
HCL dễ đọc, không cần biết lập trình:
# Người không phải lập trình viên cũng hiểu được
resource "aws_s3_bucket" "tinh" {
bucket = "trang-web-tinh-cua-toi"
}
resource "aws_s3_bucket_website_configuration" "tinh" {
bucket = aws_s3_bucket.tinh.id
index_document { suffix = "index.html" }
}3. Quản lý trạng thái đã được chứng minh
# Trạng thái từ xa với S3
terraform {
backend "s3" {
bucket = "trang-thai-terraform"
key = "san-pham/terraform.tfstate"
region = "ap-northeast-1"
encrypt = true
dynamodb_table = "khoa-terraform"
}
}4. Terraform Cloud/Enterprise
- Quản lý trạng thái
- Quy trình làm việc nhóm
- Chính sách dưới dạng mã (Sentinel)
- Kho module riêng
Điểm mạnh của Pulumi
1. Ngôn ngữ lập trình thực
# Python với vòng lặp, điều kiện, hàm
import pulumi_aws as aws
# Tạo tài nguyên động
for i in range(3):
aws.ec2.Instance(f"web-{i}",
ami="ami-xxx",
instance_type="t3.micro" if i < 2 else "t3.small"
)
# Hàm có thể tái sử dụng
def tao_vpc(ten: str, cidr: str):
vpc = aws.ec2.Vpc(ten, cidr_block=cidr)
return vpc2. Kiểm thử tốt hơn
import unittest
import pulumi
class KiemTraHaTang(unittest.TestCase):
@pulumi.runtime.test
def kiem_tra_instance_co_the(self):
def kiem_tra_the(args):
the = args[0]
self.assertIn("Name", the)
pulumi.Output.all(instance.tags).apply(kiem_tra_the)3. An toàn kiểu (TypeScript)
// Tự động hoàn thành IDE, lỗi lúc biên dịch
const instance = new aws.ec2.Instance("web", {
ami: "ami-xxx",
instanceType: "t3.micro", // Kiểm tra kiểu
// lỗi chính tả: instnceType - lỗi biên dịch!
});4. Trừu tượng component
class VpcComponent(pulumi.ComponentResource):
def __init__(self, ten: str, cidr: str, opts=None):
super().__init__("tuy_chinh:VpcComponent", ten, opts)
self.vpc = aws.ec2.Vpc(f"{ten}-vpc",
cidr_block=cidr,
opts=pulumi.ResourceOptions(parent=self)
)
self.mang_con = []
for i, az in enumerate(["a", "b"]):
mang = aws.ec2.Subnet(f"{ten}-mang-{az}",
vpc_id=self.vpc.id,
cidr_block=f"10.0.{i}.0/24",
availability_zone=f"ap-northeast-1{az}",
opts=pulumi.ResourceOptions(parent=self)
)
self.mang_con.append(mang)So sánh chi tiết
| Tiêu chí | Terraform | Pulumi |
|---|---|---|
| Độ khó học | Thấp (HCL đơn giản) | Cao (cần lập trình) |
| Linh hoạt | Bị giới hạn bởi HCL | Sức mạnh lập trình đầy đủ |
| Kiểm thử | Hạn chế (terratest) | Kiểm thử đơn vị gốc |
| Cộng đồng | Lớn hơn | Đang phát triển |
| Nhà cung cấp | Hơn 3000 | Hơn 100 (bọc Terraform) |
| Quản lý trạng thái | Trưởng thành | Tương đương |
| Doanh nghiệp | Terraform Cloud | Pulumi Cloud |
| Giấy phép | BSL (gây tranh cãi) | Apache 2.0 |
Khi nào dùng Terraform
- Nhóm hỗn hợp (có người không phải lập trình viên)
- Hạ tầng đơn giản
- Cần hệ sinh thái lớn
- Đã đầu tư vào Terraform
- Doanh nghiệp với hỗ trợ HashiCorp
Khi nào dùng Pulumi
- Nhóm lập trình viên
- Logic phức tạp (vòng lặp, điều kiện)
- Cần kiểm thử đơn vị
- Thích ngôn ngữ lập trình thực
- Ưu tiên mã nguồn mở (sau Terraform BSL)
OpenTofu - Lựa chọn thay thế
Sau khi HashiCorp đổi giấy phép sang BSL, cộng đồng tạo nhánh OpenTofu:
# Thay thế trực tiếp
# Thay terraform bằng tofu
tofu init
tofu plan
tofu applyLời khuyên từ Fullstack Station
Cả hai đều là công cụ tốt. Gợi ý của mình:
- Mới bắt đầu: Terraform - tài liệu học nhiều hơn
- Nhóm lập trình viên: Pulumi - tận dụng kỹ năng lập trình
- Doanh nghiệp: Terraform Cloud hoặc Pulumi Cloud
- Ưu tiên mã nguồn mở: OpenTofu (nhánh Terraform)
Xu hướng 2025: Pulumi đang phát triển nhanh, đặc biệt trong các nhóm lập trình viên. Terraform vẫn chiếm ưu thế nhưng giấy phép BSL gây lo ngại.
