devxvda1
devxvda1

Reputation: 462

AWS Python SDK | Route 53 - delete resource record

How to delete a DNS record in Route 53? I followed the documentation but I still can't make it work. I don't know if I'm missing something here.

Based on the documentation:

DELETE : Deletes a existing resource record set that has the specified values for Name , Type , SetIdentifier (for latency, weighted, geolocation, and failover resource record sets), and TTL (except alias resource record sets, for which the TTL is determined by the AWS resource that you're routing DNS queries to).

But I'm always getting this error:

Traceback (most recent call last):                                                                                                                                      
  File "./test.py", line 37, in <module>                                                                                                                                
    main()                                                                                                                                                              
  File "./test.py", line 34, in main                                                                                                                                    
    print(del_record())                                                                                                                                                 
  File "./test.py", line 23, in del_record                                                                                                                              
    'TTL': 300                                                                                                                                                          
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/botocore/client.py", line 251, in _api_call                                       
    return self._make_api_call(operation_name, kwargs)                                                                                                                  
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/botocore/client.py", line 537, in _make_api_call                                  
    raise ClientError(parsed_response, operation_name)                                                                                                                  
botocore.exceptions.ClientError: An error occurred (InvalidInput) when calling the ChangeResourceRecordSets operation: Invalid request 

Here's my code:

#!/usr/bin/env python3


import boto3

r53 = boto3.client('route53')
zone_id = 'ABCDEFGHIJKLMNO'
record = 'me.domain.com'
r_type = 'CNAME'
r_val = 'google.com'


def del_record():
    response = r53.change_resource_record_sets(
        HostedZoneId=zone_id,
        ChangeBatch={
            'Changes': [
                {
                    'Action': 'DELETE',
                    'ResourceRecordSet': {
                        'Name': record,
                        'Type': r_type,
                        'TTL': 300
                    }
                }
            ]
        }
    )

    return response


def main():
    print(del_record())

if __name__ == '__main__':
    main()

Upvotes: 7

Views: 8382

Answers (2)

barryku
barryku

Reputation: 2574

Adding ResourceRecords still get me error saying the record can't be found. Instead of constructing the record object manually that might still miss required elements, finding the record first, then pass the record to the method.

import boto3

aws_profile = '...'
zone_id = 'Z2A....'

session = boto3.Session(profile_name=aws_profile)
route53 = session.client('route53')

record_to_delete = None
delete_name = '....net'
response = route53.list_resource_record_sets(HostedZoneId=zone_id, StartRecordName=delete_name, MaxItems='1')

print('deleting: ' + delete_name)
if delete_name in response['ResourceRecordSets'][0]['Name']:
    record_to_delete = response['ResourceRecordSets'][0]
    route53.change_resource_record_sets(
        HostedZoneId=zone_id,
        ChangeBatch={
            'Changes': [{
                'Action': 'DELETE',
                'ResourceRecordSet': record_to_delete
            }]
        }
    )
    print('deleted: ' + record_to_delete['Name'])
    
else:
    print('record not found: ' + delete_name)

Upvotes: 3

Daniel Scott
Daniel Scott

Reputation: 7903

You need a nested 'ResourceRecords' array in the ResourceRecordSet, which has the current 'target' value of the record.

    HostedZoneId=zone_id,
    ChangeBatch={
        'Changes': [
            {
                'Action': 'DELETE',
                'ResourceRecordSet': {
                    'Name': record,
                    'Type': r_type,
                    'TTL': 300,
                    'ResourceRecords': [
                        {
                            'Value': target
                        }
                    ]
                }
            }
        ]
    }

Upvotes: 10

Related Questions