📖 Scenario: You are setting up a Terraform configuration to retrieve information about an existing AWS AMI (Amazon Machine Image) to use in your infrastructure.
🎯 Goal: Build a Terraform configuration that uses a data source block to fetch the latest Amazon Linux 2 AMI ID in the us-east-1 region.
📋 What You'll Learn
Create a data block named aws_ami with the name amazon_linux
Configure the data source to filter for the latest Amazon Linux 2 AMI
Use the owners attribute to specify Amazon's owner ID
Add an output to display the AMI ID
💡 Why This Matters
🌍 Real World
Terraform data sources let you query existing cloud resources to use their information in your infrastructure setup without recreating them.
💼 Career
Understanding data source blocks is essential for cloud engineers and DevOps professionals to integrate existing resources into Terraform-managed infrastructure.
Progress0 / 4 steps
1
Create the data source block skeleton
Create a Terraform data block named aws_ami with the name amazon_linux.
Terraform
Hint
Start with data "aws_ami" "amazon_linux" { } to define the data source block.
2
Add filter and owners attributes
Inside the data "aws_ami" "amazon_linux" block, add a filter block with name = "name" and values = ["amzn2-ami-hvm-*-x86_64-gp2"]. Also add owners = ["137112412989"] to specify Amazon's owner ID.
Terraform
Hint
Use a filter block with name and values, and add owners outside the filter.
3
Add most_recent attribute
Add the attribute most_recent = true inside the data "aws_ami" "amazon_linux" block to get the latest AMI.
Terraform
Hint
Set most_recent = true to ensure the latest AMI is selected.
4
Add output for the AMI ID
Create an output block named ami_id that outputs the value of data.aws_ami.amazon_linux.id.
Terraform
Hint
Use output "ami_id" with value = data.aws_ami.amazon_linux.id to show the AMI ID.
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
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.
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.
Final Answer:
To read information about existing cloud resources without creating new ones -> Option D
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
Step 1: Identify correct block type and syntax
Data source blocks start with data, followed by resource type and local name in quotes.
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.
Final Answer:
data "aws_ami" "example" { filter { name = "name" values = ["my-ami"] } } -> Option C
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
Step 1: Understand the filter block
The filter selects the VPC resource with tag Name equal to main-vpc.
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.
Final Answer:
The ID of the VPC tagged with Name=main-vpc -> Option A
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
Step 1: Check the values attribute type
In Terraform, filter values must be a list, even if only one value is given.
Step 2: Verify the given values
The code uses a string instead of a list, which causes a syntax error.
Final Answer:
The values attribute should be a list, not a string -> Option A
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?