How to fetch the AWS Route53 hosted zone id?

11,567

Solution 1

You can use listHostedZones or listHostedZonesByName to interrogate the service about your hosted zones.

However... You really need to already know the hosted zone ID -- store or cache it -- because it's possible to create more than one hosted zone in Route 53 for exactly the same domain... and if your code blindly searched for the hosted zone by domain name, you could end up modifying the wrong one... particularly if you fall into the antipattern trap of assuming only one match is possible, and therefore you always select the first match.

Simple deployments will only have one hosted zone for each domain name, but reasons you might have more than one would include private hosted zones (accessible only from inside your VPC) or duplicate public hosted zones, where you are doing a DNS rebuild or hard cutover. Route 53 allows you to create a second (or third, etc.) hosted zone with 4 different name servers.

Also, of course, it makes sense to have this information locally to avoid making unnecessary API requests, which can cost time and money. The hosted zone id is, as you likely noticed, also visible in the console.

Solution 2

I use the AWS CLI and pipe the JSON results to the jq tool:

aws route53 list-hosted-zones-by-name | 
jq --arg name "example.com." \
-r '.HostedZones | .[] | select(.Name=="\($name)") | .Id'

The jq expression selects each hosted zone JSON item that contains the name "example.com". Heads up that this may return more than one record.

The output is the matching hosted zone id strings such as:

/hostedzone/ABCDEF12345678

You can then list resource record sets for a hosted zone id:

aws route53 list-resource-record-sets \
--hosted-zone-id "/hostedzone/ABCDEF12345678"
Share:
11,567
Shaonline
Author by

Shaonline

Updated on July 18, 2022

Comments

  • Shaonline
    Shaonline almost 2 years

    I am newbie to Amazon Services and their API.

    Using Amazon route53Clinet class, I know there is a method getHostedZone which get the Hosted Zone information on the basis of ID. But I have a case where I have the domain name and i need to fetch the hosted zone id may be on the basis of the provided domain name? How can i do that?

  • Shaonline
    Shaonline about 8 years
    public ListHostedZonesByNameResult listZones(String CNAME){ ListHostedZonesByNameResult zonesResult = new ListHostedZonesByNameResult(); zonesResult = route53Client.listHostedZonesByName(new ListHostedZonesByNameRequest().withDNSName(CNAME)); return zonesResult; } listing hosted zone with using the 'withDNSName()' method didn't return the hosted zone information for the given DNSName. how can i list one specific hosted zone based on DNSName? I understand i couldn't be a good idea but still if i want to?? how can i do that?
  • Michael - sqlbot
    Michael - sqlbot about 8 years
    You need to use the domain name at the top of the zone, not one of the source records inside the domain... e.g. example.com, not foo.bar.example.com.
  • Nirav Joshi
    Nirav Joshi over 4 years
    Please add description in answer.
  • vikas027
    vikas027 over 2 years
    Instead of jq, I would use aws CLIs inbuilt query feature aws route53 list-hosted-zones-by-name --dns-name example.com --query "HostedZones[].Id" --output text