Terraform Tutorial — AWS Data Source Examples
Here are the most common AWS data sources you’ll use in real projects.
aws_ami — Find an AMI
data "aws_ami" "amazon_linux" {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["al2023-ami-*-x86_64"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
}
resource "aws_instance" "web" {
ami = data.aws_ami.amazon_linux.id
instance_type = "t3.micro"
}
aws_availability_zones — List AZs
data "aws_availability_zones" "available" {
state = "available"
}
output "az_list" {
value = data.aws_availability_zones.available.names
# ["us-east-1a", "us-east-1b", "us-east-1c", ...]
}
Use AZs dynamically for subnets:
resource "aws_subnet" "public" {
count = 2
vpc_id = aws_vpc.main.id
cidr_block = cidrsubnet(aws_vpc.main.cidr_block, 8, count.index)
availability_zone = data.aws_availability_zones.available.names[count.index]
}
aws_vpc — Look Up Existing VPC
data "aws_vpc" "production" {
tags = {
Environment = "production"
}
}
resource "aws_subnet" "new_subnet" {
vpc_id = data.aws_vpc.production.id
cidr_block = "10.0.100.0/24"
}
aws_caller_identity — Current AWS Account
data "aws_caller_identity" "current" {}
output "account_id" {
value = data.aws_caller_identity.current.account_id
}
output "caller_arn" {
value = data.aws_caller_identity.current.arn
}
aws_region — Current Region
data "aws_region" "current" {}
output "region_name" {
value = data.aws_region.current.name
# "us-east-1"
}
aws_iam_policy — Reference Managed Policy
data "aws_iam_policy" "admin" {
name = "AdministratorAccess"
}
resource "aws_iam_role_policy_attachment" "admin" {
role = aws_iam_role.main.name
policy_arn = data.aws_iam_policy.admin.arn
}
What’s Next?
Let’s learn how to filter data sources with complex conditions.