Terraform Tutorial — Data Source Syntax
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.