Máy chủ web Cloud
figonkingx  

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 vpc

2. 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íTerraformPulumi
Độ khó họcThấp (HCL đơn giản)Cao (cần lập trình)
Linh hoạtBị giới hạn bởi HCLSức mạnh lập trình đầy đủ
Kiểm thửHạn chế (terratest)Kiểm thử đơn vị gốc
Cộng đồngLớn hơnĐang phát triển
Nhà cung cấpHơn 3000Hơn 100 (bọc Terraform)
Quản lý trạng tháiTrưởng thànhTương đương
Doanh nghiệpTerraform CloudPulumi Cloud
Giấy phépBSL (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 apply

Lờ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.

Tham khảo

Comments

Leave A Comment