Bird
Raised Fist0
Terraformcloud~10 mins

Data source dependencies in Terraform - Step-by-Step Execution

Choose your learning style10 modes available
Process Flow - Data source dependencies
Start Terraform Apply
↓
Evaluate Data Sources
↓
Check Dependencies
↓
If dependency exists
→Wait for dependency
↓
Dependency resolved
↓
Fetch Data Source Values
↓
Use Data in Resources
↓
Complete Apply
Terraform first evaluates data sources, waits for any dependencies to be ready, fetches their values, then uses those values in resource creation.
Execution Sample
Terraform
data "aws_vpc" "main" {
  filter {
    name   = "tag:Name"
    values = ["main-vpc"]
  }
}

resource "aws_subnet" "example" {
  vpc_id     = data.aws_vpc.main.id
  cidr_block = "10.0.1.0/24"
}
This code fetches the main VPC by tag, then creates a subnet inside that VPC using the fetched VPC ID.
Process Table
StepActionDependency CheckResultNext Step
1Start terraform applyN/ABegin executionEvaluate data sources
2Evaluate data source aws_vpc.mainNo dependenciesFetch VPC info with tag 'main-vpc'Data source fetched
3Data source aws_vpc.main fetchedN/AVPC ID availableUse VPC ID in resource aws_subnet.example
4Create resource aws_subnet.exampleDepends on data.aws_vpc.main.idSubnet created with VPC IDApply complete
5Apply completeN/AAll resources created successfullyEnd
💡 All data sources evaluated and dependencies resolved before resource creation.
Status Tracker
VariableStartAfter Step 2After Step 3Final
data.aws_vpc.main.idundefinedfetched VPC ID (e.g., vpc-123abc)availableavailable
aws_subnet.example.vpc_idundefinedundefinedset to data.aws_vpc.main.idset
Key Moments - 3 Insights
Why does Terraform wait before creating the subnet resource?
Terraform waits because the subnet resource depends on the VPC ID from the data source. It must fetch the VPC ID first (see execution_table step 3) before it can create the subnet.
What happens if the data source fails to fetch the VPC?
If the data source fails, Terraform cannot get the VPC ID, so it cannot create dependent resources like the subnet. The apply will fail early during data source evaluation (see execution_table step 2).
Can a resource depend on multiple data sources?
Yes, a resource can depend on multiple data sources. Terraform will wait for all data sources to be fetched before creating the resource, ensuring all dependencies are resolved.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, at which step is the VPC ID first available?
AStep 3
BStep 2
CStep 4
DStep 5
💡 Hint
Check the 'Result' column for when 'VPC ID available' appears.
According to the variable tracker, what is the value of aws_subnet.example.vpc_id after step 3?
Afetched VPC ID
Bset to data.aws_vpc.main.id
Cundefined
Dnull
💡 Hint
Look at the 'After Step 3' column for aws_subnet.example.vpc_id in variable_tracker.
If the data source aws_vpc.main had a dependency on another data source, what would Terraform do?
AIgnore the dependency and fetch immediately
BWait for the other data source to be fetched first
CFail the apply immediately
DCreate resources before data sources
💡 Hint
Refer to concept_flow where dependencies cause waiting before fetching.
Concept Snapshot
Terraform evaluates data sources before resources.
Resources can depend on data source outputs.
Terraform waits for data sources to resolve dependencies.
Data source failures stop resource creation.
Use data source attributes as inputs to resources.
Full Transcript
Terraform applies infrastructure by first evaluating data sources. It checks if data sources depend on others and waits accordingly. Once data sources are fetched, their outputs become available. Resources that depend on these outputs use them to create infrastructure. If data sources fail, Terraform stops before creating dependent resources. This ensures resources have the correct data before creation.

Practice

(1/5)
1. What is the main purpose of using data source dependencies in Terraform?
easy
A. To fetch existing resource information before creating new resources
B. To delete resources automatically after creation
C. To speed up Terraform plan execution by skipping resources
D. To create duplicate resources with the same configuration

Solution

  1. Step 1: Understand data source role

    Data sources in Terraform are used to read information about existing resources outside Terraform or created by other means.
  2. Step 2: Identify dependency purpose

    Dependencies ensure Terraform fetches this existing info before creating or modifying other resources that rely on it.
  3. Final Answer:

    To fetch existing resource information before creating new resources -> Option A
  4. Quick Check:

    Data source dependencies = fetch info first [OK]
Hint: Data sources get info before resource creation [OK]
Common Mistakes:
  • Thinking data sources create or delete resources
  • Confusing dependencies with resource lifecycle
  • Assuming data sources speed up plans by skipping
