Terraform Tutorial — AWS Data Source Examples

1 minute read

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.


← Data Source Syntax Filtering Data Sources →