What if you could build and check your cloud setup without lifting a finger?
Data source vs resource difference in Terraform - When to Use Which
Imagine you need to build a house and also check the availability of nearby utilities like water and electricity manually by calling different companies every time.
This manual way is slow and confusing because you have to remember which company to call and what information to ask for. You might also make mistakes or miss important details.
Using Terraform's data sources and resources is like having a smart assistant who can both build the house for you and check the utility info automatically, so you don't have to do it yourself every time.
Call utility company API manually to get info
Manually create infrastructure with separate commandsUse data source to fetch existing info
Use resource to create new infrastructure in one configThis difference lets you easily combine existing cloud info with new setups, making your infrastructure fast, reliable, and easy to manage.
You want to create a virtual machine but first need to find the latest image ID available in your cloud. Using a data source fetches that ID automatically, then a resource creates the VM using it.
Data sources read existing info without changing it.
Resources create or change cloud infrastructure.
Using both together makes automation smooth and error-free.
Practice
resource and a data source in Terraform?Solution
Step 1: Understand resource role
Resources in Terraform are used to create or manage cloud infrastructure components.Step 2: Understand data source role
Data sources are used to read information about existing infrastructure without changing it.Final Answer:
Resources create or manage infrastructure; data sources only read existing information. -> Option BQuick Check:
Resource = create/manage, Data source = read [OK]
- Thinking data sources create resources
- Confusing resource and data source roles
- Assuming both modify infrastructure
- Believing data sources are temporary
Solution
Step 1: Identify data source syntax
Data sources use the keyworddatafollowed by the type and name.Step 2: Check options
data "aws_ami" "example" {} usesdata "aws_ami" "example" {}, which is correct syntax for a data source.Final Answer:
data "aws_ami" "example" {} -> Option AQuick Check:
Data source starts with 'data' keyword [OK]
- Using 'resource' keyword for data sources
- Mixing 'source' keyword which doesn't exist
- Prefixing resource with 'data_' incorrectly
- Confusing resource and data source syntax
data "aws_vpc" "selected" {
filter {
name = "tag:Name"
values = ["main-vpc"]
}
}
resource "aws_subnet" "example" {
vpc_id = data.aws_vpc.selected.id
cidr_block = "10.0.1.0/24"
}What does the
data.aws_vpc.selected.id represent?Solution
Step 1: Analyze data source usage
Thedata "aws_vpc" "selected"block reads an existing VPC filtered by the tag "Name=main-vpc".Step 2: Understand reference in resource
The resourceaws_subnet.exampleusesdata.aws_vpc.selected.idto get the ID of that existing VPC to create a subnet inside it.Final Answer:
The ID of an existing VPC filtered by tag "Name=main-vpc". -> Option AQuick Check:
Data source reads existing VPC ID [OK]
- Thinking data source creates new VPC
- Confusing subnet ID with VPC ID
- Assuming random ID generation
- Using resource instead of data source for existing info
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
}
data "aws_vpc" "main" {
id = aws_vpc.main.id
}What is the problem?
Solution
Step 1: Check naming conflict
The resource and data source both use the name "main" which causes a naming conflict in Terraform.Step 2: Terraform rules
Terraform does not allow a resource and a data source to share the same type and name within the same module.Final Answer:
You cannot use the same name for resource and data source. -> Option CQuick Check:
Resource and data source names must be unique [OK]
- Thinking same names cause conflicts
- Believing you always need filters over id
- Assuming data sources can depend on resources
- Blaming missing provider config
Solution
Step 1: Identify existing infrastructure
The VPC already exists, so it should not be recreated or managed as a resource.Step 2: Use data source for existing VPC
Use a data source block to safely read the existing VPC's details without changing it.Step 3: Create subnet resource
Create a resource block for the subnet to add new infrastructure inside the existing VPC.Final Answer:
Use a data source block to read the existing VPC and a resource block to create the subnet. -> Option DQuick Check:
Data source reads existing; resource creates new [OK]
- Trying to recreate existing VPC as resource
- Using data source to create subnet (not possible)
- Ignoring existing VPC and creating subnet without VPC ID
- Using resource for both causing conflicts
Ready to prove it?
Pass the test and this pattern moves unknown
