Bird
Raised Fist0
Terraformcloud~10 mins

Data source block syntax in Terraform - Step-by-Step Execution

Choose your learning style10 modes available
Process Flow - Data source block syntax
Start Terraform config
↓
Define data source block
↓
Specify provider and data source type
↓
Set required arguments
↓
Terraform reads data source
↓
Data available for use in resources
↓
End
Terraform reads the data source block to fetch existing info, making it available for resource configuration.
Execution Sample
Terraform
data "aws_ami" "example" {
  most_recent = true
  owners      = ["amazon"]
  filter {
    name   = "name"
    values = ["amzn2-ami-hvm-*-x86_64-gp2"]
  }
}
This data block fetches the most recent Amazon Linux 2 AMI owned by Amazon.
Process Table
StepActionEvaluationResult
1Terraform reads 'data' block type and namedata "aws_ami" "example"Identifies data source type 'aws_ami' with local name 'example'
2Reads attribute 'most_recent'most_recent = trueSets to fetch the latest AMI
3Reads attribute 'owners'owners = ["amazon"]Filters AMIs owned by Amazon
4Reads 'filter' blockfilter { name = "name", values = ["amzn2-ami-hvm-*-x86_64-gp2"] }Filters AMIs matching name pattern
5Terraform queries AWS API with filtersAPI call with filtersReturns AMI data matching criteria
6Data source 'example' populatedData availableAMI ID and attributes ready for use
7Terraform completes data source readEnd of data block processingData source ready for resource references
💡 Terraform finishes reading data source block and stores fetched data for later use.
Status Tracker
VariableStartAfter Step 2After Step 3After Step 4After Step 5Final
most_recentundefinedtruetruetruetruetrue
ownersundefinedundefined["amazon"]["amazon"]["amazon"]["amazon"]
filter_nameundefinedundefinedundefined"name""name""name"
filter_valuesundefinedundefinedundefined["amzn2-ami-hvm-*-x86_64-gp2"]["amzn2-ami-hvm-*-x86_64-gp2"]["amzn2-ami-hvm-*-x86_64-gp2"]
data_source_resultundefinedundefinedundefinedundefinedAMI data objectAMI data object
Key Moments - 3 Insights
Why do we use 'data' blocks instead of 'resource' blocks for existing infrastructure?
Data blocks fetch existing info without creating or changing it, as shown in execution_table step 5 where Terraform queries AWS to get data but does not create anything.
What happens if the filter values do not match any existing resource?
Terraform will fail to find data and throw an error during the data source read phase (execution_table step 5), because data sources must return existing info.
Can we use variables inside data source blocks?
Yes, variables can be used to set attributes inside data blocks before Terraform reads them, similar to how 'owners' or 'filter.values' could be dynamic.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, at which step does Terraform actually fetch data from the cloud provider?
AStep 3
BStep 5
CStep 2
DStep 7
💡 Hint
Refer to execution_table row with 'Terraform queries AWS API with filters'
According to variable_tracker, what is the value of 'most_recent' after step 4?
Atrue
Bfalse
Cundefined
Dnull
💡 Hint
Check the 'most_recent' row under 'After Step 4' column in variable_tracker
If we remove the 'owners' attribute, what would likely happen during execution?
ATerraform will fail to parse the data block
BTerraform will ignore the data source
CTerraform will fetch all AMIs without owner filter
DTerraform will create a new AMI
💡 Hint
Consider how filters affect data source queries as shown in execution_table steps 3 and 5
Concept Snapshot
Terraform data source block syntax:
- Use 'data' keyword with type and name
- Set required arguments inside block
- Terraform reads and queries existing resources
- Data is read-only and used in resource configs
- Filters narrow down data source results
- Data source must return existing info or error
Full Transcript
This visual execution shows how Terraform processes a data source block. It starts by reading the block type and name, then reads attributes like 'most_recent' and 'owners'. Next, it reads any filter blocks to narrow the search. Terraform then queries the cloud provider API with these filters to fetch existing resource data. The fetched data is stored and made available for use in resource definitions. Variables like 'most_recent' and 'owners' are set before the query. If filters do not match any resource, Terraform errors. Data sources do not create or modify resources; they only read existing ones.

Practice

(1/5)
1. What is the main purpose of a data source block in Terraform?
easy
A. To create new cloud resources from scratch
B. To define variables for Terraform configuration
C. To delete existing cloud resources
D. To read information about existing cloud resources without creating new ones

Solution

  1. Step 1: Understand the role of data sources

    Data sources in Terraform are used to fetch information about existing resources, not to create or delete them.
  2. Step 2: Compare options with this role

    Only To read information about existing cloud resources without creating new ones describes reading existing resource info without creation, matching the data source purpose.
  3. Final Answer:

    To read information about existing cloud resources without creating new ones -> Option D
  4. Quick Check:

    Data source = read existing info [OK]
Hint: Data sources read existing resources, not create or delete [OK]
Common Mistakes:
  • Confusing data sources with resource blocks
  • Thinking data sources create resources
  • Assuming data sources delete resources
2. Which of the following is the correct syntax to define a data source block for an AWS AMI in Terraform?
easy
A. data "aws_ami" example { filter { name = "name" values = ["my-ami"] } }
B. resource "aws_ami" "example" { filter { name = "name" values = ["my-ami"] } }
C. data "aws_ami" "example" { filter { name = "name" values = ["my-ami"] } }
D. data aws_ami example { filter { name = "name" values = ["my-ami"] } }

