Terraform Tutorial — Data Source Syntax

less than 1 minute read

The data block follows a consistent pattern across all providers. Understanding its syntax lets you use any data source in the registry.


Basic Structure

data "<PROVIDER>_<TYPE>" "<LOCAL_NAME>" {
  # Arguments that identify the resource
}

Example:

data "aws_ami" "amazon_linux" {
  most_recent = true
  owners      = ["amazon"]

  filter {
    name   = "name"
    values = ["al2023-ami-*-x86_64"]
  }
}

Arguments vs Attributes

Arguments are what you provide (inputs):

data "aws_vpc" "main" {
  id = "vpc-0abc123"     # ← argument (you provide)
}

Attributes are what Terraform returns (outputs):

# After data source is read, these are available:
data.aws_vpc.main.cidr_block        # "10.0.0.0/16"
data.aws_vpc.main.default_route_table_id
data.aws_vpc.main.main_route_table_id
data.aws_vpc.main.tags

Common Data Source Patterns

By ID

data "aws_vpc" "main" {
  id = "vpc-0abc123"
}

By Tag

data "aws_vpc" "production" {
  tags = {
    Environment = "production"
  }
}

By Filter

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

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

Referencing Data Source Attributes

resource "aws_instance" "web" {
  ami           = data.aws_ami.amazon_linux.id
  instance_type = "t3.micro"
  subnet_id     = data.aws_subnet.public.id
}

What’s Next?

Let’s see the most common AWS data sources in action.


← What Are Data Sources? AWS Data Source Examples →