0
0
Terraformcloud~5 mins

Data source block syntax in Terraform - Commands & Configuration

Choose your learning style9 modes available
Introduction
Sometimes you need to get information about existing resources outside your Terraform code. Data source blocks let you read this information so you can use it in your setup.
When you want to find details about an existing cloud resource like a network or storage bucket.
When you need to use information from resources created outside your Terraform project.
When you want to reference shared resources managed by other teams without recreating them.
When you want to get the latest data about a resource before creating dependent resources.
When you want to avoid hardcoding values by fetching them dynamically.
Config File - main.tf
main.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
  required_version = ">= 1.0"
}

provider "aws" {
  region = "us-east-1"
}

# Data source block to get information about an existing AWS VPC

data "aws_vpc" "example" {
  filter {
    name   = "tag:Name"
    values = ["example-vpc"]
  }
  most_recent = true
}

output "vpc_id" {
  value = data.aws_vpc.example.id
}

This Terraform file uses a data block to fetch details about an existing AWS VPC named "example-vpc". The filter section tells Terraform how to find the VPC by its tag. The most_recent argument ensures the latest matching VPC is selected if multiple exist. The output block then shows the VPC's ID after applying the configuration.

Commands
This command sets up Terraform in the current folder, downloading the AWS provider so Terraform can talk to AWS.
Terminal
terraform init
Expected OutputExpected
Initializing the backend... Initializing provider plugins... - Finding hashicorp/aws versions matching "~> 4.0"... - Installing hashicorp/aws v4.60.0... - Installed hashicorp/aws v4.60.0 (signed by HashiCorp) Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work.
This command shows what Terraform will do. Here, it will read the existing VPC data and show the output value without making changes.
Terminal
terraform plan
Expected OutputExpected
Refreshing Terraform state in-memory prior to plan... ------------------------------------------------------------------------ No changes. Your infrastructure matches the configuration. This means that Terraform did not detect any differences between your configuration and real physical resources that exist. As a result, no actions need to be performed.
This command applies the configuration, fetching the VPC data and showing the VPC ID as output.
Terminal
terraform apply -auto-approve
Expected OutputExpected
data.aws_vpc.example: Refreshing state... Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: vpc_id = "vpc-0abcd1234efgh5678"
-auto-approve - Automatically approve the apply without asking for confirmation
Key Concept

If you remember nothing else from this pattern, remember: data source blocks let Terraform read existing resources so you can use their information without creating them.

Common Mistakes
Trying to use a data source without initializing Terraform first
Terraform needs to download providers before it can read data sources, so the command will fail.
Always run 'terraform init' before 'terraform plan' or 'terraform apply' when adding new data sources.
Using incorrect filter names or values in the data source block
Terraform won't find the resource and will error or return empty data.
Check the exact tag names and values in your cloud console and match them exactly in the filter.
Expecting data sources to create or change resources
Data sources only read existing resources; they do not create or modify anything.
Use resource blocks to create or change infrastructure, and data sources only to read.
Summary
Use a data source block to read information about existing resources by specifying filters.
Run 'terraform init' to prepare Terraform and download providers before using data sources.
Use 'terraform plan' to preview and 'terraform apply' to fetch data and see outputs.