Solution

  1. Step 1: Identify correct block type and syntax

    Data source blocks start with data, followed by resource type and local name in quotes.
  2. Step 2: Check each option

    data "aws_ami" "example" { filter { name = "name" values = ["my-ami"] } } uses correct quotes and block structure. resource "aws_ami" "example" { filter { name = "name" values = ["my-ami"] } } uses resource instead of data. Options A and C miss quotes around local name or resource type.
  3. Final Answer:

    data "aws_ami" "example" { filter { name = "name" values = ["my-ami"] } } -> Option C
  4. Quick Check:

    Data source syntax = data "type" "name" { ... } [OK]
Hint: Data source block uses data "type" "name" with quotes [OK]
Common Mistakes:
  • Using resource instead of data
  • Omitting quotes around type or name
  • Incorrect block nesting or missing braces
3. Given this Terraform data source block:
data "aws_vpc" "selected" {
  filter {
    name   = "tag:Name"
    values = ["main-vpc"]
  }
}

What will data.aws_vpc.selected.id return?
medium
A. The ID of the VPC tagged with Name=main-vpc
B. The name tag value main-vpc
C. A list of all VPC IDs in the AWS account
D. An error because filter syntax is invalid

Solution

  1. Step 1: Understand the filter block

    The filter selects the VPC resource with tag Name equal to main-vpc.
  2. Step 2: Identify the returned attribute

    data.aws_vpc.selected.id accesses the ID of the matched VPC, not the tag value or a list.
  3. Final Answer:

    The ID of the VPC tagged with Name=main-vpc -> Option A
  4. Quick Check:

    Filter selects resource, .id returns its ID [OK]
Hint: Filter narrows resource, .id returns its unique ID [OK]
Common Mistakes:
  • Confusing tag value with resource ID
  • Expecting a list instead of single ID
  • Assuming filter syntax is wrong
4. Identify the error in this Terraform data source block:
data "aws_subnet" "example" {
  filter {
    name = "availability-zone"
    values = "us-west-2a"
  }
}
medium
A. The values attribute should be a list, not a string
B. The filter block is missing a closing brace
C. The data source type aws_subnet does not support filters
D. The local name example must be uppercase

Solution

  1. Step 1: Check the values attribute type

    In Terraform, filter values must be a list, even if only one value is given.
  2. Step 2: Verify the given values

    The code uses a string instead of a list, which causes a syntax error.
  3. Final Answer:

    The values attribute should be a list, not a string -> Option A
  4. Quick Check:

    Filter values = list, not string [OK]
Hint: Always use list syntax ["value"] for filter values [OK]
Common Mistakes:
  • Using string instead of list for values
  • Assuming filter block needs no braces
  • Thinking local name case matters
5. You want to use a data source block to get the latest Amazon Linux 2 AMI ID filtered by owner and name pattern. Which of these blocks correctly achieves this?
hard
A. resource "aws_ami" "latest" { most_recent = true owners = ["amazon"] filter { name = "name" values = ["amzn2-ami-hvm-*-x86_64-gp2"] } }
B. data "aws_ami" "latest" { most_recent = true owners = ["amazon"] filter { name = "name" values = ["amzn2-ami-hvm-*-x86_64-gp2"] } }
C. data "aws_ami" "latest" { filter { name = "owner" values = ["amazon"] } filter { name = "name" values = ["amzn2-ami-hvm-*-x86_64-gp2"] } }
D. data "aws_ami" "latest" { most_recent = true owner = "amazon" filter { name = "name" values = ["amzn2-ami-hvm-*-x86_64-gp2"] } }

Solution

  1. Step 1: Confirm correct block type and attributes

    Use data block for reading AMI info, with most_recent = true and owners as a list.
  2. Step 2: Check filter and owner syntax

    data "aws_ami" "latest" { most_recent = true owners = ["amazon"] filter { name = "name" values = ["amzn2-ami-hvm-*-x86_64-gp2"] } } correctly uses owners list and a filter for name pattern. data "aws_ami" "latest" { filter { name = "owner" values = ["amazon"] } filter { name = "name" values = ["amzn2-ami-hvm-*-x86_64-gp2"] } } incorrectly filters owner as a filter. resource "aws_ami" "latest" { most_recent = true owners = ["amazon"] filter { name = "name" values = ["amzn2-ami-hvm-*-x86_64-gp2"] } } uses resource block instead of data. data "aws_ami" "latest" { most_recent = true owner = "amazon" filter { name = "name" values = ["amzn2-ami-hvm-*-x86_64-gp2"] } } uses singular owner instead of owners list.
  3. Final Answer:

    data "aws_ami" "latest" { most_recent = true owners = ["amazon"] filter { name = "name" values = ["amzn2-ami-hvm-*-x86_64-gp2"] } } -> Option B
  4. Quick Check:

    Use data block, owners list, most_recent true [OK]
Hint: Use owners list and most_recent true in data block [OK]
Common Mistakes:
  • Using resource block instead of data
  • Filtering owner instead of using owners attribute
  • Using singular owner instead of owners list
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard