search

12-Data Source trong Terraform là gì? Vì sao cần – Bài 6

calendar_today Đăng ngày: 29/04/2026

Trong Terraform:

  • resource → dùng để tạo mới tài nguyên
  • data → dùng để lấy thông tin về tài nguyên đã tồn tại

Data Source dùng để truy xuất thông tin từ:

  • AWS
  • Azure
  • GCP
  • Hoặc bất kỳ provider nào Terraform hỗ trợ

Data Source là gì?

Data Source được sử dụng để truy xuất thông tin động về các thành phần không được quản lý bởi cấu hình Terraform hiện tại.

Ví dụ:

  • Lấy danh sách Availability Zones
  • Lấy AMI mới nhất
  • Lấy VPC đã tồn tại
  • Lấy danh sách IP ranges của AWS
  • Lấy Security Group có sẵn

Terraform sẽ gọi API của Cloud Provider (ví dụ AWS API) để lấy dữ liệu này.

Vì sao cần Data Source?

Nếu bạn cấu hình theo kiểu static, ví dụ:

availability_zone = "ap-southeast-1a"

Điều này có vấn đề:

  • Nếu AZ thay đổi?
  • Nếu region khác?
  • Nếu AMI mới ra đời?

Cấu hình sẽ bị lỗi hoặc không tối ưu. Thay vào đó, bạn dùng Data Source để lấy dữ liệu động. Data Source giúp bạn:

  • Lấy thông tin động từ Cloud
  • Không cần hard-code giá trị
  • Tự động thích nghi với thay đổi
  • Giảm lỗi cấu hình

Cách Terraform lấy dữ liệu từ AWS

AWS cung cấp rất nhiều API như:

  • API lấy Availability Zones
  • API lấy danh sách AMI
  • API lấy Security Groups
  • API lấy IP ranges của AWS

Terraform sử dụng các API này thông qua Data Source.

Ví dụ:

data "aws_availability_zones" "available" {}

Ví dụ:

provider "aws" {
region = "ap-southeast-1"
}

Terraform sẽ:

  1. Kết nối tới region: ap-southeast-1
  2. Gọi API AWS
  3. Lấy danh sách AZ
  4. Trả về dữ liệu có cấu trúc
  5. Cho phép bạn sử dụng trong resource khác

Cú pháp Data Source

Cấu trúc chung:

data "<PROVIDER>_<TYPE>" "<NAME>" {
  # optional filter
}

Ví dụ:

data "aws_ami" "latest_amazon_linux" {
  most_recent = true

  owners = ["amazon"]

  filter {
    name   = "name"
    values = ["amzn2-ami-hvm*"]
  }
}

Giải thích:

  • data → khai báo Data Source
  • aws_ami → loại dữ liệu cần lấy
  • latest_amazon_linux → tên tham chiếu nội bộ
  • most_recent = true → lấy AMI mới nhất
  • owners = ["amazon"] → chỉ lấy AMI từ Amazon
  • filter → lọc theo điều kiện

Cách sử dụng Data Source trong Resource

Sau khi định nghĩa Data Source, bạn có thể dùng như sau:

resource "aws_instance" "example" {
  ami           = data.aws_ami.latest_amazon_linux.id
  instance_type = "t2.micro"
}

Lúc này:

  • Terraform sẽ lấy AMI mới nhất
  • Sau đó dùng ID đó để tạo EC2.

Ví dụ cụ thế:

Trong AWS:

  • Region: ap-southeast-1
  • Availability Zone (AZ): ví dụ:
    • ap-southeast-1a
    • ap-southeast-1b
    • ap-southeast-1c

Region là khu vực lớn.

AZ là các data center riêng biệt bên trong region đó.

Giả sử bạn muốn tạo 2 EC2 ở 2 AZ khác nhau:

resource "aws_instance" "example" {
  count = 2

  ami           = "ami-xxxxxxxx"
  instance_type = "t2.micro"

  availability_zone = data.aws_availability_zones.available.names[count.index]
}

Terraform sẽ:

  • Instance 0 → ap-southeast-1a
  • Instance 1 → ap-southeast-1b

So sánh Resource và Data Source

Resource Data Source
Tạo tài nguyên mới Lấy thông tin tài nguyên đã tồn tại
Terraform quản lý lifecycle Chỉ đọc dữ liệu
Có thể create/update/delete Chỉ read

Khi nào nên dùng Data Source?

Bạn nên dùng khi:

  • Cần AMI mới nhất
  • Cần AZ khả dụng
  • Cần VPC đã tồn tại
  • Cần Subnet có sẵn
  • Cần IP ranges của AWS
  • Cần Security Group đã tạo trước đó