2. Which syntax correctly adds an explicit dependency on a data source named aws_vpc.main in a resource block?
easy
A. depends_on = {aws_vpc.main}
B. depends_on = aws_vpc.main
C. depends_on = ["aws_vpc.main"]
D. depends_on = [aws_vpc.main]

Solution

  1. Step 1: Recall depends_on syntax

    Terraform expects depends_on to be a list of resource or data source references without quotes.
  2. Step 2: Analyze options

    depends_on = [aws_vpc.main] uses a list with the correct reference syntax. depends_on = aws_vpc.main misses list brackets. depends_on = ["aws_vpc.main"] uses quotes making it a string, not a reference. depends_on = {aws_vpc.main} uses braces which is invalid.
  3. Final Answer:

    depends_on = [aws_vpc.main] -> Option D
  4. Quick Check:

    depends_on requires list of references [OK]
Hint: Use square brackets and no quotes for depends_on [OK]
Common Mistakes:
  • Using quotes around resource names
  • Omitting square brackets for depends_on
  • Using curly braces instead of square brackets
3. Given this Terraform snippet:
data "aws_ami" "example" {
  most_recent = true
  filter {
    name   = "name"
    values = ["amzn2-ami-hvm-*-x86_64-gp2"]
  }
}

resource "aws_instance" "web" {
  ami           = data.aws_ami.example.id
  instance_type = "t2.micro"
}

What happens if the data source aws_ami.example fails to find a matching AMI?
medium
A. Terraform will skip the instance creation silently
B. Terraform will create the instance with a default AMI
C. Terraform plan will fail with an error before creating the instance
D. Terraform will retry the data source until it finds an AMI

Solution

  1. Step 1: Understand data source failure behavior

    If a data source cannot find the requested resource, Terraform plan fails with an error because it cannot resolve the value.
  2. Step 2: Check resource dependency

    The resource depends on the data source's output for the AMI ID, so without it, resource creation cannot proceed.
  3. Final Answer:

    Terraform plan will fail with an error before creating the instance -> Option C
  4. Quick Check:

    Data source failure = plan error [OK]
Hint: Missing data source value causes plan failure [OK]
Common Mistakes:
  • Assuming default values are used automatically
  • Thinking Terraform retries data sources
  • Believing resource creation skips silently
4. You have this Terraform configuration:
data "aws_subnet" "selected" {
  filter {
    name   = "tag:Name"
    values = ["my-subnet"]
  }
}

resource "aws_instance" "app" {
  ami           = "ami-123456"
  instance_type = "t2.micro"
  subnet_id     = data.aws_subnet.selected.id
  depends_on    = [aws_instance.app]
}

What is the problem with this configuration?
medium
A. The resource depends_on itself causing a circular dependency
B. The data source filter syntax is invalid
C. The subnet_id should not use data source references
D. The instance_type is not a valid type

Solution

  1. Step 1: Analyze depends_on usage

    The resource aws_instance.app declares depends_on referencing itself, which creates a circular dependency.
  2. Step 2: Understand circular dependency impact

    Circular dependencies cause Terraform to fail planning or applying because it cannot resolve resource order.
  3. Final Answer:

    The resource depends_on itself causing a circular dependency -> Option A
  4. Quick Check:

    depends_on self-reference = circular dependency error [OK]
Hint: Avoid depends_on referencing the same resource [OK]
Common Mistakes:
  • Confusing data source filter syntax as error
  • Thinking subnet_id cannot use data sources
  • Assuming instance_type is invalid without checking
5. You want to create an AWS security group that allows inbound traffic only from instances in a specific subnet fetched via a data source. Which approach correctly ensures Terraform creates the security group only after the subnet data is fetched?
hard
A. Use depends_on = [data.aws_subnet.target] in the security group resource
B. No need for depends_on; Terraform infers dependency from data source usage
C. Create the security group first, then fetch the subnet data source
D. Use a null_resource to delay security group creation

Solution

  1. Step 1: Understand implicit dependencies

    When a resource uses a data source attribute (like subnet ID), Terraform automatically creates a dependency to fetch data first.
  2. Step 2: Evaluate explicit depends_on necessity

    Explicit depends_on is not needed unless the dependency is indirect or complex; here, implicit dependency suffices.
  3. Final Answer:

    No need for depends_on; Terraform infers dependency from data source usage -> Option B
  4. Quick Check:

    Data source usage creates implicit dependency [OK]
Hint: Data source references create implicit dependencies [OK]
Common Mistakes:
  • Adding unnecessary depends_on for direct data source use
  • Creating resources in wrong order ignoring implicit dependencies
  • Using null_resource unnecessarily
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