📖 Scenario: You are setting up infrastructure using Terraform. You want to create a virtual machine that depends on the network information retrieved from a data source. This ensures the VM uses the correct network ID.
🎯 Goal: Build a Terraform configuration that uses a data source to get network details and then creates a virtual machine resource that depends on this data source.
📋 What You'll Learn
Create a data source block to fetch network information
Define a variable for the network name
Create a virtual machine resource that uses the network ID from the data source
Ensure the VM resource depends on the data source
💡 Why This Matters
🌍 Real World
In real cloud projects, resources often depend on existing infrastructure. Using data sources and dependencies ensures correct order and configuration.
💼 Career
Understanding data source dependencies is essential for cloud engineers and DevOps professionals managing infrastructure as code.
Progress0 / 4 steps
1
Create a data source to fetch network information
Write a Terraform data block named network using the provider azurerm_network_interface. Set the name attribute to "my-nic" and the resource_group_name attribute to "my-resource-group".
Terraform
Hint
Use a data block with the exact name network and provider azurerm_network_interface.
2
Define a variable for the network name
Create a Terraform variable named network_name with a default value of "my-nic".
Terraform
Hint
Use a variable block with the exact name network_name and set its default to "my-nic". Update the data source to use var.network_name for the name.
3
Create a virtual machine resource using the network ID
Add a Terraform resource block named azurerm_linux_virtual_machine with the resource name vm. Set the name to "my-vm", resource_group_name to "my-resource-group", location to data.azurerm_network_interface.network.location, and network_interface_ids to a list containing data.azurerm_network_interface.network.id.
Terraform
Hint
Use a resource block with the exact name azurerm_linux_virtual_machine and resource name vm. Use the network ID from the data source in network_interface_ids.
4
Add explicit dependency on the data source
Add the depends_on attribute to the azurerm_linux_virtual_machine.vm resource. Set it to a list containing data.azurerm_network_interface.network to ensure the VM depends on the network data source.
Terraform
Hint
Add the depends_on attribute inside the VM resource block with the exact value [data.azurerm_network_interface.network].
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
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.
Step 2: Identify dependency purpose
Dependencies ensure Terraform fetches this existing info before creating or modifying other resources that rely on it.
Final Answer:
To fetch existing resource information before creating new resources -> Option A
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
Step 1: Recall depends_on syntax
Terraform expects depends_on to be a list of resource or data source references without quotes.
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.
Final Answer:
depends_on = [aws_vpc.main] -> Option D
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
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.
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.
Final Answer:
Terraform plan will fail with an error before creating the instance -> Option C
Quick Check:
Data source failure = plan error [OK]
Hint: Missing data source value causes plan failure [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
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.
Step 2: Evaluate explicit depends_on necessity
Explicit depends_on is not needed unless the dependency is indirect or complex; here, implicit dependency suffices.
Final Answer:
No need for depends_on; Terraform infers dependency from data source usage -> Option B
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 unknownstrongwhile earning +1 Grip toward your certificate.