search

03-Terraform Provider là gì? Tại sao bắt buộc phải có Provider

calendar_today Đăng ngày: 01/05/2026

Bài này mình sẽ giải thích terraform provider là gì, tại sao không có Provider thì Terraform không làm được gì, và cách dùng nhiều provider trong cùng một project – kể cả alias khi cần deploy đa region.

Xem thêm:

04-Terraform Workflow – init, plan, apply, destroy

16-Best Practice: Quản lý AWS Credentials trong Terraform

1. Terraform Provider là gì?

Provider là thành phần kết nối giữa Terraform và nền tảng hạ tầng bên ngoài — AWS, Azure, GCP, Kubernetes, GitHub, v.v.

Terraform Core (phần lõi của Terraform) không tự biết cách tạo EC2, VM hay Kubernetes cluster. Nó chỉ đọc file .tf rồi ủy quyền toàn bộ việc giao tiếp với cloud cho Provider.

Provider mới là thứ:

  • Hiểu API của từng cloud
  • Biết cách tạo, sửa, xóa tài nguyên
  • Xác thực tài khoản (authentication)
  • Thực thi các thao tác đó thay mặt Terraform

Ví dụ thực tế:

  • Muốn tạo EC2 trên AWS → Terraform gọi AWS Provider
  • Muốn tạo Virtual Machine trên Azure → Terraform gọi Azure Provider

Không có Provider tương ứng, Terraform không biết phải nói chuyện với cloud đó bằng cách nào.

Terraform Provider

2. Vì sao Terraform bắt buộc phải có Provider?

Terraform hoạt động theo mô hình plugin-based — phần lõi không chứa sẵn logic làm việc với bất kỳ cloud nào. Mỗi nền tảng có một plugin riêng, được tải về từ Terraform Registry khi chạy terraform init.

Nếu thiếu Provider:

  • Terraform không thể kết nối tới cloud
  • Không thể xác thực tài khoản
  • Không thể tạo bất kỳ tài nguyên nào
  • File .tf chỉ là văn bản thuần, không có giá trị thực thi

3. Khai báo Provider cơ bản

Dưới đây là ví dụ khai báo AWS Provider:

provider "aws" {
  region = "us-east-1"
}

Terraform sẽ tải AWS Provider phù hợp khi bạn chạy terraform init.

4. Best practice: Luôn khóa version Provider

Đừng làm thế này

provider "aws" {
  region = "us-east-1"
}

Cách này khiến Terraform luôn tải phiên bản mới nhất của AWS Provider. Rất dễ phát sinh lỗi nếu provider có thay đổi lớn giữa các version.

Nên làm thế này

provider "aws" {
  region  = "us-east-1"
  version = "~> 3.53.0"
}

Tại sao phải khóa version?

Tránh breaking change — Provider được phát hành rất thường xuyên. Một version mới có thể đổi tên resource, thay đổi thuộc tính, hoặc xóa tính năng cũ. Code đang chạy tốt hôm nay có thể lỗi ngay ngày mai nếu không khóa version.

Giữ code ổn định theo thời gian — Code Terraform có thể tồn tại nhiều năm. Cố định version giúp deploy ổn định, dễ rollback và dễ debug hơn.

5. Dùng nhiều Provider trong một project

Hoàn toàn được. Terraform cho phép dùng nhiều provider cùng lúc trong một project.

Ví dụ: AWS chạy EC2, Azure chạy VM, GitHub quản lý repo — tất cả trong cùng một config.

# main.tf

provider "aws" {
  region  = "us-east-1"
  version = "~> 3.53.0"
}

provider "azurerm" {
  features {}
  version = "~> 2.72.0"
}

Khi chạy terraform init, Terraform tự động tải tất cả provider cần thiết.

6. Provider Alias — Dùng nhiều config của cùng một Provider

Mặc định, mỗi loại provider chỉ có một configuration trong một project. Nhưng có trường hợp bạn cần cùng một provider với nhiều config khác nhau — ví dụ deploy resource lên hai AWS region cùng lúc. Lúc này dùng alias.

Khai báo alias

provider "aws" {
  region = "us-west-1"
  alias  = "us_west_1"
}

provider "aws" {
  region = "us-east-1"
  alias  = "us_east_1"
}

Gán provider vào resource

resource "aws_instance" "web_us_west_1" {
  provider      = aws.us_west_1
  ami           = "ami-12345678"
  instance_type = "t2.micro"

  tags = {
    Name = "web-us-west-1"
  }
}

resource "aws_instance" "web_us_east_1" {
  provider      = aws.us_east_1
  ami           = "ami-87654321"
  instance_type = "t2.micro"

  tags = {
    Name = "web-us-east-1"
  }
}

Cú pháp gán provider là <provider_type>.<alias> — ví dụ aws.us_west_1. Terraform sẽ tạo cả hai instance ở hai region khác nhau trong cùng một lần apply.

Lưu ý quan trọng:

  • Nếu có một provider block không có alias → đó là provider mặc định. Resource nào không khai báo provider sẽ tự động dùng block này.
  • Nếu tất cả các block đều có alias → bắt buộc phải khai báo provider tường minh trong từng resource, không có fallback mặc định.
  • alias không chỉ dùng cho multi-region. Bạn cũng có thể dùng để deploy lên nhiều AWS account khác nhau — chỉ cần thêm profile hoặc assume_role tương ứng vào từng provider block.

7. So sánh Provider và Module

Provider Module
Vai trò Giao tiếp với hệ thống bên ngoài Gom nhiều resource thành một khối
Bản chất Plugin Code Terraform
Chức năng Gọi API cloud Tái sử dụng cấu hình
Bắt buộc? Không

Hiểu đơn giản: Provider = công cụ kết nối cloud, Module = cách tổ chức code cho gọn.

Tóm lại

Bài này mình đã đi qua:

  • Provider là gì và tại sao Terraform không thể thiếu nó
  • Cách khai báo provider và tại sao phải khóa version
  • Dùng nhiều provider trong cùng một project
  • Provider alias để xử lý multi-region hoặc multi-account

Bài viết thuộc series HashiCorp Certified: Terraform Associate trên ttnguyen.net. Cảm ơn bạn đã đọc