Trong Terraform:
resource→ dùng để tạo mới tài nguyêndata→ 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ẽ:
- Kết nối tới region: ap-southeast-1
- Gọi API AWS
- Lấy danh sách AZ
- Trả về dữ liệu có cấu trúc
- 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 Sourceaws_ami→ loại dữ liệu cần lấylatest_amazon_linux→ tên tham chiếu nội bộmost_recent = true→ lấy AMI mới nhấtowners = ["amazon"]→ chỉ lấy AMI từ Amazonfilter→ 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-1aap-southeast-1bap-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 đó