Apa itu Datasource? #
Resource dan data source sama-sama menggunakan informasi dari provider, tapi perannya berlawanan. Resource membuat infrastruktur dan Terraform bertanggung jawab atas lifecycle-nya. Data source membaca informasi dari infrastruktur yang sudah ada — yang mungkin dibuat oleh Terraform workspace lain, oleh tim lain, atau bahkan secara manual. Data source adalah cara Terraform menjangkau keluar dari konfigurasinya sendiri untuk mendapat informasi yang dibutuhkan.
Resource vs Data Source: Perbedaan Mendasar #
# resource — Terraform MEMILIKI ini
# Dibuat, diupdate, dan dihapus oleh Terraform
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
# VPC ini ada karena Terraform membuatnya
# Jika blok ini dihapus dari konfigurasi → VPC dihapus
}
# data — Terraform MEMBACA ini
# Sudah ada di luar, Terraform hanya query
data "aws_vpc" "existing" {
id = "vpc-0abcdef1234567890"
# VPC ini sudah ada sebelum Terraform — dibuat secara manual atau oleh tim lain
# Terraform hanya membacanya, tidak pernah mengubah atau menghapusnya
}
LIFECYCLE PERBANDINGAN:
resource:
terraform apply → resource DIBUAT
ubah konfigurasi → resource DIUPDATE
hapus dari .tf → resource DIHAPUS
data:
terraform plan/apply → data DIBACA
ubah filter → data yang BERBEDA DIBACA
hapus dari .tf → tidak ada yang berubah di infrastruktur
Cara Data Source Bekerja dalam Execution Plan #
Data source di-evaluate saat terraform plan — sebelum operasi create/update/destroy resource manapun.
URUTAN EVALUASI:
terraform plan dimulai
│
▼
1. Evaluasi semua data source
(query ke provider API sekarang juga)
│
▼
2. Gunakan nilai dari data source
untuk menghitung resource plan
│
▼
3. Tampilkan execution plan
# Data source dievaluasi dulu, baru resource yang menggunakannya diplan
data "aws_ami" "ubuntu" {
most_recent = true
owners = ["099720109477"] # Canonical
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-*-22.04-amd64-server-*"]
}
}
resource "aws_instance" "web" {
# Saat plan, data.aws_ami.ubuntu.id sudah diketahui nilainya
# (bukan "known after apply" seperti resource)
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
}
Data Source yang Paling Sering Digunakan #
# 1. AMI terbaru
data "aws_ami" "ubuntu_22_04" {
most_recent = true
owners = ["099720109477"]
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
}
# 2. Informasi akun AWS saat ini
data "aws_caller_identity" "current" {}
data "aws_region" "current" {}
# Gunakan dalam konfigurasi:
resource "aws_s3_bucket" "logs" {
bucket = "logs-${data.aws_caller_identity.current.account_id}-${data.aws_region.current.name}"
}
# 3. Availability Zones yang tersedia
data "aws_availability_zones" "available" {
state = "available"
}
resource "aws_subnet" "public" {
count = 3
availability_zone = data.aws_availability_zones.available.names[count.index]
vpc_id = aws_vpc.main.id
cidr_block = "10.0.${count.index}.0/24"
}
# 4. VPC atau resource yang dikelola Terraform lain
data "aws_vpc" "shared_services" {
tags = {
Name = "shared-services-vpc"
Environment = "production"
}
}
# 5. Secret dari AWS Secrets Manager
data "aws_secretsmanager_secret_version" "api_key" {
secret_id = "production/myapp/api-key"
}
# 6. IAM policy document
data "aws_iam_policy_document" "assume_role" {
statement {
effect = "Allow"
actions = ["sts:AssumeRole"]
principals {
type = "Service"
identifiers = ["ec2.amazonaws.com"]
}
}
}
resource "aws_iam_role" "instance" {
assume_role_policy = data.aws_iam_policy_document.assume_role.json
}
Kapan Menggunakan Data Source #
GUNAKAN DATA SOURCE UNTUK:
✓ Membaca resource yang dikelola workspace Terraform lain
(VPC dari tim networking, IAM role dari tim security)
✓ Mendapatkan informasi dinamis yang berubah
(AMI terbaru, AZ yang tersedia, latest RDS engine version)
✓ Membaca secret dari AWS Secrets Manager atau Vault
✓ Mendapatkan informasi tentang akun atau region aktif
✓ Membaca resource yang dibuat secara manual dan tidak akan di-Terraform-kan
✓ Membuat IAM policy document secara programatik
JANGAN GUNAKAN DATA SOURCE UNTUK:
✗ Resource yang ingin kamu kelola lifecycle-nya dengan Terraform
→ Gunakan resource block, bukan data block
✗ Menyiasati dependency antar workspace secara implicit coupling
→ Pertimbangkan mengoper nilai via variable secara eksplisit
Data Source dengan Filter yang Salah #
Salah satu kesalahan paling umum dengan data source adalah filter yang mengembalikan lebih dari satu hasil atau tidak ada hasil sama sekali.
# ANTI-PATTERN: Filter yang terlalu lebar — mungkin mengembalikan >1 hasil
data "aws_instance" "web" {
filter {
name = "instance-state-name"
values = ["running"] # Ada banyak instance yang running!
}
# Error: Your query returned more than one result. Please try a more specific search criteria.
}
# BENAR: Filter yang cukup spesifik untuk mengembalikan tepat 1 hasil
data "aws_instance" "web" {
filter {
name = "tag:Name"
values = ["web-server-production"]
}
filter {
name = "instance-state-name"
values = ["running"]
}
}
Ringkasan #
- Data source membaca, resource membuat — data source tidak pernah mengubah infrastruktur, hanya membaca informasi dari yang sudah ada.
- Data source di-evaluate saat plan — nilainya sudah diketahui sebelum resource apapun dibuat atau diubah.
- Gunakan untuk informasi dinamis — AMI terbaru, AZ yang tersedia, informasi akun saat ini — nilai yang berubah dan tidak bisa di-hardcode.
- Gunakan untuk membaca lintas batas — resource dari workspace lain, resource yang dikelola tim lain, resource yang dibuat manual.
- Filter harus cukup spesifik untuk mengembalikan tepat satu hasil — filter yang terlalu lebar menyebabkan error saat plan.
- Data source tidak menciptakan coupling ownership — Terraform tidak bisa menghapus atau mengubah resource yang hanya dibaca via data source.