If you are using Route53 for DNS, it is pretty easy to update a route 53 DNS record with your current IP address as a dynamic DNS service. Here is a script that does so. It
- Looks up your current IP address
- Looks up the IP address in DNS for your host name
- Uses the AWS command line client to update the DNS record if it needs to be changed
#!/bin/bash
set -e
# The host name for which you want to change the DNS IP address
hostname=mydynamichost.example.com
# The AWS id for the zone containing the record, obtained by logging into aws route53
zoneid=XYZABC123
# The name server for the zone, can also be obtained from route53
nameserver=ns-001.awsdns-01.com
# Optional -- Uncomment to use the credentials for a named profile
#export AWS_PROFILE=examplecom
# Get your external IP address using opendns service
newip=`dig +short myip.opendns.com @resolver1.opendns.com`
if [[ ! $newip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
then
echo "Could not get current IP address: $newip"
exit 1
fi
# Get the IP address record that AWS currently has, using AWS's DNS server
oldip=`dig +short "$hostname" @"$nameserver"`
if [[ ! $oldip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
then
echo "Could not get old IP address: $oldip"
exit 1
fi
# Bail if everything is already up to date
if [ "$newip" == "$oldip" ]
then
exit 0
fi
# aws route53 client requires the info written to a JSON file
tmp=$(mktemp /tmp/dynamic-dns.XXXXXXXX)
cat > ${tmp} << EOF
{
"Comment": "Auto updating @ `date`",
"Changes": [{
"Action": "UPSERT",
"ResourceRecordSet": {
"ResourceRecords":[{ "Value": "$newip" }],
"Name": "$hostname",
"Type": "A",
"TTL": 300
}
}]
}
EOF
echo "Changing IP address of $hostname from $oldip to $newip"
aws route53 change-resource-record-sets --hosted-zone-id $zoneid --change-batch "file://$tmp"
rm "$tmp"
This is based on the code from Will Warren but it has some changes:
- It doesn't rely on a local file to store what the set the IP address, it looks it up from the AWS DNS server
- It has fewer configuration options at the top (just three required and one optional)
- It doesn't do any logging, it simply exits with no output or prints changes to stdout. This makes it more suitable for running from cron with emailed output
- The code has been cleaned up and streamlined
It can then be put into a crontab. For example create /etc/cron.d/dynamicdns
to execute it once an hour:
MAILTO=me@example.com
49 * * * * root /opt/dynamicdns.sh
Prerequisites:
- Install
bash
anddig
- Use route53
- Set up the AWS command line client
4 thoughts on “Updating Route53 DNS dynamically”
should use this to find current IP: curl http://169.254.169.254/2014-02-25/meta-data/public-ipv4
from here: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
The openDNS query will find the current IP address of your router. What you link to looks like it will find the current IP address of your AWS resource.
Any idea how to make this work for several hostnames at the same time? Same domain. I can get it to work with 2 or 3, but not like 5 or 6.
If they are all pointing to the same IP address and they are all subdomains (not domain apex records), you could set up CNAME records for all but one of them. Then you could update a single record.