Reference #

Mendeklarasikan data source adalah langkah pertama. Langkah berikutnya adalah menggunakan nilainya secara efektif — mereferensikan atribut yang tepat, memahami kapan nilai tersedia, dan menghindari jebakan yang muncul ketika data source bergantung pada resource yang belum tentu ada saat plan dijalankan.

Cara Mereferensikan Atribut Data Source #

Referensi ke atribut data source menggunakan format data.<TYPE>.<NAME>.<ATTRIBUTE>.

data "aws_ami" "ubuntu" {
  most_recent = true
  owners      = ["099720109477"]

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"]
  }
}

# Referensi atribut data source:
resource "aws_instance" "web" {
  ami           = data.aws_ami.ubuntu.id           # String — AMI ID
  instance_type = "t3.micro"
}

resource "aws_launch_template" "web" {
  image_id      = data.aws_ami.ubuntu.id
  instance_type = "t3.micro"

  # Referensi atribut lain dari data source yang sama
  description = "Template menggunakan ${data.aws_ami.ubuntu.name} (${data.aws_ami.ubuntu.creation_date})"
}

Data Source untuk Membaca State Workspace Lain #

terraform_remote_state adalah data source khusus yang membaca output dari workspace Terraform lain. Ini memungkinkan arsitektur multi-workspace yang terpisah tapi terhubung.

# Workspace "networking" menyediakan VPC dan subnet
# Workspace "compute" membaca output dari workspace "networking"

data "terraform_remote_state" "networking" {
  backend = "s3"

  config = {
    bucket = "my-terraform-state"
    key    = "production/networking/terraform.tfstate"
    region = "ap-southeast-1"
  }
}

# Gunakan output dari workspace networking
resource "aws_instance" "app" {
  ami       = data.aws_ami.ubuntu.id
  subnet_id = data.terraform_remote_state.networking.outputs.private_subnet_ids[0]

  vpc_security_group_ids = [
    data.terraform_remote_state.networking.outputs.app_security_group_id
  ]
}

# Atau baca semua subnet sekaligus
resource "aws_autoscaling_group" "app" {
  vpc_zone_identifier = data.terraform_remote_state.networking.outputs.private_subnet_ids
  # ...
}

Data Source yang Bergantung pada Resource #

Ada kasus di mana data source perlu membaca resource yang baru saja dibuat dalam konfigurasi yang sama. Ini membutuhkan depends_on.

# SKENARIO: Membaca policy yang baru dibuat untuk menggabungkannya

resource "aws_iam_policy" "s3_read" {
  name   = "s3-read-policy"
  policy = data.aws_iam_policy_document.s3_read.json
}

resource "aws_iam_policy" "cloudwatch_write" {
  name   = "cloudwatch-write-policy"
  policy = data.aws_iam_policy_document.cloudwatch_write.json
}

# Data source ini membaca policy yang baru dibuat di atas
data "aws_iam_policy" "s3_read" {
  name = "s3-read-policy"

  # Tanpa depends_on, data source mungkin di-evaluate sebelum
  # resource aws_iam_policy.s3_read selesai dibuat
  depends_on = [aws_iam_policy.s3_read]
}
# Pola yang lebih umum: hindari situasi ini dengan referensi langsung
# Daripada baca via data source, referensikan resource langsung

resource "aws_iam_role_policy_attachment" "app_s3" {
  role       = aws_iam_role.app.name
  policy_arn = aws_iam_policy.s3_read.arn  # Referensi langsung — lebih bersih
  # Bukan: data.aws_iam_policy.s3_read.arn
}

Pola Data Source di Arsitektur Production #

# POLA 1: Dynamic AMI — selalu gunakan AMI terbaru yang sudah di-test

data "aws_ami" "app" {
  most_recent = true
  owners      = ["self"]  # AMI yang dibuat oleh akun ini sendiri (golden AMI)

  filter {
    name   = "name"
    values = ["app-server-*"]
  }

  filter {
    name   = "tag:Status"
    values = ["tested"]  # Hanya AMI yang sudah lulus testing
  }
}
# POLA 2: Lookup resource yang dikelola tim lain

# Tim networking mengelola VPC dan menandainya dengan tag
data "aws_vpc" "main" {
  tags = {
    Name        = "main-vpc"
    Environment = var.environment
    ManagedBy   = "networking-team"
  }
}

data "aws_subnets" "private" {
  filter {
    name   = "vpc-id"
    values = [data.aws_vpc.main.id]
  }

  tags = {
    Tier = "private"
  }
}
# POLA 3: Lookup berdasarkan naming convention yang konsisten

locals {
  # Naming convention yang disepakati tim: <project>-<env>-<component>
  vpc_name = "${var.project}-${var.environment}-vpc"
}

data "aws_vpc" "main" {
  filter {
    name   = "tag:Name"
    values = [local.vpc_name]
  }
}
# POLA 4: Conditional data source — hanya query jika diperlukan

variable "use_existing_vpc" {
  type    = bool
  default = false
}

data "aws_vpc" "existing" {
  count = var.use_existing_vpc ? 1 : 0

  tags = {
    Name = "existing-vpc"
  }
}

resource "aws_subnet" "app" {
  vpc_id = var.use_existing_vpc ? data.aws_vpc.existing[0].id : aws_vpc.new.id
  # ...
}

Membaca Atribut Akun dan Region #

Data source untuk informasi akun dan region sangat berguna untuk membuat konfigurasi yang portable — tidak perlu hardcode account ID atau region.

data "aws_caller_identity" "current" {}
data "aws_region" "current" {}
data "aws_partition" "current" {}

# Gunakan untuk ARN yang portable
resource "aws_iam_role_policy" "app" {
  role = aws_iam_role.app.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect   = "Allow"
      Action   = ["s3:GetObject"]
      Resource = [
        # Portable — tidak hardcode account ID atau region
        "arn:${data.aws_partition.current.partition}:s3:::${var.bucket_name}/*"
      ]
    }]
  })
}

# Tag standar yang menyertakan informasi akun
locals {
  standard_tags = {
    AccountId  = data.aws_caller_identity.current.account_id
    Region     = data.aws_region.current.name
    ManagedBy  = "terraform"
  }
}

Ringkasan #

  • Format referensi: data.<TYPE>.<NAME>.<ATTRIBUTE> — konsisten dengan format referensi resource tapi dengan prefix data..
  • terraform_remote_state untuk membaca output workspace lain — berguna untuk arsitektur multi-workspace tapi menciptakan coupling yang perlu dipertimbangkan.
  • depends_on untuk data source yang membaca resource dalam konfigurasi yang sama — pastikan resource selesai dibuat sebelum data source di-evaluate.
  • Lebih baik referensi langsung ke resource daripada membaca via data source jika resource ada di konfigurasi yang sama.
  • Pola golden AMI: gunakan filter tag:Status = tested untuk memastikan hanya AMI yang sudah divalidasi yang digunakan.
  • aws_caller_identity dan aws_region untuk membuat konfigurasi yang portable — tidak perlu hardcode account ID atau region name di konfigurasi.

← Sebelumnya: Apa itu Datasource?   Berikutnya: Anti-Pattern Datasource →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact