Fetch zone_id of hosted domain on route53 using terraform

Viewed 5703

Hi I am creating route53 record with terraform, I already have a hosted domain (public) lets say example.com how to fetch its zone_id and attach to record. How can I fetch the zone_id of existing route53 hosted zone. I have written a file but what it does it creates another hosted zone example.com rather then fetching existing example.com

resource "aws_route53_zone" "main" {
  name = "example.com"
}

resource "aws_route53_record" "www" {
  zone_id = data.aws_route53_zone.selected.zone_id 
  name    = "dev.${data.aws_route53_zone.selected.name}"
  type    = "A"
  alias {
    name                   = var.alb_dns
    zone_id                = var.zone_id
    evaluate_target_health = false
  }
}
3 Answers

In terraform, data sources can be used to retrieve information at runtime. The AWS provider includes a data source for route53 zones. Here is an example of its usage:

data "aws_route53_zone" "selected" {
  name         = "test.com."
}

resource "aws_route53_record" "www" {
  zone_id = data.aws_route53_zone.selected.zone_id 
  name    = "dev.${data.aws_route53_zone.selected.name}"
  type    = "A"
  alias {
    name                   = var.alb_dns
    zone_id                = var.zone_id
    evaluate_target_health = false
  }
}

You need to add private_zone = false too

data "aws_route53_zone" "selected" {
  name         = "test.com."
private_zone = false
}

resource "aws_route53_record" "www" {
  zone_id = data.aws_route53_zone.selected.zone_id 
  name    = "dev.${data.aws_route53_zone.selected.name}"
  type    = "A"
  alias {
    name                   = var.alb_dns
    zone_id                = var.zone_id
    evaluate_target_health = false
  }
}

Re-requirements:

  • I already have Hosted Zone (region: global at AWS)
  • I want to $(teraform output) Hosted Zone Id for further use in configs

Solution:

  1. create an empty resource:
resource "aws_route53_zone" "non-prod-zone" {}
  1. import recourse
terraform import aws_route53_zone.non-prod-zone YOUR_HOSTED_ZONE_ID
  1. argument your resource with name
resource "aws_route53_zone" "non-prod-zone" {
  name = var.non_prod_hosted_zone
}
  1. $(terraform refresh) will output your variable
Outputs:

hosted_zone_test_envs_id = YOUR_HOSTED_ZONE_ID
Related