Bird
Raised Fist0
Terraformcloud~30 mins

Querying existing resources in Terraform - Mini Project: Build & Apply

Choose your learning style10 modes available
Querying Existing Resources with Terraform
📖 Scenario: You are managing cloud infrastructure using Terraform. You want to reuse an existing virtual network instead of creating a new one. This helps avoid duplication and keeps your setup clean.
🎯 Goal: Learn how to query an existing resource in Terraform and use its attributes in your configuration.
📋 What You'll Learn
Use Terraform to query an existing virtual network by its name
Use the data source attributes like name and ID in your configuration
Use the queried virtual network name to create a new subnet inside the existing virtual network
Ensure the Terraform configuration is valid and deployable
💡 Why This Matters
🌍 Real World
In real cloud projects, reusing existing resources avoids duplication and reduces costs. Querying existing resources helps integrate new infrastructure with what is already deployed.
💼 Career
Cloud engineers and DevOps professionals often need to reference existing infrastructure in Terraform to maintain and extend cloud environments safely and efficiently.
Progress0 / 4 steps
1
Create a data block to query the existing virtual network
Write a Terraform data block named existing_vnet to query the Azure virtual network resource with the name my-vnet in the resource group my-resource-group.
Terraform
Hint

Use the data block to look up existing resources by specifying their exact name and resource group.

2
Create a variable to hold the subnet name
Create a Terraform variable named subnet_name with the default value my-subnet.
Terraform
Hint

Define a variable block with the name subnet_name and set its default value.

3
Create a subnet resource using the queried virtual network ID
Create a Terraform resource block named azurerm_subnet with the name my_subnet. Use the variable subnet_name for the subnet name, the virtual network name from data.azurerm_virtual_network.existing_vnet.name, and set the address prefix to 10.0.1.0/24.
Terraform
Hint

Use the data.azurerm_virtual_network.existing_vnet.name to link the subnet to the existing virtual network.

4
Add the provider block for AzureRM
Add the Terraform provider block for azurerm with features {} to enable the Azure provider.
Terraform
Hint

The provider block is required to tell Terraform which cloud to work with.

Practice

(1/5)
1. What is the main purpose of a data block in Terraform?
easy
A. To create new cloud resources from scratch
B. To delete resources that are no longer needed
C. To query and use existing resources created outside the current configuration
D. To define variables for user input

Solution

  1. Step 1: Understand the role of data blocks

    data blocks in Terraform are used to look up or query existing resources that were created outside the current Terraform configuration or by other means.
  2. Step 2: Differentiate from resource creation

    Unlike resource blocks that create new infrastructure, data blocks only read information without making changes.
  3. Final Answer:

    To query and use existing resources created outside the current configuration -> Option C
  4. Quick Check:

    Data blocks read existing resources = B [OK]
Hint: Data blocks read existing resources, not create them [OK]
Common Mistakes:
  • Confusing data blocks with resource creation
  • Thinking data blocks delete resources
  • Using data blocks to define variables
2. Which of the following is the correct syntax to query an existing AWS VPC by its ID using a data block?
easy
A. data "aws_vpc" "example" { id = "vpc-123456" }
B. resource "aws_vpc" "example" { id = "vpc-123456" }
C. data "aws_vpc" "example" { vpc_id = "vpc-123456" }
D. data "aws_vpc" "example" { name = "vpc-123456" }

Solution

  1. Step 1: Identify correct data block syntax

    The correct syntax uses data followed by the provider resource type and a name, then inside the block the attribute id is used to specify the VPC ID.
  2. Step 2: Check attribute correctness

    The attribute to specify the VPC ID is id, not vpc_id or name.
  3. Final Answer:

    data "aws_vpc" "example" { id = "vpc-123456" } -> Option A
  4. Quick Check:

    Use id attribute in data block = A [OK]
Hint: Use 'id' attribute inside data block to query by resource ID [OK]
Common Mistakes:
  • Using resource block instead of data block
  • Using wrong attribute names like vpc_id
  • Confusing resource creation syntax with data query
3. Given this Terraform data block:
data "aws_subnet" "selected" {
  filter {
    name   = "tag:Name"
    values = ["public-subnet"]
  }
}

What will data.aws_subnet.selected.id return?
medium
A. The ID of the subnet tagged with Name=public-subnet
B. A list of all subnet IDs in the AWS account
C. An error because filter is not allowed in data blocks
D. The name of the subnet instead of the ID

Solution

  1. Step 1: Understand the filter block in data source

    The filter block selects resources matching the tag Name=public-subnet.
  2. Step 2: Identify the returned attribute

    data.aws_subnet.selected.id returns the ID of the matched subnet, not a list or name.
  3. Final Answer:

    The ID of the subnet tagged with Name=public-subnet -> Option A
  4. Quick Check:

    Filter selects subnet by tag, id returns its ID = D [OK]
Hint: Filter selects resource; .id returns its ID [OK]
Common Mistakes:
  • Thinking filter returns multiple resources
  • Assuming .id returns name or list
  • Believing filter is invalid in data blocks
4. You wrote this data block to query an existing AWS security group:
data "aws_security_group" "example" {
  name = "my-sg"
}

But Terraform returns an error: "Multiple security groups found with name 'my-sg'". What is the best fix?
medium
A. Remove the name attribute to query all security groups
B. Add a filter block with more specific criteria to narrow the search
C. Change data to resource to create a new security group
D. Rename the security group in AWS to have a unique name

Solution

  1. Step 1: Understand the error cause

    The error means multiple security groups share the same name, so Terraform cannot pick one.
  2. Step 2: Narrow the query with filters

    Adding a filter block with more attributes (like VPC ID) helps select exactly one security group.
  3. Final Answer:

    Add a filter block with more specific criteria to narrow the search -> Option B
  4. Quick Check:

    Use filters to avoid multiple matches = C [OK]
Hint: Use filters to narrow data queries when duplicates exist [OK]
Common Mistakes:
  • Switching to resource block instead of filtering
  • Removing name attribute causing ambiguous query
  • Changing AWS resource names unnecessarily
5. You want to use an existing AWS IAM role in your Terraform configuration, but only know its ARN. Which is the best way to query this role using a data block?
hard
A. Use data "aws_iam_role" "existing" { id = "my-role" }
B. Use data "aws_iam_role" "existing" { name = "my-role" } and ignore ARN
C. Use resource "aws_iam_role" "existing" { arn = "arn:aws:iam::123456789012:role/my-role" }
D. Use data "aws_iam_role" "existing" { arn = "arn:aws:iam::123456789012:role/my-role" }

Solution

  1. Step 1: Identify correct attribute to query by ARN

    The aws_iam_role data source supports querying by arn attribute to find the exact role.
  2. Step 2: Avoid using resource block or wrong attributes

    Using resource block tries to create a new role, which is incorrect. Using name may fail if multiple roles share the name. id is not a valid attribute here.
  3. Final Answer:

    Use data "aws_iam_role" "existing" { arn = "arn:aws:iam::123456789012:role/my-role" } -> Option D
  4. Quick Check:

    Query IAM role by ARN using data block = A [OK]
Hint: Query IAM role by ARN attribute in data block [OK]
Common Mistakes:
  • Using resource block instead of data block
  • Querying by name when ARN is known
  • Using invalid attribute 'id' for IAM role
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