- Data sources provide dynamic information about entities that are not managed by the current Terraform and configuration.
- Variables provide static information.
- Referencing a resource defined in a data source won’t create the resource itself, and your plan will fail if you reference nonexistent data or infrastructure.
- Data sources allow data to be fetched or computed for use elsewhere in Terraform configuration.
- External data sources must return information in JSON format.
This may include:
- Configuration data from Consul
- Information about the state of manually-configured infrastructure components
- Another Terraform configuration
- Defined outside of Terraform
- Defined by another separate Terraform configuration.
data "azurerm_virtual_machine" "example" {
name = "simple-vm"
resource_group_name = "demo"
}
output "virtual_machine_id" {
value = data.azurerm_virtual_machine.example.id
}
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-20230325"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
data "aws_availability_zones" "available" {
state = "available"
}
output "virtual_machine_id" {
value = data.aws_availability_zones.available.names[0]
}
output "virtual_machine_id1" {
value = data.aws_availability_zones.available.names[1]
}
output "ips_with_list_interpolation" {
value = [ for name in data.aws_availability_zones.available.names : name ]
}
resource "aws_instance" "first-ec2" {
ami = data.aws_ami.ubuntu.id # us-west-2
instance_type = "t2.micro"
tags = {
Name = "RajeshKumar"
}
}
** In this case, we can use the aws_ami data source to obtain information about the most recent AMI image **
that has the name prefix app-.
data "aws_ami" "app_ami" {
most_recent = true
filter {
name = "name"
values = ["app-*"]
}
}
Data sources export attributes, just like resources do. We can interpolate these attributes using the syntax data.TYPE.NAME.ATTR. In our example, we can interpolate the value of the AMI ID as data.aws_ami.app_ami.id, and pass it as the ami argument for our aws_instance resource.
resource "aws_instance" "app" {
ami = "${data.aws_ami.app_ami.id}"
instance_type = "t2.micro"
}
data "azurerm_virtual_machine" "example" {
name = "myVM"
resource_group_name = "myResourceGroup"
}
output "virtual_machine_id" {
value = data.azurerm_virtual_machine.example.id
}
# name - Specifies the name of the Virtual Machine.
# resource_group_name - Specifies the name of the resource group the Virtual Machine is located in.
data "aws_ami" "app_ami" {
most_recent = true
owners = ["self"]
filter {
name = "name"
values = ["HelloWorld"]
}
}
resource "aws_instance" "app" {
ami = "${data.aws_ami.app_ami.id}"
instance_type = "t2.micro"
}
# AWS Image named with "HelloWorld" must be there in your account.
Here’s an example of using the AWS data source in Terraform to retrieve information about an existing Amazon S3 bucket
In this example, we’re using the aws_s3_bucket
data source to retrieve information about an existing S3 bucket named example-bucket
. We’re then outputting several attributes of the bucket using the output
block.
The aws_s3_bucket
data source retrieves the specified bucket’s attributes such as bucket
, region
, arn
, policy
, id
, acceleration_status
, versioning
, website_domain
, website_endpoint
, and logging
as per the below documentation. https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/s3_bucket
data "aws_s3_bucket" "example" {
bucket = "example-bucket"
}
output "bucket_name" {
value = data.aws_s3_bucket.example.bucket
}
output "bucket_region" {
value = data.aws_s3_bucket.example.region
}
output "bucket_arn" {
value = data.aws_s3_bucket.example.arn
}
output "bucket_policy" {
value = data.aws_s3_bucket.example.policy
}
Here’s an example of using the AWS data source in Terraform to retrieve information about an existing availability zone
In this example, we’re using the aws_availability_zone
data source to retrieve information about the availability zone named us-west-2a
in the US West (Oregon) region. We’re then outputting the zone_id
and zone_name
attributes of the availability zone using the output
block.
The aws_availability_zone
data source retrieves the specified availability zone’s attributes such as zone_id
, zone_name
, region_name
, and opt_in_status
as per the below documentation. https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/availability_zone
data "aws_availability_zone" "example" {
state = "available"
name = "us-west-2a"
}
output "zone_id" {
value = data.aws_availability_zone.example.zone_id
}
output "zone_name" {
value = data.aws_availability_zone.example.zone_name
}










I’m a DevOps/SRE/DevSecOps/Cloud Expert passionate about sharing knowledge and experiences. I am working at Cotocus. I blog tech insights at DevOps School, travel stories at Holiday Landmark, stock market tips at Stocks Mantra, health and fitness guidance at My Medic Plus, product reviews at I reviewed , and SEO strategies at Wizbrand.
Please find my social handles as below;
Rajesh Kumar Personal Website
Rajesh Kumar at YOUTUBE
Rajesh Kumar at INSTAGRAM
Rajesh Kumar at X
Rajesh Kumar at FACEBOOK
Rajesh Kumar at LINKEDIN
Rajesh Kumar at PINTEREST
Rajesh Kumar at QUORA
Rajesh Kumar at WIZBRAND