We have to modify like 50 IP addresses and TTL’s for a client and the obvious solution is LET’S AUTOMATE IT, so since they are using AWS Route 53, I looked up the docs and threw together the following little piece of heaven.
#!/usr/bin/env python
"""
Automation for City of XXX
to accomplish the following:
1. Update TTL
2. Modify A records from 1.2.3.x to 2.3.4.x
"""
from boto3.session import Session
import boto3, json, re
def init_boto3():
"""
instantiate session object for use of
boto api - this determines which user
"""
session = Session(
aws_access_key_id='',
aws_secret_access_key='',
region_name='',
)
if session:
return session
def get_current_zones(client):
"""
Returns list of current hosted zones for
configured amazon account
"""
return client.list_hosted_zones()
def get_current_records(client, record_id):
"""
Returns list of Records for given HostedZoneId
"""
return client.list_resource_record_sets(
HostedZoneId=record_id,
)['ResourceRecordSets']
def get_new_ip(records):
"""
Filters only A records from Record Set
"""
for record in records:
if record['Type'] == 'A':
match = re.search(r'(1\.2\.3)\.(\d+)', record['ResourceRecords'][0]['Value'])
if match:
if match.group(1) == '1.2.3':
new_ip = '2.3.4.{}'.format(match.group(2))
return new_ip
def modify_record(client, zone_name, zone_id, new_ip, ttl=600):
"""
Modifies a given resource record set for
HostedZoneId
"""
result = client.change_resource_record_sets(
HostedZoneId=zone_id,
ChangeBatch={
'Comment': 'Modification by Marie H.',
'Changes': [
{
'Action': 'UPSERT',
'ResourceRecordSet': {
'TTL': ttl,
'Name': zone_name,
'Type': 'A',
'ResourceRecords': [
{
'Value': new_ip
},
]
}
},
]
}
)
print("Updated {}: new IP {}".format(zone_name, new_ip))
return result
if __name__ == '__main__':
# Setup Route 53 Session
session = init_boto3()
client = session.client('route53')
# Get all Hosted Zones
zones = get_current_zones(client)
# Get records for each zone
for zone in zones['HostedZones']:
records = get_current_records(client, zone['Id'])
new_ip = get_new_ip(records)
if new_ip:
print(" * Updating Zone for {}".format(zone['Name']))
modify_record(client, zone['Name'], zone['Id'], new_ip)
else:
print(" * Hosted Zone did not match IP")
So with the above you get a great overview of the things you can do with boto3 and route53, from retrieving records to updating records.
Example output:
* Updating Zone for cityofxxx.gov.
Updated cityofxxx.gov.: new IP 2.3.4.101
* Updating Zone for mail.cityofxxx.gov.
Updated mail.cityofxxx.gov.: new IP 2.3.4.102
* Hosted Zone did not match IP
* Updating Zone for api.cityofxxx.gov.
Updated api.cityofxxx.gov.: new IP 2.3.4.105
